[英]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
奇怪的是,回聲恰好顯示了我需要的命令。 如果我復制回顯輸出並將其粘貼到外殼中,則該命令運行正常。 但是以$ job開頭的命令忽略了排除項。
我一直在嘗試在開頭和結尾使用雙引號,轉義單引號(/'),僅使用雙引號...這么多不同的選項,但沒有考慮--排除“過濾器”參數。 唯一有效的是
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
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.