這篇文章中的問題也發生在我身上。 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 md
declare -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。謝謝!