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:

  • Sottrazione del file video in più segmenti
  • $ logout bash: logout: non shell di login: usa exit '
  • Come fuggite da apostrophe in singola string citata in bash?
  • Qual è l'equivalente Bash di "cmd / c"
  • .profile in Mac OS X?
  • Differenza tra "a = b" e "esport a = b" in bash
  •  $ 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?

  • .profile in Mac OS X?
  • Esiste un metodo per esportre gli URL delle tabs aperte di una window di Firefox?
  • Cygwin errore fatale non riescono a rimuovere .. Cosa significa?
  • Evitare di digitare uno spazio accidentale tra rm e wildcard
  • Uscita errata del command di storia di ssh. Come leggere correttamente le informazioni sul timestamp
  • Come get statistiche di networking in tempo reale in Linux con formato KB / MB / Bytes e per specifico processID di port o applicazione
  • One Solution collect form web for “Non è necessario esportre quando si esegue funzioni in sottofondo”

    Questo è di progettazione. Questa risposta su Unix e Linux SE spiega la questione. Il punto principale è:

    Un sottosistema è […] diverso dall'esecuzione di uno script.

    Siamo il genio del computer e della rete.