将 --out-format=FMT 参数从 Bourne shell 脚本传递给 rsync

将 --out-format=FMT 参数从 Bourne shell 脚本传递给 rsync

我试图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.cfile2.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失败。

相关内容