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.