Bash
在嵌套在函式內的管道命令末尾忽略連字元 (-)?
我使用 Ubuntu 16.04 (xenial) 和 Bash 4.3.48(1)。
根據 Stephen Kitt在本次會議中的回答,我嘗試將以下命令作為名為的函式的一部分執行
imb()
:mysqldump -u root -p --all-databases | zip "$drt/db-$date.zip" -
我獲取了
imb()
函式所在的文件:source ~/functions.sh
功能
imb() { drt="/var/www/html" date="$(date +\%F-\%T)" mysqldump -u root -p --all-databases | zip "$drt/db-$date.zip" - # Note the hyphen before this comment; zip -r "all_zipped-$date.zip" "$drt"/ -x "*/cache/*" rm -f "$drt/db-$date.zip" }
我的問題
呼叫函式失敗並出現以下
zip
錯誤:zip error: Nothing to do! (/var/www/html/db-2018-04-13-22:27:47.zip)
這似乎是因為連字元以某種方式被忽略了;我假設從以下方面來看:
type -a imb
輸出:
imb is a function imb () { date="$(date +\%F-\%T)"; mysqldump -u root -p --all-databases | zip "$drt/db-$date.zip"; zip -r "all_zipped-$date.zip" "$drt"/ -x "*/cache/*"; rm -f "$drt/db-$date.zip" }
我注意到這裡缺少的連字元。
我的問題
為什麼函式失敗/為什麼 Bash 據稱忽略了連字元?
您的環境中有舊版本的函式,並且在編輯文件以添加缺少的
-
.當您重新獲取文件或重新啟動 shell 時,您獲得了在文件中看到的函式的更正版本。該版本有效。
這就是它的全部。這裡沒有什麼有趣的解釋。這是一種相當常見的情況,環境最終與設置它的文件不同步,並且經常導致暫時的混亂,但在這種情況下很容易解決。