Es ist kein Export erforderlich, wenn Funktionen in der Subshell ausgeführt werden

669
kaligne

Ich habe ein msource.shSkript, 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.shein functionwie 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.shdas von mscript.shoben 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, pidist sie gleich und ich brauche weder die Quelle msource.shnoch die Variablen zu exportieren. Wenn ich die Funktion in a subshellaufrufe, ist das Sourcing msource.shoder Exportieren von Variablen immer noch nicht erforderlich.

Der Aufruf eines anderen Skripts in a subshellverliert 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 subshellund 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 subshelled-Funktion übergeben zu werden?

0

1 Antwort auf die Frage

1
Kamil Maciorowski

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.