Dies ist beabsichtigt. Diese Antwort auf Unix & Linux SE erläutert das Problem. Der Hauptpunkt ist:
Eine Subshell unterscheidet sich von der Ausführung eines Skripts.
Ich habe ein msource.sh
Skript, das beschafft wird:
$ cat msource.sh #!/usr/bin/env sh echo "($BASHPID) - sourced $" &>> "$logfile" # logfile is defined by the sourcing script sourced_var="init sourced var with $BASHPID"
Ich habe ein Skript, das msource.sh
ein function
wie es ist und in einem Quellcode ruft subshell
. Dann wird ein anderes Skript aufgerufen mscript2.sh
:
$ cat mscript.sh #!/usr/bin/env sh logfile=mout.out rm -f $logfile source msource.sh mfun() { echo "($BASHPID) in $" &>> "$logfile" echo " avar: '$avar'" &>> "$logfile" echo " sourced_var: '$sourced_var'" &>> "$logfile" } avar="$BASHPID - init" echo "[mfun] basic call" &>> "$logfile" mfun echo -e "\n[mfun &] subshell call" &>> "$logfile" mfun & wait $! ## call mscript2.sh echo -e "\n[mscript2] background call" &>> "$logfile" bash mscript2.sh & wait $! # call mscript2.sh after exporting variables echo -e "\n[mscript2 &] export and background call" &>> "$logfile" export logfile export avar export sourced_var bash mscript2.sh & wait $!
Ich habe ein anderes Skript, mscript2.sh
das von mscript.sh
oben aufgerufen wird :
$ cat mscript2.sh #!/usr/bin/env sh [ -z "$" ] && logfile=mout2.out || true echo "($BASHPID) - executing $" &>> "$logfile" echo " avar: '$avar'" &>> "$logfile" echo " sourced_var: '$sourced_var'" &>> "$logfile"
Ich führe alles aus:
$ bash script.sh
Ich bekomme folgende Ausgaben:
$ cat mout.out (13166) - sourced msource.sh [mfun] basic call (13166) in mfun avar: '13166 - init' sourced_var: 'init sourced var with 13166' [mfun &] subshell call (13174) in mfun avar: '13166 - init' sourced_var: 'init sourced var with 13166' [mscript2 &] background call [mscript2 &] export and background call (13184) - executing mscript2.sh avar: '13166 - init' sourced_var: 'init sourced var with 13166'
und
$ cat mout2.out (13179) - executing mscript2.sh avar: '' sourced_var: ''
Wenn ich also die Funktion so nenne, wie sie ist, pid
ist sie gleich und ich brauche weder die Quelle msource.sh
noch die Variablen zu exportieren. Wenn ich die Funktion in a subshell
aufrufe, ist das Sourcing msource.sh
oder Exportieren von Variablen immer noch nicht erforderlich.
Der Aufruf eines anderen Skripts in a subshell
verliert jedoch alle Variablen und muss exportiert werden, auch die Protokolldatei, die ansonsten neu definiert wird.
Kann jemand klären, was los ist? Was ist der Unterschied zwischen der Ausführung einer Funktion in a subshell
und der Ausführung eines anderen Skripts, das auch in einem anderen gestartet wird subshell
? Warum müssen die Variablen eines übergeordneten Prozesses nicht exportiert werden, um an eine subshell
ed-Funktion übergeben zu werden?
Dies ist beabsichtigt. Diese Antwort auf Unix & Linux SE erläutert das Problem. Der Hauptpunkt ist:
Eine Subshell unterscheidet sich von der Ausführung eines Skripts.