Конфликт имени функции/псевдонима 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(), и функция становилась бесконечно рекурсивной, что приводило к сбою оболочки».

Я чувствовал, что эта проблема была найдена верно, но я не понимаю обоснования. Я не понимаю ни одной возможной причины, по которой расширение псевдонима неправильно направляет полностью определенную функцию оболочки. Обратно, верно?

Извините за обман, пожалуйста, прочитайте почему, прежде чем делать замечание.

решение1

«Псевдонимы на самом деле являются просто макросами замены текста, поэтому, когда вы пытаетесь определить md() { ... }после определения, md=mkdirвы на самом деле получаете mkdir() { ... }. Попробуйте распечатать определения функций с помощью declare -p -f mdи , declare -p -f mkdirчтобы понять, что я имею в виду». – steeldriver

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 сказал правду, я думаю, что это странное архитектурное решение с, вероятно, каким-то обоснованием в коде - текстовый башизм wurl. Спасибо!

Связанный контент