Colisão de função Bash/nome de alias causa falha de segmento

Colisão de função Bash/nome de alias causa falha de segmento

O problema deste post também aconteceu comigo. mkdir trava o bash

Não pude comentar lá porque não tem reputação. Alguém pode elucidar por que isso acontece? Isso acontece em tempo de execução, não quando a função é carregada. Aqui está a pasta do mesmo problema.

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

"O problema é que eu já tinha um alias como alias md="mkdir" então, quando o bash analisou a nova função bash, ele expandiu md() para mkdir() e a função tornou-se infinitamente recursiva e travou o shell. "

Achei que esse problema foi encontrado corretamente, mas não entendo o raciocínio. Não entendo nenhum motivo possível para a expansão do alias estar direcionando incorretamente a função shell totalmente qualificada. Ao contrário, certo?

Desculpe pelo engano, leia o porquê antes de uma frase de destaque.

Responder1

"Os aliases são, na verdade, apenas macros de substituição de texto - então, quando você tenta definir md() { ... }após definir, md=mkdirvocê realmente acaba com mkdir() { ... }. Tente imprimir a função defs with declare -p -f mde declare -p -f mkdirpara ver o que quero dizer." – chave de aço

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

Vejo que o que o steeldriver disse é verdade, acho que é uma decisão arquitetônica estranha, com provavelmente algum tipo de raciocínio no código é text bashism wurl. Obrigado!

informação relacionada