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 -f
Funktion 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 sh
ist 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 autoload
Befehl in Shell-Skripten können Sie die gewünschten Funktionen laden:
autoload fun_a fun_b
In zsh autoload
ist erforderlich, um FPATH
zu arbeiten. ksh
Ich 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 FPATH
und 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, .bashrc
funktioniert dies abhängig von den Details der Ausführung. Wenn nicht, können Sie stattdessen ein Wrapper-Skript ausführen, das einfach eine .
oder source
eine 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
, typeset
hat eine -x
Option, 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"