2016-11-25 2 views
6

ich diese Funktion in einem Bash-Skript haben kann, die auf die Schaleungesetzt bash Funktion Variable mit Nicht-Standard-Namen

function suman{ 
    echo "using suman function" 
} 

wenn ich

unset suman 
nennen

Dinge bezogen wird scheinen wie erwartet zu funktionieren

aber wenn ich dies als meine Funktion:

function suman-inspect { 
    echo "using suman-inspect function" 
} 

dann, wenn ich

unset suman-inspect 

oder

unset "suman-inspect" 

nennen erhalte ich diese Meldung:

bash: unset: `suman-inspect': not a valid identifier 

Wie kann diese Variable nicht gesetzt wie?

Antwort

4

Nach einigen mehr Forschung, scheint es, dass

unset -f "suman-inspect" 

arbeiten. Das ist überraschend, weil unset suman funktioniert hat, und die SUMAN-Funktion erfolgreich deaktiviert hat (soweit ich das beurteilen konnte).

+2

+1 Faszinierend! Die Dokumentation für "Unset" sagt, dass "Wenn keine Optionen angegeben werden, bezieht sich jeder * Name * auf eine Variable; Wenn es keine Variable mit diesem Namen gibt, ist jede Funktion mit diesem Namen nicht gesetzt. "Ich hätte angenommen, dass dies funktionieren würde, selbst wenn die Variable kein gültiger Variablenname ist, aber offensichtlich nicht! – ruakh

+2

Wahrscheinlich ist das was' unset' * setzt * voraus, dass sein Argument (sans '-f') ein Bezeichner ist, aber wenn keine Variable mit diesem Namen existiert, überprüft es, ob Sie stattdessen eine Funktion deaktivieren möchten.Nur wenn Sie '-f' explizit verwenden, lockern Sie' bash' die Regel "Argument muss eine gültige ID sein". Bei einigen Bash-Erweiterungen fehlen genau dokumentierte Beschreibungen ihrer Semantik. Einige andere Beispiele umfassen die Prozesssubstitution (z. B., wo '> (...)' seine Standard * -Ausgabe * von? erbt) und Funktionsexporte (vgl. ShellShock). – chepner

+0

Ist der Bindestrich in suman-inspect ein ungültiger Bezeichner? –

2

Bash erlaubt Funktionen mit Namen, die keine gültigen Bezeichner sind, wenn sie sich nicht im Posix-Modus befinden. So

:

set -o posix 
function suman-inspect { echo "using suman-inspect function"; } 

Gibt:

bash: `suman-inspect': not a valid identifier 

ruakh macht einen wichtigen Punkt von man bash zitieren. Der Quellcode (builtins/set.def) hat den Kommentar: Posix.2 sagt zunächst versuchen, Variablen, dann funktioniert, aber ...

Die POSIX standard sagt Wenn weder -f noch -v angegeben ist, Name auf eine Variable verweist ; Wenn eine Variable mit diesem Namen nicht existiert, ist nicht angegeben, ob eine Funktion mit diesem Namen, falls vorhanden, nicht gesetzt sein soll.

Also eigentlich das Verhalten ist, dass alter Standby „nicht spezifiziert * Wenn überhaupt, der Fehler in der Dokumentation bash ist aber fair zu sein, an anderer Stelle in man bash heißt es:..

Eine Funktionsdefinition gelöscht werden kann Verwenden der Option -f, um die Unset-Built-in.