Naučite se razlike med iskanjem in forkingom v Bashu


Glavni poudarek tega članka je jasno razumeti, kaj se zgodi, ko zaženete skript v primerjavi s skriptom v bash. Najprej bomo jasno razumeli, kako je program predložen, ko skript pokličete na različne načine.

OPOMBA: ustvarjanje skripta s pripono ni pomembno. Skripta bo delovala tudi brez razširitev.

V bistvu se vsak skript začne s črto, imenovano shebang (#!). Simbol Hash v bash bo razložen kot komentar, vendar ima shebang poseben pomen. Bashu sporoča, naj program odda v katerem koli tolmaču, ki ste ga omenili v shebang.

Spodaj je vzorčni program in kot svojega tolmača navajam bash.

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

$ chmod +x Hello_world.sh

Zdaj lahko zaženete skript na dva načina.

  • Za klic skripta uporabite relativno pot. Premaknite se v imenik, v katerem je skript, in zaženite ./Hello_world.sh.
  • Za klic skripta uporabite absolutno pot. Od kjer koli v datotečnem sistemu vnesite celotno pot do skripta.

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

Zdaj pa poglejmo, kaj se zgodi, ko poskušate oddati program brez shebanga. Če shebang ne bo, bo program poslan v katero koli trenutno lupino, s katero izvajate, v mojem primeru je Bash (/ bin/bash).

Naj predstavim primer. Ustvarjam skript python brez shebanga in ko pokličem program, bash ne ve, da bi moral ta program predložiti tolmaču python, namesto tega pa bo program zagnal v trenutni lupini.

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

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

V tem primeru lahko program pokličete tako, da navedete, pri katerem tolmaču ga je treba poslati, ali preprosto dodajte vrstico shebang, ki je vedno priporočljiva.

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

Zdaj, ko veste, kako poklicati skript, bi bil naslednji korak razumevanje, kaj se zgodi, ko pokličemo skript. Ko prikličete skript, kot je prikazano v zgornjih primerih, bo ustvaril podrejeni postopek (forking) in skript bo poslan v podrejeni postopek. Izvedel sem vzorčni skript, ki bo zagnal naslednji ukaz in pokazal, da je skript poslan v podrejeni postopek.

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

Kot del skripta je lahko več podrejenih procesov, kar je odvisno od naše kode. Opozoriti je treba, da bodo spremenljivke okolja, ustvarjene s podpisom, izpuščene, ko bodo končane. Otroški proces lahko dostopa do spremenljivk, ki jih je ustvaril nadrejeni proces, tako da jih izvozi. Toda nadrejeni proces ne more dostopati do spremenljivk, ki jih ustvari podrejeni proces.

Oglejte si spodnje članke, če želite izvedeti več o tem, kako delujejo spremenljivke in kako izvoziti spremenljivke.

  • Razumevanje in pisanje „Linux spremenljivk“ v skriptnem skriptu Shell
  • Naučite se razlike med $$in $BASHPID v Bashu

Pridobivanje skripta

\ "Vir" je vdelani ukaz lupine, ki bere datoteko, ki ji je posredovana kot argument, in zažene kodo v trenutnem okolju lupine. Ustrezen primer uporabe, ki ga večinoma uporabljate, je spreminjanje vaše konfiguracije v .bashrc ali .bash_profile in znova naložite spremembe z izvornim ukazom.

$ type -a source

Obstajata dva skladenjska načina za zagon izvornega ukaza. Izbirate lahko med dvema sintaksama in je osebna izbira.

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

Naj predstavim, kako vir dejansko deluje. Ustvaril bom dva skripta lupine. Prvi skript (Module.sh) bo vseboval nekaj spremenljivk in funkcij. Drugi skript (Main.sh) bo natisnil spremenljivko in poklical funkcijo.

Datotečni modul.sh.

#!/usr/bin/env bash

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

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

Datoteka Main.sh.

#!/usr/bin/env bash

echo $VAR1
f1

Nastavite dovoljenje za izvajanje skripta in pokličite glavni skript\"main.sh". Zdaj bo ta skript poskušal najti funkcijo f1 in spremenljivko VAR1 v trenutnem okolja lupine in ne bo uspel z ukazom, ki ga ni mogoče najti.

$ bash main.sh

Zdaj zaženimo izvorni ukaz znotraj skripta, ki bo nalagal spremenljivko in funkcije v trenutno lupinsko okolje in bo dostopen z\"main.sh".

Datotečni modul.sh.

#!/usr/bin/env bash

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

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

Datoteka Main.sh.

#!/usr/bin/env bash

source module.sh Tecmint
echo $VAR1
f1

Zdaj znova zaženite skript in poglejte.

$ bash main.sh

Vir je v bash zelo koristen za sledenje modularnemu programskemu pristopu pri ustvarjanju naših skriptov lupine. Kodo lahko razdelimo na manjše module in jo lahko uporabimo v številnih programih. Na te načine lahko sledimo načelu SUHO (Ne ponavljaj se).

To je to za ta članek. Na kratko smo razpravljali o razliki med iskanjem in vilicanjem v bashu. Preglejte članek in delite svoje dragocene povratne informacije z nami.