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=mkdir
en realidad terminas con mkdir() { ... }
. Intente imprimir la función defs con declare -p -f md
y declare -p -f mkdir
para 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!