Bash

在嵌套在函式內的管道命令末尾忽略連字元 (-)?

  • April 17, 2018

我使用 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 時,您獲得了在文件中看到的函式的更正版本。該版本有效。

這就是它的全部。這裡沒有什麼有趣的解釋。這是一種相當常見的情況,環境最終與設置它的文件不同步,並且經常導致暫時的混亂,但在這種情況下很容易解決。

引用自:https://unix.stackexchange.com/questions/437640