运行 来自变量的 rsync 命令 -- 不接受引用

Running an rsync command from a variable -- quoting not honored

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

我已经设置 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 'filter' 争论。唯一有用的是

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

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

提前感谢您的帮助

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

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.