Ricerca nel sito web

Scopri la differenza tra sourcing e fork in Bash


L'obiettivo principale di questo articolo è comprendere chiaramente cosa succede quando si esegue lo script anziché il sorgente dello script in bash. Innanzitutto, capiremo chiaramente come viene presentato il programma quando chiami lo script in diversi modi.

NOTA: creare lo script con un'estensione non ha importanza. Lo script funzionerà correttamente anche senza estensioni.

Fondamentalmente, ogni script inizia con una riga chiamata shebang(#!). Il simbolo Hash in bash verrà interpretato come commenti ma shebang ha un significato speciale. Dice a bash di inviare il programma in qualunque interprete tu abbia menzionato in shebang.

Di seguito è riportato un programma di esempio e sto specificando bash come interprete.

cat >> Hello_World.sh
#!/usr/bin/env bash
echo "Hello world"

chmod +x Hello_world.sh

Ora per eseguire lo script, puoi farlo in due modi.

  • Utilizzare un percorso relativo per chiamare lo script. Passa alla directory in cui è presente lo script ed esegui ./Hello_world.sh.
  • Utilizzare il percorso assoluto per chiamare lo script. Da qualsiasi punto del file system digitare il percorso completo dello script.
./Hello_world.sh
pwd
/home/karthick/Hello_world

Ora vediamo cosa succede quando provi a inviare il tuo programma senza shebang. In assenza di shebang, il programma verrà inviato a qualunque shell corrente con cui stai utilizzando, nel mio caso è Bash (/bin/bash forte>).

Lasciatemi dimostrare un esempio. Sto creando uno script Python senza shebang e quando chiamo il programma, bash non sa che dovrebbe inviare questo programma all'interprete Python, invece eseguirà il programma nella shell corrente.

cat > run-py.py
echo $SHELL
print("Hello world")

chmod +x run-py.py
./run-py.py

In questo caso potete richiamare il programma indicando a quale interprete sottoporlo o semplicemente aggiungere la riga shebang che è sempre consigliata.

which python3
$(which python3) /home/karthick/run_py.py

Ora che sai come chiamare lo script, il passo successivo è capire cosa succede quando chiamiamo lo script. Quando invochi lo script come mostrato negli esempi precedenti, verrà creato un processo figlio (forking) e lo script verrà inviato al processo figlio. Ho eseguito uno script di esempio che eseguirà semplicemente il comando seguente e mostrerà che lo script è inviato a un processo figlio.

ps -ef --forest | grep -i bash

Possono esserci più processi secondari come parte dello script e ciò dipende dal nostro codice. È da notare che le variabili ambientali create da subscript verranno eliminate una volta terminato. Un processo figlio può accedere alle variabili create dal processo genitore esportandole. Ma il processo genitore non può accedere alle variabili create dal processo figlio.

Dai un'occhiata agli articoli seguenti per capire di più su come funzionano le variabili e su come esportare le variabili.

  • Comprendere e scrivere "variabili Linux" nello scripting di shell
  • Scopri la differenza tra $$e $BASHPID in Bash

Origine della sceneggiatura

"Sorgente " è un comando integrato nella shell che legge il file passato come argomento ed esegue il codice nell'ambiente shell corrente. Un caso d'uso appropriato che utilizzi principalmente è la modifica della configurazione in .bashrc o .bash_profile e il ricaricamento delle modifiche utilizzando il comando source.

type -a source

Esistono due modi sintattici per eseguire il comando source. Puoi scegliere chiunque tra due sintassi ed è una scelta personale.

source FILE_NAME [ARGUMENTS]
. FILE_NAME [ARGUMENTS]

Lasciatemi dimostrare come funziona effettivamente la fonte. Creerò due script di shell. Il primo script (Module.sh) conterrà alcune variabili e funzioni. Il secondo script (Main.sh) stamperà la variabile e chiamerà la funzione.

File Module.sh.

#!/usr/bin/env bash

VAR1=$(echo "Welcome to $1")

function f1(){
  echo “Function f1 is called”
}

File Main.sh.

#!/usr/bin/env bash

echo $VAR1
f1

Imposta i permessi di esecuzione per lo script e richiama lo script principale “main.sh ”. Ora, questo script proverà a trovare la funzione f1 e la variabile VAR1 nell'ambiente shell corrente e fallirà con il comando non trovato.

bash main.sh

Ora eseguiamo il comando source all'interno dello script che caricherà la variabile e le funzioni nell'ambiente shell corrente e che sarà accessibile da “main.sh ”.

File Module.sh.

#!/usr/bin/env bash

VAR1=$(echo "Welcome to $1")

function f1(){
  echo "Function f1 is called"
}

File Main.sh.

#!/usr/bin/env bash

source module.sh Tecmint
echo $VAR1
f1

Ora esegui di nuovo lo script e guarda.

bash main.sh

Il sorgente è molto utile in bash per seguire l'approccio di programmazione modulare nella creazione dei nostri script di shell. Possiamo suddividere il nostro codice in moduli più piccoli e possiamo utilizzarlo in molti programmi. In questo modo possiamo seguire il principio DRY (Don't Repeat Yourself).

Per questo articolo è tutto. Abbiamo discusso brevemente la differenza tra sourcing e fork in bash. Leggi l'articolo e condividi con noi il tuo prezioso feedback.