运行 来自变量的 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
.
我知道有关于报价的指南和答案。我已经阅读了它们(一整天),但我仍然无法让我的简单脚本工作。
我已经设置 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
.