Wie funktioniert VARIABLE = () {Funktionsdefinition} in Bash?

7

WARNUNG - Bei dieser Frage geht es um den Bash vor dem Sicherheitslücke, aufgrund derer es geändert wurde.


Ich habe so etwas in meiner Bash ENV gesehen:

module=() {  eval `/usr/bin/modulecmd bash $*` }

Wie funktioniert dieses Konstrukt? Wie heißt es?

Ich frage nicht nach modulecmd, ich frage nach dem gesamten Konstrukt.

mcede
quelle
1
Sind Sie sicher, dass Sie es in genau dieser Syntax gefunden haben (insbesondere mit dem =Zeichen)? Denn für mich mag Bash es nicht. Ohne das =wäre es jedoch eine Funktionsdefinition.
Celtschk
Ja, so sieht es aus ... Es gibt auch einige andere Beispiele dafür. Ja, ich habe es ausprobiert und einen Fehler von bash erhalten, aber ich habe Beispiele dafür in meiner ENV.
Mcede

Antworten:

9

Es ist wirklich eine Funktion namens module. Es wird in Umgebungsvariablen angezeigt, wenn Sie eine Funktion exportieren .

$ test() { echo test; }
$ export -f test
$ env | sed -n '/test/{N;p}'
test=() {  echo test
}

Aus der Bash-Dokumentation - Export :

Export

 export [-fn] [-p] [name[=value]]

Markieren Sie jeden Namen, der an untergeordnete Prozesse in der Umgebung übergeben werden soll. Wenn die Option -f angegeben ist, beziehen sich die Namen auf Shell-Funktionen . Andernfalls beziehen sich die Namen auf Shell-Variablen. Die Option -n bedeutet, dass nicht mehr jeder Name für den Export markiert wird. Wenn keine Namen angegeben werden oder die Option -p angegeben ist, wird eine Liste der exportierten Namen angezeigt. Die Option -p zeigt die Ausgabe in einer Form an, die als Eingabe wiederverwendet werden kann. Wenn auf einen Variablennamen = value folgt, wird der Wert der Variablen auf value gesetzt.

Der Rückgabestatus ist Null, es sei denn, eine ungültige Option wird angegeben, einer der Namen ist kein gültiger Shell-Variablenname oder -f wird mit einem Namen angegeben, der keine Shell-Funktion ist.

cuonglm
quelle