Kollision von Bash-Funktions-/Aliasnamen verursacht Segmentierungsfehler

Kollision von Bash-Funktions-/Aliasnamen verursacht Segmentierungsfehler

Das in diesem Beitrag beschriebene Problem ist auch bei mir aufgetreten. mkdir stürzt Bash ab

Ich konnte dazu keinen Kommentar abgeben, da ich keinen Ruf habe. Kann jemand erklären, warum das passiert? Es passiert zur Laufzeit, nicht, wenn die Funktion geladen wird. Hier ist der Eintrag des identischen Problems.

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

„Das Problem bestand darin, dass ich zuvor einen Alias ​​wie alias md="mkdir" hatte. Als Bash also die neue Bash-Funktion analysierte, erweiterte es md() zu mkdir() und die Funktion wurde unendlich rekursiv und brachte die Shell zum Absturz.“

Ich finde, dieses Problem wurde richtig erkannt, aber ich verstehe die Begründung nicht. Ich verstehe keinen möglichen Grund, warum die Alias-Erweiterung die vollqualifizierte Shell-Funktion fehlleitet. Rückwärts, oder?

Entschuldigen Sie den Betrug. Bitte lesen Sie den Grund, bevor Sie einen Hinweis geben.

Antwort1

"Aliase sind eigentlich nur Textersetzungsmakros. Wenn Sie also versuchen, md() { ... }nach dem Definieren zu definieren md=mkdir, erhalten Sie tatsächlich mkdir() { ... }. Versuchen Sie, die Funktionsdefinitionen mit declare -p -f mdund auszudrucken, declare -p -f mkdirum zu sehen, was ich meine." – 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

Ich sehe, dass das, was Steeldriver gesagt hat, stimmt. Ich finde, es ist eine seltsame architektonische Entscheidung, bei der es wahrscheinlich eine Art Begründung im Code gibt, nämlich Text-Bashismus, wurl. Danke!

verwandte Informationen