Wie „exportiert“ man Funktionen in Bash?

Wie „exportiert“ man Funktionen in Bash?

Ich habe ein Skript, das viele Funktionen enthält.

meinedatei1.sh:

func1() {}

func2() {}

Ich kann sie vom Skript aus mit folgendem aufrufen:

meinedatei2.sh:

source myfile1.sh

func1

func2

Aber wie kann ich sie aufrufen, wenn sie aus einem verschachtelten Skript stammen?

meinedatei3.sh:

./myfile2.sh

func2

func2: command not found

Kann ich Funktionen „exportieren“, myfile2sodass sie jeder kennt?

Ich kann es nicht verwenden, export -fda es viele Funktionen hat.

Antwort1

Beachten Sie, dass dies bashnicht der Fall ist sh. export -fEs ist spezifisch für die bashShell.

Wenn ein Skript kein She-Bang hat, wird es von einer POSIX-ähnlichen Shell interpretiert, die nicht unbedingt Bash sein muss. Wenn Sie bashin Ihrem Skript -spezifische Funktionen verwenden möchten, sollten Sie sicherstellen, dass es Folgendes hat:

#! /path/to/bash -

she-bang oder dass Sie es als aufrufen bash path/to/the/script. Auch das Anbieten von .shErweiterungen für in der Sprache geschriebene Skripte bashist etwas irreführend.

Now bashist eine der wenigen Shells, die Funktionen in die Umgebung exportieren können (tatsächlich mithilfe spezieller Umgebungsvariablen, die nur von Befehlen verstanden werden ). Dies kann mit dem Bash-spezifischen Befehl basherfolgen . exportiert auch alle Funktionen, die deklariert werden, während die Option aktiviert ist.export -fbashallexport

Aber in jedem Fall würde keines von beiden in Ihrem Fall funktionieren. Wenn Sie exportetwas von einer Shell aus ausführen, sei es eine Variable oder eine Funktion, ist diese Variable/Funktion in anderen Shells verfügbar als diese Shell.führt aus(Beim Exportieren geht es darum, Dinge zu bewahren,Ausführung).

Selbst wenn also myfile1.shoder myfile2.shdie von ihnen deklarierten Funktionen exportiert würden (mit export -foder durch ein set -o allexportvor der Variablendeklaration), würde dies nur die Shells betreffen, die die Shell, die diese Skripte interpretiert, ausführen würde. Hier myfile2.shwird nicht ausgeführt myfile3.sh, es ist umgekehrt.

Hier muss Ihr myfile3.shSkript Folgendes tun:

source path/to/myfile2.sh

sodass es dieselbe Shell ist, die den Code in allen myfile1.sh- myfile2.shund myfile3.sh-Skripten interpretiert, und Sie müssen dann keine Funktion exportieren.

Beachten Sie, dass es auf Systemen, auf denen shist bash, wahrscheinlich keine gute Idee ist, Funktionen zu exportieren, da dies alle sh- und bash-Skripte und Shell-Befehlszeilen betrifft, die Ihr Skript (rekursiv) ausführt. Wenn Sie beispielsweise Folgendes tun würden:

set -o allexport
uname() { echo Gotcha; }
somecmd

Und somecmdwenn ich eins ausführte, popen("uname", "r")um den Unix-Namen zu erhalten, würde es Gotchaauf Systemen erscheinen, wo anstelle des tatsächlichen Namens des Systems ( , …) shsteht .bashDarwinLinux

verwandte Informationen