Bash rsync脚本出错

前端之家收集整理的这篇文章主要介绍了Bash rsync脚本出错前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
bash脚本具有以下行
rsync $OPTS $BACKDIR $USER@$DEST:$DESTDIR

但其中一个选项是rsh =’ssh -p2222′
它抱怨说:

rsync: -p2222': unknown option
    rsync error: Syntax or usage error (code 1) at main.c(1425) [client=3.0.7]

但是当我将脚本更改为:

echo rsync $OPTS $BACKDIR $USER@$DEST:$DESTDIR

并手动运行它工作的打印命令.

请指教

简答:见 BashFAQ #50.

答案很长:将命令(或命令的一部分)放入变量中,然后将它们完整地取出是很复杂的.当shell在命令行上扩展变量时,如果变量是双引号,则不解析它(参见@Dennis Williamson的答案);如果它不在引号中,则其中的空格将被解析为参数中断,但不会解析引号和转义(这就是为什么在rsync中的某个args中出现了关于文字引号的错误).在任何一种情况下,将引号放在变量的值中没有任何用处.

但是,有几种方法可以修复脚本,具体取决于OPTS的复杂程度:

>如果–sh是OPTS中唯一的东西,那么双引它(如Dennis Williamson的回答):

OPTS='--rsh=ssh -p2222'
rsync "$OPTS" "$BACKDIR" "$USER@$DEST:$DESTDIR"

(注意其他args周围的双引号:这是为了防止错误,如果它们包含空格,并且通常是良好的脚本卫生.)
>如果OPTS的内容是常量(或至少是–rsh部分),那么不要试图将它放在变量中,只需直接使用它:

rsync --rsh='ssh -p2222' $RESTOFOPTS "$BACKDIR" "$USER@$DEST:$DESTDIR"

>如果这些简单情况都不适用,请使用数组而不是普通变量:

OPTS=(-x --delete --inplace)
if [[ "$rsync_version" == 2.* ]]; then
    OPTS+=(-aE)
else
    OPTS+=(-aNHX)
fi
if [[ -n "$using_rsh" ]]; then
    OPTS+=('--rsh=ssh -p2222')
fi
rsync "${OPTS[@]}" "$BACKDIR" "$USER@$DEST:$DESTDIR"
原文链接:https://www.f2er.com/bash/385503.html

猜你在找的Bash相关文章