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.
Ist die exportierte Funktion nur für untergeordnete Anrufe verfügbar? Wie wende ich es auf die aktuelle Bash-Sitzung an? Ich schreibe gerne .bashrc, aber nur für die aktuelle Bash-Instanz ...
vp_arth
3
@vp_arth: Wenn Sie die Funktion in untergeordneten Aufrufen nicht benötigen, müssen Sie sie nicht exportieren. Es ist in beiden Fällen in der aktuellen Sitzung verfügbar (beachten Sie, dass Sie die Datei, wenn sie in einer Datei definiert ist, als Quelle ausführen müssen, anstatt sie auszuführen, um sie in der aktuellen Sitzung verfügbar zu machen).
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.
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.
Bitte beachten Sie, dass dies spezifisch für istbash . ( ksh‚S Gegenstück zu declare, typesethat eine -xOption, aber es gilt nur für Variablen , nicht Funktionen, dito für zsh).
mklement0
0
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:
Antworten:
Die
export -f
Funktion ist spezifisch für Bash:Elternteil
Kind
quelle
In
sh
ist es nicht möglich, eine Funktion zu exportieren, wie von Charles Duffy festgestellt .quelle
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 wirdPATH
, 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:In zsh
autoload
ist erforderlich, umFPATH
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
undautoload
:quelle
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.
odersource
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:
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.
quelle
Mehr Info
quelle
bash
. (ksh
‚S Gegenstück zudeclare
,typeset
hat eine-x
Option, aber es gilt nur für Variablen , nicht Funktionen, dito fürzsh
).Funktionen können von Natur aus nicht exportiert werden. Sie können jedoch Zeichenfolgen exportieren, daher habe ich hier einen kleinen Trick:
Um die Funktion zu importieren, definieren Sie sie aus der exportierten Zeichenfolge neu:
quelle