Bitte sagen Sie mir, wie eine Funktion in die übergeordnete Shell (bash, sh oder ksh) exportiert wird, damit die Funktion für alle vom übergeordneten Prozess gestarteten untergeordneten Prozesse verfügbar ist.
Bitte sagen Sie mir, wie eine Funktion in die übergeordnete Shell (bash, sh oder ksh) exportiert wird, damit die Funktion für alle vom übergeordneten Prozess gestarteten untergeordneten Prozesse verfügbar ist.
Antworten:
Die export -fFunktion ist spezifisch für Bash:
Elternteil
#!/bin/bash
plus1 () { echo $(($1 + 1)); }
echo $(plus1 8)
export -f plus1
./child 14 21
Kind
#!/bin/bash
echo $(plus1 $(($1 * $2)) )
In shist es nicht möglich, eine Funktion zu exportieren, wie von Charles Duffy festgestellt .
Wenn Sie ksh oder zsh verwenden:
Sie können die Umgebungsvariable verwenden FPATH , in der Sie alle Ihre Funktionen platzieren können.
Wenn FPATH ein interaktiver Interpreter festgelegt ist und in der aktuellen Shell-Umgebung oder in der aktuellen Shell-Umgebung oder kein Befehl oder keine Funktion gefunden wird PATH, werden die dort aufgeführten Verzeichnisse nach einer Datei durchsucht, die nach dem fehlenden Befehl benannt ist. Wenn eines gefunden wird, wird es in der aktuellen Shell-Umgebung bezogen und soll die Funktion definieren.
So können Sie alle Ihre Funktionen an einem Ort in platzieren FPATH , und untergeordnete Skripte können sie auch finden.
Mit dem autoloadBefehl in Shell-Skripten können Sie die gewünschten Funktionen laden:
autoload fun_a fun_b
In zsh autoloadist erforderlich, um FPATHzu arbeiten. kshIch glaube, dass es in und seinen nahen Verwandten einfach Funktionen verursacht, die in definiert sindFPATH regulären Befehl in Ihrem PATH überschreiben, als würden sie direkt definiert.
Einige Details zu FPATHund autoload:
Wenn Sie Subshells mit erstellen, ( )erben diese einen Snapshot aller Definitionen, Parameter und Shell-Variablen.
Wenn Sie sie wie Programme ausführen, können Sie die Definitionen eingeben .bashrc.
Wenn Sie versuchen, ein vorhandenes Skript zu fälschen, um einen Wrapper auszuführen oder einen PATH-Befehl zu ersetzen, .bashrcfunktioniert dies abhängig von den Details der Ausführung. Wenn nicht, können Sie stattdessen ein Wrapper-Skript ausführen, das einfach eine .oder sourceeine Include-Datei ausführt , die die Funktionen definiert, und dann dasselbe mit dem Shell-Skript mit den zu ersetzenden Befehlen ausführt .
Das Wrapper-Skript könnte ungefähr so aussehen:
script=$1
shift
. include.sh
. $script "$@"
Die Idee ist, dass der erste Parameter der Name des realen Skripts ist und die verbleibenden Parameter die Argumente sind. Dann wird stattdessen das obige Skript ausgeführt.
declare -x -f NAME
Mehr Info
-f Aktion oder Anzeige auf Funktionsnamen und Definitionen beschränken -x, um NAMEs exportieren zu lassen
bash . ( ksh‚S Gegenstück zu declare, typesethat eine -xOption, aber es gilt nur für Variablen , nicht Funktionen, dito für zsh).
Funktionen können von Natur aus nicht exportiert werden. Sie können jedoch Zeichenfolgen exportieren, daher habe ich hier einen kleinen Trick:
func="$(typeset -f funcname)"
export func
Um die Funktion zu importieren, definieren Sie sie aus der exportierten Zeichenfolge neu:
# in subshell
eval "$func"