![为什么有时我必须在 rsync 路径中使用双倍转义空格?](https://linux22.com/image/1471860/%E4%B8%BA%E4%BB%80%E4%B9%88%E6%9C%89%E6%97%B6%E6%88%91%E5%BF%85%E9%A1%BB%E5%9C%A8%20rsync%20%E8%B7%AF%E5%BE%84%E4%B8%AD%E4%BD%BF%E7%94%A8%E5%8F%8C%E5%80%8D%E8%BD%AC%E4%B9%89%E7%A9%BA%E6%A0%BC%EF%BC%9F.png)
当引用带有空格的路径时,例如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 命令的一部分发送到另一台机器时,必须对空格进行特殊处理。