使用波浪号〜在一个简单的函数包装器周围的问题

我想在我的.bashrc中放置一个简单的bash函数,通过接受'source'参数和'destination'参数来绕过scp命令,到目前为止,

 function send() { eval "scp $1 user@annoyingly-long-server-name:$2" } 

 function send() { scp $1 user@annoyingly-long-server-name:$2 } 

…但是当我打电话给上述任何一个拉

 send file.txt ~/ 

我得到错误scp: home-directory-on-remote-machine: Operation not supported 。 在回显每个参数之后,似乎在评估之前, 代字号被扩展到了远程机器的主目录中 。 我怎样才能防止这个?

首先,你可以使用ssh-key来防止输入密码。

在你使用你的函数之前只做一次:

 ssh-copy-id remoteHostName 

对于ssh使用密钥而不是密码被认为是更好的,对于scp来说也是如此。

其次,你不需要eval

 function send() { scp "$1" user@annoyingly-long-server-name:"$2" } 

最后,你需要使用明确的路径名称:

 send foo /home/luke/foo 

因为~是一些如何不正确的评估/home/luke/

更新,侧面的故事:

如果你写函数send的动机真的很annoyingly-long-server-name那么你应该知道/home/luke/.ssh/config 。 在这个文件里面你可以创造奇迹:

 Host a-nicer-alias Hostname stupid-host-name.verylongdoamin.com User luke 

那么你可以简单地做ssh a-nicer-alias

我想出了一个方法来从扩展的代字符转换回使用这个线程函数内的字符串~ 。 现在的功能

 function send() { dest="$2" dest="${dest/#$HOME/\~}" scp $1 user@annoyingly-long-server-name:$dest } 

在第二行中,如果字符串"$HOME"出现在第二个参数的开始处,则用波浪号代替。 如果源和目标具有相同的$HOME ,并且用户实际上明确提供了目标路径,则转换为~时不会造成任何伤害,但如果它们没有相同的$HOME ,则会修复问题。

出于某种原因,在执行字符串替换之前,似乎必须将$2分配给一个变量。