为什么有时我必须在 rsync 路径中使用双倍转义空格?

为什么有时我必须在 rsync 路径中使用双倍转义空格?

当引用带有空格的路径时,例如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 命令的一部分发送到另一台机器时,必须对空格进行特殊处理。

相关内容