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“, myfile2
sodass sie jeder kennt?
Ich kann es nicht verwenden, export -f
da es viele Funktionen hat.
Antwort1
Beachten Sie, dass dies bash
nicht der Fall ist sh
. export -f
Es ist spezifisch für die bash
Shell.
Wenn ein Skript kein She-Bang hat, wird es von einer POSIX-ähnlichen Shell interpretiert, die nicht unbedingt Bash sein muss. Wenn Sie bash
in 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 .sh
Erweiterungen für in der Sprache geschriebene Skripte bash
ist etwas irreführend.
Now bash
ist 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 bash
erfolgen . exportiert auch alle Funktionen, die deklariert werden, während die Option aktiviert ist.export -f
bash
allexport
Aber in jedem Fall würde keines von beiden in Ihrem Fall funktionieren. Wenn Sie export
etwas 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.sh
oder myfile2.sh
die von ihnen deklarierten Funktionen exportiert würden (mit export -f
oder durch ein set -o allexport
vor der Variablendeklaration), würde dies nur die Shells betreffen, die die Shell, die diese Skripte interpretiert, ausführen würde. Hier myfile2.sh
wird nicht ausgeführt myfile3.sh
, es ist umgekehrt.
Hier muss Ihr myfile3.sh
Skript Folgendes tun:
source path/to/myfile2.sh
sodass es dieselbe Shell ist, die den Code in allen myfile1.sh
- myfile2.sh
und myfile3.sh
-Skripten interpretiert, und Sie müssen dann keine Funktion exportieren.
Beachten Sie, dass es auf Systemen, auf denen sh
ist 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 somecmd
wenn ich eins ausführte, popen("uname", "r")
um den Unix-Namen zu erhalten, würde es Gotcha
auf Systemen erscheinen, wo anstelle des tatsächlichen Namens des Systems ( , …) sh
steht .bash
Darwin
Linux