Opi ero hankinnan ja haarautumisen välillä Bashissa
Tämän artikkelin pääpaino on ymmärtää selkeästi, mitä tapahtuu, kun suoritat komentosarjan vs. lähdät komentosarjan bashissa. Ensinnäkin ymmärrämme selvästi, miten ohjelma lähetetään, kun soitat komentosarjaa eri tavoin.
HUOMAUTUS: komentosarjan luominen laajennuksella ei ole väliä. Skripti toimii hyvin myös ilman laajennuksia.
Periaatteessa jokainen komentosarja alkaa rivillä, jota kutsutaan shebangiksi (#!). Bashissa oleva Hash-symboli tulkitaan kommentteina, mutta shebangilla on erityinen merkitys. Se kehottaa bashia lähettämään ohjelman missä tahansa tulkissa, jonka mainitsit shebangissa.
Alla on esimerkkiohjelma ja määritän tulkkini bash.
$ cat >> Hello_World.sh #!/usr/bin/env bash echo "Hello world" $ chmod +x Hello_world.sh
Nyt voit suorittaa komentosarjan kahdella tavalla.
- Käytä komentosarjaa suhteellisen polun avulla. Siirry hakemistoon, jossa komentosarja on, ja suorita ./Hello_world.sh.
- Käytä komentosarjaa absoluuttisella polulla. Kirjoita koko polku komentosarjaan mistä tahansa tiedostojärjestelmästä.
$ ./Hello_world.sh $ pwd $ /home/karthick/Hello_world
Katsotaan nyt, mitä tapahtuu, kun yrität lähettää ohjelmasi ilman shebangia. Shebangin puuttuessa ohjelma lähetetään mihin tahansa nykyiseen kuoreen, jossa käytät. Minun tapauksessani se on Bash (/ bin/bash).
Haluan osoittaa esimerkin. Luon python-komentosarjaa ilman shebangia, ja kun soitan ohjelmaan, bash ei tiedä, että sen pitäisi lähettää tämä ohjelma python-tulkkiin, sen sijaan, että se suorittaa ohjelman nykyisessä kuoressa.
$ cat > run-py.py echo $SHELL print("Hello world") $ chmod +x run-py.py $ ./run-py.py
Tällöin voit soittaa ohjelmaan mainitsemalla, mille tulkkille se tulisi lähettää, tai lisätä vain shebang-rivi, jota aina suositellaan.
# which python3 $(which python3) /home/karthick/run_py.py
Nyt kun tiedät kuinka kutsua komentosarjaa, seuraava askel olisi ymmärtää mitä tapahtuu, kun kutsumme komentosarjaa. Kun kutsut komentosarjan yllä olevien esimerkkien mukaisesti, se luo aliprosessin (haarautuminen) ja komentosarja lähetetään aliprosessiin. Suoritin esimerkkikoodin, joka suorittaa vain seuraavan komennon ja osoittaa, että komentosarja on lähetetty aliprosessiin.
$ ps -ef --forest | grep -i bash
Komentosarjassa voi olla useita aliprosesseja ja se riippuu koodistamme. On huomattava, että alaindeksin luomat ympäristömuuttujat pudotetaan, kun se on valmis. Lapsiprosessi voi käyttää vanhemman prosessin luomia muuttujia viemällä ne. Mutta vanhempien prosessi ei voi käyttää aliprosessin luomia muuttujia.
Tutustu alla oleviin artikkeleihin saadaksesi lisätietoja muuttujien toiminnasta ja muuttujien viennistä.
- Linux-muuttujien ymmärtäminen ja kirjoittaminen Shell-komentosarjoissa
- Opi $$: n ja $BASHPID: n välinen ero Bashissa
Skriptin hankinta
"Lähde" on komentotulkin sisäinen komento, joka lukee argumenttina välitetyn tiedoston ja suorittaa koodin nykyisessä shell-ympäristössä. Sopiva käyttötapa, jota käytät enimmäkseen, on kokoonpanon muokkaaminen .bashrc
tai .bash_profile
-kohdassa ja muutosten lataaminen uudelleen lähdekomennolla.
$ type -a source
Lähdekomentoa voidaan suorittaa kahdella syntaktisella tavalla. Voit valita kenen tahansa kahdesta syntaksista, ja se on henkilökohtainen valinta.
$ source FILE_NAME [ARGUMENTS] $ . FILE_NAME [ARGUMENTS]
Haluan osoittaa, miten lähde todella toimii. Aion luoda kaksi komentosarjaa. Ensimmäisessä komentosarjassa (Module.sh) on joitain muuttujia ja toimintoja. Toinen komentosarja (Main.sh) tulostaa muuttujan ja kutsuu funktion.
Tiedosto Module.sh.
#!/usr/bin/env bash VAR1=$(echo "Welcome to $1") function f1(){ echo “Function f1 is called” }
Tiedosto Main.sh.
#!/usr/bin/env bash echo $VAR1 f1
Aseta komentosarjan suoritusoikeus ja soita pääkomentoon ”main.sh”. Nyt tämä komentosarja yrittää löytää funktion f1
ja muuttujan VAR1
nykyisestä shell-ympäristöstä ja epäonnistuu, kun komentoa ei löydy.
$ bash main.sh
Suoritetaan nyt lähdekomento komentosarjan sisällä, joka lataa muuttujan ja toiminnot nykyiseen shell-ympäristöön ja johon pääsee osoitteesta "main.sh".
Tiedosto Module.sh.
#!/usr/bin/env bash VAR1=$(echo "Welcome to $1") function f1(){ echo "Function f1 is called" }
Tiedosto Main.sh.
#!/usr/bin/env bash source module.sh Tecmint echo $VAR1 f1
Suorita nyt komentosarja uudelleen ja katso.
$ bash main.sh
Lähde on erittäin hyödyllinen bashissa modulaarisen ohjelmointitavan noudattamiseksi kuoriskriptiemme luomisessa. Voimme jakaa koodin pienempiin moduuleihin ja sitä voidaan käyttää monissa ohjelmissa. Näillä tavoilla voimme noudattaa DRY (Don’t Repeat Yourself) -periaatetta.
Se on tässä artikkelissa. Olemme keskustelleet lyhyesti erosta bashin hankinnan ja haaroittamisen välillä. Käy artikkelin läpi ja jaa arvokasta palautettasi meille.