目前我有一个rsync命令,由于网络状况不佳,每15分钟失败一次。我编写了一个脚本来重新运行rsync,但是脚本没有按预期工作,因为bash无意中破坏了我传入的命令:
$ cat exit-trap.sh
#!/bin/bash
count=1
while :
do
echo ==============
echo Run \#$count
$@
if [[ $? -eq 0 ]] ; then
exit
fi
echo Run \#$count failed
let count++
sleep 15
done
$ ./exit-trap.sh rsync --output-format="@ %i %n%L" source::dir target
==============
Run #1
Unexpected remote arg: source::dir
rsync error: syntax or usage error (code 1) at main.c(1348) [sender=3.1.1]
经过一段时间的探索之后,我想在argv中收到的rsync是`[" rsync"," - output-format = @","%i& #34;,"%n%L"," source :: dir"," target"]。输出格式无意中被无意地拆分成单个部分,导致语法错误。有没有办法解决这个问题?
PS:到目前为止,我还尝试了sh -c $@
,sh -c \"$@\"
和
./exit-trap.sh rsync --output-format=\"@ %i %n%L\" source::dir target
./exit-trap.sh rsync --output-format=\\\"@ %i %n%L\\\" source::dir target
./exit-trap.sh "rsync --output-format=\"@ %i %n%L\" source::dir target"
这些都不起作用。
答案 0 :(得分:3)
您需要使用此处https://www.gnu.org/software/bash/manual/html_node/Special-Parameters.html#Special-Parameters所述的"$@"
:
($ @)从1开始扩展到位置参数。当扩展发生在双引号内时,每个参数都会扩展为单独的单词。也就是说,“$ @”相当于“$ 1”“$ 2”....