La colisión de función Bash/nombre de alias causa falla de segmentación

La colisión de función Bash/nombre de alias causa falla de segmentación

El problema de este post también me pasó a mí. mkdir bloquea bash

No pude comentar allí porque no tengo reputación. ¿Alguien puede aclarar por qué sucede esto? Sucede en tiempo de ejecución, no cuando se carga la función. Aquí está la pasta del mismo problema.

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

"El problema era que anteriormente había tenido un alias como alias md="mkdir", por lo que cuando bash analizó la nueva función bash, expandió md() a mkdir() y la función se volvió infinitamente recursiva y bloqueó el shell. "

Sentí que este problema se encontró correctamente, pero no entiendo el razonamiento. No entiendo ninguna posible razón por la que la expansión del alias esté desviando la función de shell totalmente calificada. Al revés ¿verdad?

Perdón por el engaño, lea el motivo antes de realizar una llamada.

Respuesta1

"Los alias en realidad son solo macros de reemplazo de texto, por lo que cuando intentas definir md() { ... }después de definir, md=mkdiren realidad terminas con mkdir() { ... }. Intente imprimir la función defs con declare -p -f mdy declare -p -f mkdirpara ver a qué me refiero". – conductor de acero

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

Veo que lo que dijo Steeldriver es cierto, creo que es una decisión arquitectónica extraña con la probabilidad de que algún tipo de razonamiento en el código sea un error de bashismo de texto. ¡Gracias!

información relacionada