Apreneu la diferència entre l'obtenció i la bifurcació a Bash


L'objectiu principal d'aquest article és entendre clarament què passa quan executeu l'script contra l'origen de l'script a bash. En primer lloc, entendrem clarament com s'envia el programa quan truqueu el guió de diferents maneres.

NOTA: crear l'script amb una extensió no importa. L'script funcionarà bé fins i tot sense extensions.

Bàsicament, cada script comença amb una línia anomenada shebang (#!). El símbol Hash a bash s'interpretarà com a comentaris, però shebang té un significat especial. Li diu a bash que enviï el programa amb qualsevol intèrpret que hàgiu esmentat a shebang.

A continuació es mostra un programa de mostra i estic especificant bash com a intèrpret.

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

$ chmod +x Hello_world.sh

Ara per executar l'script, podeu fer-ho de dues maneres.

  • Utilitzeu un camí relatiu per cridar l'script. Aneu al directori on hi ha l'script i executeu ./Hello_world.sh.
  • Utilitzeu el camí absolut per cridar l'script. Des de qualsevol lloc del sistema de fitxers, escriviu el camí complet a l'script.

$ ./Hello_world.sh
$ pwd
$ /home/karthick/Hello_world

Ara vegem què passa quan intenteu enviar el vostre programa sense shebang. En absència de shebang, el programa s'enviarà a qualsevol intèrpret d'ordres actual amb el qual esteu executant, en el meu cas, és Bash (/bin/bash).

Permeteu-me demostrar un exemple. Estic creant un script de Python sense shebang i quan truco al programa, bash no sap que hauria d'enviar aquest programa a l'intèrpret de Python, en lloc d'executar el programa a l'intèrpret d'ordres actual.

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

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

En aquest cas, podeu trucar al programa esmentant a quin intèrpret s'ha d'enviar o simplement afegir la línia shebang que sempre es recomana.

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

Ara que ja sabeu com cridar l'script, el següent pas seria entendre què passa quan cridem l'script. Quan invoqueu l'script tal com es mostra als exemples anteriors, es crearà un procés fill (bifurcació) i l'script s'enviarà al procés fill. Vaig executar un script de mostra que només executarà l'ordre següent i mostra que l'script s'envia a un procés secundari.

$ ps -ef --forest | grep -i bash

Hi pot haver diversos processos secundaris com a part de l'script i això depèn del nostre codi. Cal tenir en compte que les variables ambientals creades per subíndex s'eliminaran un cop s'hagi acabat. Un procés fill pot accedir a variables creades pel procés pare exportant-les. Però el procés pare no pot accedir a les variables creades pel procés fill.

Fes una ullada als articles següents per entendre més sobre com funcionen les variables i com exportar-les.

  • Comprensió i escriptura de variables de Linux a Shell Scripting
  • Aprèn la diferència entre $$i $BASHPID a Bash

Obtenció del guió

\Font és una ordre integrada de l'intèrpret d'ordres que llegeix el fitxer passat com a argument i executa el codi a l'entorn de l'intèrpret d'ordres actual. Un cas d'ús adequat que utilitzeu principalment és modificar la vostra configuració a .bashrc o .bash_profile i torneu a carregar els canvis mitjançant l'ordre d'origen.

$ type -a source

Hi ha dues maneres sintàctiques d'executar l'ordre font. Podeu triar qualsevol entre dues sintaxis i és una elecció personal.

$ source FILE_NAME [ARGUMENTS]
$ . FILE_NAME [ARGUMENTS]

Permeteu-me demostrar com funciona realment la font. Vaig a crear dos scripts de shell. El primer script (Module.sh) conté algunes variables i funcions. El segon script (Main.sh) imprimirà la variable i cridarà la funció.

Fitxer Mòdul.sh.

#!/usr/bin/env bash

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

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

Fitxer Main.sh.

#!/usr/bin/env bash

echo $VAR1
f1

Estableix el permís d'execució de l'script i crida a l'script principal \main.sh. Ara, aquest script intentarà trobar la funció f1 i la variable VAR1 a l'actual entorn de shell i fallarà amb l'ordre no trobada.

$ bash main.sh

Ara executem l'ordre font dins de l'script que carregarà la variable i les funcions a l'entorn de l'intèrpret d'ordres actual i que serà accessible per \main.sh.

Fitxer Mòdul.sh.

#!/usr/bin/env bash

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

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

Fitxer Main.sh.

#!/usr/bin/env bash

source module.sh Tecmint
echo $VAR1
f1

Ara torneu a executar l'script i mireu.

$ bash main.sh

La font és molt útil a bash per seguir l'enfocament de programació modular per crear els nostres scripts d'intèrpret d'ordres. Podem dividir el nostre codi en mòduls més petits i es pot utilitzar en molts programes. D'aquesta manera, podem seguir el principi DRY (No et repeteixis).

Això és tot per aquest article. Hem comentat breument la diferència entre l'obtenció i la bifurcació a bash. Revisa l'article i comparteix els teus valuosos comentaris amb nosaltres.