当引用带有空格的路径时,例如Steve Jobs
,当路径是本地目录时,我可以使用反斜杠转义,或者用引号括起来:
rsync Steve\ Jobs user@remote:/
或者
rsync "Steve Jobs" user@remote:/
但是,当Steve Jobs
是远程目录时,用引号括起来是不够的。我还必须用反斜杠转义空格:
rsync user@remote:/"Steve\ Jobs" .
有人知道为什么会发生这种奇怪的现象吗?
如果这是 SSH 的产物,那么为什么 SSH 会出现这种奇怪的现象?
答案1
rsync
将引号内的字符串传递给远程计算机。如果您对引号中的空格进行转义,则该反斜杠将成为字符串的一部分(它不会被您的 shell 所接受)。
这rsync
手册页指的是逃避:
如果需要传输包含空格的文件名,您可以指定
--protect-args
(-s
) 选项,或者您需要以远程 shell 能够理解的方式转义空格。例如:
CWrsync -av host:'file\ name\ with\ spaces' /dest
你可以使用如下简单脚本来查看 shell 如何处理(或不处理)特殊字符:
#!/bin/sh
n=1
echo "$@"
for i in "$@"
do
echo "$n:$i"
n=`expr $n + 1`
done
调用args
:
$ args "xx\ yy"; args "xx yy"
xx\ yy
1:xx\ yy
xx yy
1:xx yy
由于rsync
不添加引号(除非使用-s
),因此在作为 shell 命令的一部分发送到另一台机器时,必须对空格进行特殊处理。