Bash

Bash 腳本的意外行為:首先執行函式,然後執行別名

  • March 4, 2019

當我執行以下腳本時

#!/usr/bin/env bash

main() {
   shopt -s expand_aliases 
   alias Hi='echo "Hi from alias"'
   Hi  # Should Execute the alias
   \Hi # Should Execute the function
   "Hi"
}

function Hi() {
   echo "Hi from function"
}
main "$@"

它第一次執行該函式,然後總是作為別名執行:

$ . Sample.sh
Hi from function
Hi from function
Hi from function
$ . Sample.sh
Hi from alias
Hi from function
Hi from function

為什麼會這樣?


在以下情況下不會發生這種情況

#!/usr/bin/env bash

function Hi() {
   echo "Hi from function"
}

shopt -s expand_aliases 
alias Hi='echo "Hi from alias"'
Hi  # Should Execute the alias
\Hi # Should Execute the function
"Hi"

它第一次執行該函式,然後總是作為別名執行:

$ . Sample.sh
Hi from alias
Hi from function
Hi from function
$ . Sample.sh
Hi from alias
Hi from function
Hi from function

函式中的別名擴展是在讀取函式時完成的,而不是在執行函式時。函式中的別名定義在函式執行時執行。

請參閱別名和函式

以及https://www.gnu.org/software/bash/manual/html_node/Aliases.html

這意味著,別名將在函式main執行時定義,但當第一次讀取函式時,別名尚未定義。所以第一次函式main會執行Hi三次。

當您第二次獲取腳本時,別名已經從上次執行中定義,並且可以在讀取函式定義時展開。當您現在呼叫該函式時,它會在擴展別名的情況下執行。

僅當腳本以 為來源時才會出現不同的行為. Sample.sh,即當它在同一個 shell 中執行多次時。當您在單獨的 shell 中執行它時,./Sample.sh它將始終顯示第一次執行的行為。

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