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.