Nit Plektren:
- Ihre "Shebangs" sind falsch - sie sollten beginnen
#!
. - Sie benötigen eigentlich keinen "Shebang" in einer Datei, die beschafft werden soll. Möglicherweise möchten Sie die Einstellung deaktivieren, damit klar ist, dass die Datei beschafft werden soll und nicht als gewöhnliches Skript ausgeführt werden soll. (Im Besonderen sollten Sie es wahrscheinlich mit einem Kommentar beginnen, der ungefähr so aussieht
# This file is meant to be sourced and not run as an ordinary script.
) - Streng genommen brauchen Sie keinen "Shebang" in einer Datei, die vorbeigeführt werden soll, obwohl es nicht weh tut.
bash scriptname
- Natürlich bekommst du
PrintDate: command not found
. Ihremain.script.sh
Datei definiert nichtPrintDate
. es ist bestimmendPritnDate
.
Die eigentliche Antwort auf Ihre Frage lautet jedoch:
- Der springende Punkt
source
ist, dass das Quell-Skript im aktuellen Main-Shell-Prozess gelesen und interpretiert wird. Wenn Sie es jedoch zu einer Pipeline machen, erzwingen Sie es, dass es in einem untergeordneten Prozess ausgeführt wird. Der Trick besteht darin, eine Pipe zu erstellen, ohne eine Pipeline zu erstellen. Der Trick dabei ist die Prozessersetzung (eine Bash-Erweiterung für die Befehlsersetzung ). Dieser Befehl:
source main.script.sh > >(dialog --progressbox "sourcing please wait..." 20 80)
erstellt einen untergeordneten Prozess, um das
dialog
Programm auszuführen, und erstellt eine Pipe vom Haupt-Shell-Prozess zu diesem untergeordneten Prozess. Diese Pipe sieht dann jedoch wie eine gewöhnliche Datei aus und sendet die Ausgabe dessource
Befehls an die Pipe, während sie erstellt wird Sieht aus wie eine gewöhnliche Umleitung der Standardausgabe. Daher wird dersource
Prozess im Hauptshell-Prozess ausgeführt (in diesem Fall ist derbash
Prozess, mit dem dasjob1.sh
Skript ausgeführt wird), und Ihre Funktionen werden daher imjob1.sh
Skript definiert .