从变量运行rsync命令 - 引用不受尊重

时间:2017-04-25 17:40:51

标签: linux bash rsync quotations

我知道有关于报价的指南和答案。我已经阅读了它们(整天),但我仍然无法让我的简单脚本工作。

我已经设置了script1.sh并尝试运行命令。该命令必须被读取到一个变量,所以我可以回应它,运行它,然后再用它来做其他事情。

我的命令是

rsync -vtirn -e ssh --exclude '._*' --exclude '.@*' --exclude '.DS_Store' --progress /Path/ user@IP:/Path

如果我从bash运行它,如果我把它放在我的脚本中,它会按预期工作。

如果我在其间放置一个变量,则--excludes不再有效。

job='rsync -vtirn -e ssh --exclude '"'"'._*'"'"' --exclude '"'"'.@*'"'"' --exclude '"'"'.DS_Store'"'"' --progress /Path/ user@IP:/Path
echo $job   
$job

奇怪的是,回声显示了我需要的命令。如果我复制echo输出并将其粘贴到shell中,则命令工作正常。但是从$ job开始的命令就是省略了排除。

我一直在尝试使用双引号在开头和结尾,使用单引号(/'),只有双引号...这么多不同的选项,但没有考虑我的--exclude&#39 ;过滤器'论点。唯一有效的是

job=$(rsync -vtirn -e ssh --exclude '._*' --exclude '.@*' --exclude '.DS_Store' --progress /Path/ user@IP:/Path)

但是有了这个,一旦设置了变量就会启动命令。

提前感谢任何帮助

1 个答案:

答案 0 :(得分:3)

不要使用常规变量来存储命令名称。定义一个函数。

job () {
  rsync -vtirn -e ssh --exclude '._*' --exclude '.@*' --exclude '.DS_Store' --progress /Path/ user@IP:/Path
}

如果您确实需要一个表单来记录和执行,请定义一个数组以将参数存储到rsync

opts=( -vtrin 
       -e ssh
       --exclude '._*'
       --exclude '.@*'
       --exclude .DS_Store
       --progress
       /Path/
       user@IP:/Path
)
echo "rsync ${opts[*]}"
rsync "${opts[@]}"

日志与您执行的命令完全相同,但不一定是;您没有将日志消息传递给eval