我知道有关于报价的指南和答案。我已经阅读了它们(整天),但我仍然无法让我的简单脚本工作。
我已经设置了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)
但是有了这个,一旦设置了变量就会启动命令。
提前感谢任何帮助
答案 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
。