我試圖通過 env var將一些--exclude陳述句傳遞給我的tar命令(實際上我會傳遞幾個--exclude陳述句,并試圖通過將定義放在單獨的行上來提高可讀性):
# EXCLUDE_STUFF="--exclude='/captain/generated'"
# tar ${EXCLUDE_STUFF} -cvzf /dev/null /captain
/captain/
/captain/generated/
/captain/generated/registry-auth
... etc ...
即它不排除我指定的檔案夾。如果我${EXCLUDE_STUFF}用引號括起來并沒有什么區別。
這是我回顯上述命令時得到的結果:
# echo tar ${EXCLUDE_STUFF} -cvzf /dev/null /captain
tar --exclude='/captain/generated' -cvzf /dev/null /captain
所以看起來命令是正確的。當我直接運行擴展命令時,我得到:
# tar --exclude='/captain/generated' -cvzf /dev/null /captain
/captain/
/captain/temp/
/captain/data/
... etc ...
即指定的檔案夾已被排除。
那么為什么變數替換在這種情況下不起作用呢?
uj5u.com熱心網友回復:
為什么變數替換在這種情況下不起作用?
賦值后,變數EXCLUDE_STUFF包含字面上的字串--exclude='/captain/generated'。
您正在--exclude='/captain/generated'從變數替換傳遞。因為沒有相對于您當前作業目錄字面 命名的'目錄,'/captain/generated'不匹配任何內容,因此它不排除任何內容。
總之tar --exclude='/captain/generated'就是不一樣tar "--exclude='/captain/generated'"。
在這種情況下,只需
exclude_stuff="--exclude=/captain/generated"
tar "$exclude_stuff" ...
或者使用 bash 陣列:
exclude_stuff=( --exclude='/captain/generated' ) # note: quotes are interpreted
tar "${exclude_stuff[@]}" ...
閱讀https://mywiki.wooledge.org/BashFAQ/050。研究 shell 參考,它是如何作業的,以及何時使用它,研究分詞擴展和檔案名擴展。使用https://shellcheck.net檢查您的腳本。腳本區域變數最好使用小寫變數。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/375005.html
