GNU/Linux >> Linux Esercitazione >  >> Linux

Che cos'è Subshell in Linux?

Sei già a conoscenza della shell. È un programma che ti consente di eseguire comandi in Linux. La tua principale interazione con la shell è quando esegui comandi in un terminale.

Prima o poi ti imbatterai in un termine chiamato "subshell" e questo potrebbe confonderti.

Cos'è una subshell?

Una subshell è fondamentalmente una nuova shell solo per eseguire un programma desiderato. Una subshell può accedere alle variabili globali impostate dalla "shell madre" ma non alle variabili locali. Eventuali modifiche apportate da una subshell a una variabile globale non vengono passate alla shell padre.

Ha senso? Probabilmente no. Permettetemi di spiegare le cose in dettaglio con esempi.

Ecco uno script di una riga che mostra il valore della variabile 'var'.

echo $var

Ho impostato il valore di questa variabile su LHB, cosa pensi verrà visualizzato quando verrà eseguito lo script?

Sorpresa! Lo script non vede il valore della variabile var Avevo impostato prima.

Gli script della shell vengono eseguiti in subshell (per impostazione predefinita)

Come mai? Perché quando esegui uno script di shell, viene eseguito nella propria shell. Poiché questa shell ha origine da un'altra shell (dove imposti la variabile e dove esegui lo script), viene chiamata subshell.

Lo script della shell non poteva vedere il valore della variabile perché era una variabile locale e non era noto alla shell appena creata. Se vuoi che la variabile sia accessibile dalle sue subshell, dovrai usare il comando export e trasformarla in una variabile globale.

Puoi anche creare subshell lanciando nuove shell dalle tue shell esistenti. Basta eseguire bash e sarai in una subshell. Puoi usare il comando exit per chiudere/uscire dalla shell e tornare alla shell originale.

Non pensare a subshell come a una nuova finestra di terminale. So che è difficile da visualizzare, ma è così.

Ho usato la variabile per mostrare la differenza tra le due shell (parent e subshell). La variabile var non è stato esportato in questo caso e quindi non era noto alla subshell.

Subshell nidificate

Allo stesso modo, puoi creare subshell nidificate. Dopo che una variabile è stata esportata, rimane esportata in tutte le subshell create successivamente.

È possibile modificare il valore della variabile esportata in una subshell. Il valore modificato verrà passato alle subshell successive (perché la variabile stessa è globale) ma se esci e torni alla shell originale, il valore originale viene mantenuto.

Come mai? Perché il valore della variabile esportata viene copiato nella subshell. Ed è la copia che viene modificata (da LHB a HOC). Il valore originale rimane lo stesso nella shell padre.

Quindi tienilo a mente, non c'è modo di cambiare il valore di una variabile in una shell genitore dall'interno di una subshell . Non importa se esporti la variabile o meno, la variabile non verrà modificata nella shell genitore.

Suggerimento bonus:esegui uno script di shell nella shell corrente

Il comportamento normale è che uno script di shell venga eseguito nella propria shell, ovvero una subshell.

Puoi modificare questo comportamento ed eseguire uno script di shell nella shell corrente grazie al comando di shell integrato chiamato dot (.).

No, non è lo stesso che eseguire uno script di shell come questo ./script. Invece, lo esegui in questo modo:

. script

In questo modo, i comandi dello script vengono eseguiti dalla shell corrente come se fossero stati digitati nel terminale invece di essere eseguiti tramite uno script in una subshell. Gli script possono accedere alle variabili locali in questo modo.

Penso che sia un'informazione abbastanza buona sulla subshell in Linux.

Ne hai una migliore comprensione ora o sei confuso più che mai? Sentiti libero di esprimerti nei commenti come membro di LHB.


Linux
  1. Come impostare la tua variabile $PATH in Linux

  2. Che cos'è un utente Linux?

  3. Perché una variabile è visibile in una subshell?

  4. Come cambiare la shell in Linux

  5. Quali sono i diversi tipi di shell in Linux?

Spiegazione del comando di esportazione in Linux

Che cos'è Login Shell in Linux?

Che cos'è Shebang negli script della shell di Linux?

Che cos'è la media del carico in Linux?

Che cos'è il file .bashrc in Linux?

Cos'è un file .sh?