这篇文章的问题也发生在我身上。 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() { ... }
打印出函数定义,看看我的意思。” – steeldriverdeclare -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 说的没错,我认为这是一个奇怪的架构决策,代码中的某种推理可能是文本攻击主义。谢谢!