簡體   English   中英

從變量運行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

奇怪的是,回聲恰好顯示了我需要的命令。 如果我復制回顯輸出並將其粘貼到外殼中,則該命令運行正常。 但是以$ 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM