Bash 函數/別名衝突導致段錯誤

Bash 函數/別名衝突導致段錯誤

這篇文章中的問題也發生在我身上。 mkdir 使 bash 崩潰

我無法在那裡發表評論,因為沒有聲譽。誰能解釋為什麼會發生這種情況?它發生在運行時而不是載入函數時。這是同一問題的貼。

md() 
{  
    [ $# -eq 0 ] && { echo "$0 dirname [permissions]"; return; }
    [ -d "$1" ] && { echo "%1 already exists!"; return; }
    mkdir -m ${2:-0755} -p "$1"
}

「問題是我之前有一個像alias md="mkdir" 這樣的別名,所以當bash 解析新的bash 函數時,它將md() 擴展為mkdir() 並且該函數變得無限遞歸並使shell 崩潰。 」

我覺得這個問題很恰當地被發現,但我不明白其中的推理。我不明白別名擴展誤導完全限定的 shell 函數的任何可能原因。向後對嗎?

很抱歉這個騙子,請在標註之前閱讀原因。

答案1

“別名實際上只是文字替換巨集 - 因此,當您md() { ... }在定義後嘗試定義時md=mkdir,實際上會得到。嘗試使用和mkdir() { ... }列印出函數定義,看看我的意思。” – 鋼鐵司機declare -p -f mddeclare -p -f mkdir

zi@zi-top:~$ declare -p -f nd
bash: declare: nd: not found
zi@zi-top:~$ declare -p -f mkdir
mkdir () 
{ 
    mkdir -p "$@"
}
zi@zi-top:~$ nd () {
        mkdir -p "$@"
}
zi@zi-top:~$ declare -p -f nd
bash: declare: nd: not found

我發現 Steeldriver 所說的是真的,我認為這是一個奇怪的架構決策,程式碼中的某種推理可能是文字 bashism wurl。謝謝!

相關內容