【问题标题】:Bash shell scripting rsync with variables [duplicate]带有变量的 Bash shell 脚本 rsync [重复]
【发布时间】:2018-06-09 16:29:59
【问题描述】:

我有以下 for 循环,它遍历所有需要复制的给定源。

for i in "${sources[@]}"; do
    exclude="--exclude 'exclude_folder/exclude_file'"

    rsync -az $exclude $i $destination
done

但是,排除选项不起作用。

for i in "${sources[@]}"; do
    exclude="--exclude 'exclude_folder/exclude_file'"

    rsync -az "$exclude" "$i" "$destination"
done

如果我使用上面的代码,rsync 将退出并给出一个未知选项的错误。

如果我只是使用下面的代码,它可以工作,但我想为排除选项使用一个变量。

for i in "${sources[@]}"; do
    rsync -az --exclude 'exclude_folder/exclude_file' $i $destination
done

【问题讨论】:

    标签: bash ubuntu rsync


    【解决方案1】:

    我会使用eval

    您的代码:

    for i in "${sources[@]}"; do
        exclude="--exclude 'exclude_folder/exclude_file'"
    
        rsync -az "$exclude" "$i" "$destination"
    done
    

    那时会是(我试图尽可能接近你的逻辑):

    for i in "${sources[@]}"; do
        exclude="--exclude 'exclude_folder/exclude_file'"
        rsync_command="rsync -az $exclude $i $destination"
    
        eval rsync_command
    done
    

    来自eval 手册页:

    评估

    评估几个命令/参数

    语法 eval [参数]

    参数被连接在一起形成一个命令,该命令 然后被读取并执行,它的退出状态作为退出返回 评估的状态。如果没有参数或只有空参数,则 返回状态为零。

    eval 是一个 POSIX `special' 内置

    编辑

    Gordon Davisson 关于eval 中的错误/不安全感是正确的。如果有任何其他解决方案可用,那么最好使用它。这里的 bash 数组更好。数组答案是优越的答案。

    请在Bash: need help passing a a variable to rsync

    查看答案

    【讨论】:

    • 不要使用eval——它作为晦涩难懂的错误来源享有当之无愧的声誉。数组是处理这个问题的更好方法;有关详细信息,请参阅链接的副本。
    • @GordonDavisson 您对错误(不安全感)的看法是正确的。我将链接建议的副本。
    • 这不仅仅是不安全感(即易受故意攻击);在评论here 中,Charles Duffy 说他“看到 glob 扩展导致多个 TB 备份在缓冲区溢出将垃圾(包括空格包围的通配符)转储到目录中的文件名后被意外删除,否则该目录被认为肯定会只有名称匹配[A-Za-z0-9]+"。这里不应该有风险(未提供--delete-excluded),但仍然......
    【解决方案2】:

    要排除的示例列表目录(也是通配符):

    #!/bin/sh
    export PATH=/usr/local/bin:/usr/bin:/bin
    LIST="rootfs usr data data2"
    for d in $LIST; do
    rsync -az --exclude /$d/ .....
    done
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-22
      • 1970-01-01
      • 2021-03-15
      • 2011-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多