【问题标题】:Rsync syntax error when run from bash script从 bash 脚本运行时出现 Rsync 语法错误
【发布时间】:2014-03-28 15:00:36
【问题描述】:

我一直在编写一个使用 rsync 进行增量备份的备份脚本。

我已经手动测试了以下 rsync 命令,它运行并完成备份没有错误:

rsync -aAXv --delete --progress --link-dest=/backup/Uyuk/Uyuk-backup-part1/2014-02-24/ /mnt/backup/ /backup/Uyuk/Uyuk-backup-part1/2014-02-25/

但是,当我在备份脚本中运行相同的命令时,会出现以下错误:

rsync: -aAXv --delete --progress --link-dest=/backup/Uyuk/Uyuk-backup-part1/2014-02-24/ /mnt/backup/ /backup/Uyuk/Uyuk-backup-part1/2014-02-25/: unknown option
rsync error: syntax or usage error (code 1) at main.c(1422) [client=3.0.6]

我在我的脚本上运行了 bash -x 以确定发送到控制台的确切内容,这是打印的内容:

+ rsync '-aAXv --delete --progress --link-dest=/backup/Uyuk/Uyuk-backup-part1/2014-02-24/ /mnt/backup/ /backup/Uyuk/Uyuk-backup-part1/2014-02-25/'

有谁知道出了什么问题?我找不到任何会导致语法错误的东西。

编辑: 这是我在脚本中的实际代码,这是一个非常大的脚本,所以是的,这里没有定义一些变量,但你明白了。

mkdir -p "/backup/$HOST/$NAME/$TODAY"
#source directory
SRC="$MNT"
#link directory
LNK="/backup/$HOST/$NAME/$LAST/"
#target directory
TRG="/backup/$HOST/$NAME/$TODAY/"
#rsync options
OPT1="-aAXv --delete --progress --link-dest=$LNK"

#run the rsync command
echo "rsync $OPT1 $SRC $TRG"
rsync "$OPT1 $SRC $TRG" > /var/log/backup/backup.rsync.log 2>&1

【问题讨论】:

  • 为什么在您的脚本的bash -x 输出中的rsync 选项周围有单引号?您能否在问题中包含您用来调用rsync 的准确陈述?
  • 通常一个前导 + 符号和单引号字符串是 set -x 显示带有所有 var 扩展和字符串引用的行的方式,其中所有 "..." 现在都“归结”为'...'(单引号字符串)。我认为缺少某些东西是对的,我猜 O.P. 正在做类似rOpts="-aXV --delete..."; rsync "$rOpts" 的事情。因此出现错误消息unknown option,祝大家好运。
  • 我更新并包含了用于运行 rsync 命令的代码。

标签: bash syntax rsync


【解决方案1】:

@chepner 建议的方法不适用于我的 Mac OS X (10.9.4),但 eval 可以。

eval rsync "$OPT1 $SRC $TRG"

【讨论】:

    【解决方案2】:

    您将选项列表作为单个参数传递,当它需要作为参数的列表 传递时。通常,您应该使用bash 中的数组来保存您的参数,以防其中任何一个包含空格。请尝试以下操作:

    mkdir -p "/backup/$HOST/$NAME/$TODAY"
    #source directory
    SRC="$MNT"
    #link directory
    LNK="/backup/$HOST/$NAME/$LAST/"
    #target directory
    TRG="/backup/$HOST/$NAME/$TODAY/"
    #rsync options
    OPTS=( "-aAXv" "--delete" "--progress" "--link-dest=$LNK" )
    
    #run the rsync command
    echo "rsync $OPT1 $SRC $TRG"
    rsync "${OPTS[@]}" "$SRC" "$TRG" > /var/log/backup/backup.rsync.log 2>&1
    

    数组扩展${OPTS[@]} 被引用时,被特别视为一系列参数,每个参数单独引用以保留单个元素中的任何空格或特殊字符。如果arr=("a b" c d),则echo "${arr[@]}"

    echo "a b" "c" "d"
    

    而不是

    echo "a b c d"
    

    这在不支持数组的 shell 中不起作用,但是后来发明了数组,因为没有一种安全的方法(即不使用 eval)来处理没有它们的用例。

    【讨论】:

      【解决方案3】:

      这个:

      rsync "$OPT1 $SRC $TRG"
      

      将所有你想要的参数集中在一起作为一个参数传递,rsync 不知道如何处理。

      试试这个:

      rsync ${OPT1} ${SRC} ${TRG}
      

      【讨论】:

        猜你喜欢
        • 2016-08-19
        • 2022-01-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-02
        相关资源
        最近更新 更多