Bash 函数 scp 文件不起作用

Bash 函数 scp 文件不起作用

我编写了以下 bash 函数:

function to_company() 
{
    scp ${1} [email protected]://home/username 
}

当我做:

$ to_company code_diff.txt 

它要求输入密码,然后失败并显示以下消息:

scp: //home/username: not a regular file 

我尝试在脚本中给出//home/username/&但得到了相同的结果。//home/username/${1}

如果我手动执行上述命令并传递code_diff.txt代替${1},文件传输不会出现问题。

我犯了什么错误?

答案1

这并不重要,但远程路径应该是/home/username(单正斜杠)。正如 sputnick 指出的那样,用 引用你${1}"${1}"

我复制了相同的命令,并且在测试时它有效,所以我怀疑(考虑到“不是常规文件”错误)您在[email protected]:和之间有额外的空格//home/username

另一件要尝试的事情是添加调试(通过-v在 scp 命令上提供)并查看是否提供任何线索:

function to_company() 
{
    scp -v "${1}" [email protected]:/home/username 
}

答案2

你正在以错误的方式处理这个问题。不要编写 shell 包装器,而是在~/.ssh/config.

Host work
Hostname long.server.name.company.com
User bob

然后,要将文件复制到您公司的服务器:

scp filename.ext work:

远程路径是相对于您的主目录的,因此work:work:/home/username.


如果您传递的参数包含空格或通配符,您的函数将会失败\[?*。通过将参数扩展放在双引号中可以轻松解决这个问题"$1"始终在变量和命令替换两边加上双引号

另一个潜在的问题是//路径的开头可能会被特殊解释。通常路径中的连续斜杠相当于一个斜杠,但是以两个斜杠开头的路径在某些系统上具有特殊含义

相关内容