我编写了以下 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"
:始终在变量和命令替换两边加上双引号。
另一个潜在的问题是//
路径的开头可能会被特殊解释。通常路径中的连续斜杠相当于一个斜杠,但是以两个斜杠开头的路径在某些系统上具有特殊含义。