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

相关内容