Bash
Bash 腳本的意外行為:首先執行函式,然後執行別名
當我執行以下腳本時
#!/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
它將始終顯示第一次執行的行為。