Non è necessario esportre quando si esegue funzioni in sottofondo

Ho uno script msource.sh che verrà acquistato:

 $ cat msource.sh #!/usr/bin/env sh echo "($BASHPID) - sourced ${BASH_SOURCE[0]}" &>> "$logfile" # logfile is defined by the sourcing script sourced_var="init sourced var with $BASHPID" 

Ho uno script che fonte msource.sh e chiama una function come è e in una subshell . mscript2.sh un altro script mscript2.sh :

 $ cat mscript.sh #!/usr/bin/env sh logfile=mout.out rm -f $logfile source msource.sh mfun() { echo "($BASHPID) in ${FUNCNAME}" &>> "$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 $! 

Ho un altro script, mscript2.sh che verrà chiamato da mscript.sh , come visto sopra:

 $ cat mscript2.sh #!/usr/bin/env sh [ -z "${logfile:+x}" ] && logfile=mout2.out || true echo "($BASHPID) - executing ${BASH_SOURCE[0]}" &>> "$logfile" echo " avar: '$avar'" &>> "$logfile" echo " sourced_var: '$sourced_var'" &>> "$logfile" 

Gestisco tutto:

 $ bash script.sh 

Ottengo le seguenti uscite:

 $ 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' 

e

 $ cat mout2.out (13179) - executing mscript2.sh avar: '' sourced_var: '' 

Quindi, se chiamo la function come lo è, il pid è lo stesso e non ho bisogno di source the msource.shesportre le variables. Se chiamiamo la function in una msource.sh non è necessaria la ricerca di msource.sh o esportzione di variables.

Tuttavia, call un altro script in un subshell perde tutte le variables e devono essere esportte, anche il file di log che verrà ridefinito diversamente.

Qualcuno può chiarire cosa sta succedendo? Qual è la differenza tra l'esecuzione di una function in una subshell e l'esecuzione di un altro script, che verrà lanciato anche in un'altra subshell ? Perché non è necessario esportre le variables di un process genitore da passare ad una function subshell ed?

Siamo il genio del computer e della rete.