我试图rsync
从 Bourne shell 脚本执行(阅读:Bash 扩展不可用),经过大量搜索、单/双引号组合、转义等后,我无法正确传递参数--out-format='%n'
。
例如,这个脚本:
#!/bin/sh
(set -x ; $(rsync -auh --delete --out-format='%n' "$1" "$2")) || exit 1
在 MacOS 10.12.6 上调用时./myscript.sh dir1/ dir2/
会返回以下输出:
++ rsync -auh --delete --out-format=%n dir1/ dir2/
+ ./ file1.c file1.h file2.c file2.h
myscript.sh: line 3: ./: is a directory
其中file1.c
file1.h
file2.c
和file2.h
的内容是dir1/
首先,我不知道为什么+ ./ file1.c file1.h file2.c file2.h
输出该行,因为--out-format='%n'
每行输出一个文件,而不是同一行上的所有文件。此外,神秘的开始./
似乎是错误的原因(或结果)。
如果我--out-format='%n'
从脚本中删除,那么它运行良好,没有错误。
如果我从终端执行该命令,无论参数中带单引号还是不带单引号(--out-format='%n'
和--out-format=%n
),它都可以正常运行。在脚本上时,在两种情况下都会失败。
什么可能导致此错误?
答案1
您正在rsync
命令替换中运行该命令。命令替换将被其中命令的输出所替换,并且根据脚本的编写方式,此输出将作为命令执行,这就是为什么您会收到该错误消息和看似奇怪的跟踪输出。
反而:
#!/bin/sh -x
rsync -auh --delete --out-format='%n' "$1" "$2" || exit 1
如果您仍然希望set -x
在脚本中的子 shell 中使用:
#!/bin/sh
( set -x; rsync -auh --delete --out-format='%n' "$1" "$2" ) || exit 1
如果是脚本中的最后一个命令,则可能exit 1
会被删除,rsync
因为脚本的退出状态将是最后执行的命令的退出状态,除非您想强制它成为确切地1、无论多么rsync
失败。