【发布时间】:2019-05-04 19:27:33
【问题描述】:
我正在编写一个 bash 脚本来使用 rsync 将文件从我的本地机器复制到远程服务器。我本地机器上的文件夹名称“本地文件夹”中有一个空格;我不知道这是否有什么不同。
如果我把它写成纯文本,它可以工作:
rsync -arv --filter=":- .gitignore" /local\ folder/path/ user@123.4.5.6:~/
我想将源路径和目标路径作为变量,但我无法让它工作。我尝试的第一件事是:
SOURCE="/local\ folder/path/"
DESTINATION="user@123.4.5.6:~/"
rsync -arv --filter=":- .gitignore" $SOURCE $DESTINATION
我看到了这个错误:
rsync: change_dir "/local folder/path//~" failed: No such file or directory (2)
这似乎是a)同时运行源和目标,b)看不到服务器地址。
我尝试了多种变体,包括大括号:
rsync -arv --filter=":- .gitignore" ${SOURCE} ${DESTINATION}
使用引号:
rsync -arv --filter=":- .gitignore" "${SOURCE}" "${DESTINATION}"
并将选项放入数组中:
OPTIONS=( --protect-args -arv --filter=":- .gitignore")
rsync "${OPTIONS[@]}" ${SOURCE} ${DESTINATION}
我在https://www.shellcheck.net/查看后也试过这个
#!/bin/bash
SOURCE="/folder name/path"
DESTINATION=user@123.4.5.6:~/
rsync -arv --filter=":- .gitignore" "$SOURCE" $DESTINATION
还有:
#!/bin/bash
SOURCE="/folder\ name/path"
DESTINATION=user@123.4.5.6:~/
rsync -arv --filter=":- .gitignore" "$SOURCE" $DESTINATION
每次我得到同样的错误。我在这里缺少什么简单的东西?我查看了各种示例,包括:
https://www.redpill-linpro.com/sysadvent/2015/12/03/rsync-tricks.html https://serverfault.com/questions/354112/rsync-and-bash-command-substitution
空间不是问题,或者至少不是唯一的问题。我已经尝试按照here的建议在我的变量名周围使用双引号
谢谢!
【问题讨论】:
-
您提供的代码生成three Shellcheck findings。另见How to use Shellcheck、How to debug a bash script? (U&L.SE)、How to debug a bash script? (SO)、How to debug bash script? (AskU)、Debugging Bash scripts 等。
-
行情很重要。
"$SOURCE"-- 因为shellcheck.net 会告诉你链接到SC2086。 -
(并不是说对自己的变量使用全大写名称是一种好的形式——POSIX 将操作系统和内置的、POSIX 指定的实用程序限制为仅使用全大写名称它们自己的用途,保留小写名称供应用程序使用而不会造成无意的冲突)。请参阅pubs.opengroup.org/onlinepubs/9699919799/basedefs/…,第四段,记住 shell 和环境变量共享一个命名空间。
-
感谢您的建议,但到目前为止没有任何效果。我不确定空间是否存在问题。为什么错误中没有显示远程服务器名称?
-
(顺便说一句,我对将其描述为“the”答案有一点问题——如果你修复了波浪号的引用而不是扩展时缺少的引号,你仍然会有
/local folder/分为两个参数,/local和folder/)。