Õppige Bashis hankimise ja hargnemise erinevust


Selle artikli põhirõhk on selgelt mõista, mis juhtub, kui käivitate skripti vs skripti allikas bashis. Esiteks saame skripti erineval viisil helistades selgelt aru, kuidas programm esitatakse.

MÄRKUS. Laiendiga skripti loomine pole oluline. Skript töötab hästi ka ilma laienditeta.

Põhimõtteliselt algab iga skript reaga, mida nimetatakse seebangiks (#!). Hashi sümbolit bashis tõlgendatakse kommentaaridena, kuid šebangil on eriline tähendus. See käsib bash'il programmi esitada mis tahes tõlgis, mille te shebangis mainisite.

Allpool on näidisprogramm ja täpsustan tõlkina bashi.

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

$ chmod +x Hello_world.sh

Nüüd skripti käivitamiseks saate seda teha kahel viisil.

  • Kasutage skripti kutsumiseks suhtelist teed. Liikuge kataloogi, kus skript asub, ja käivitage ./Hello_world.sh.
  • Skripti kutsumiseks kasutage absoluutset teed. Tippige failisüsteemi suvalisest kohast skripti täielik tee.

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

Vaatame nüüd, mis juhtub, kui proovite oma programmi esitada ilma shebangita. Shebangi puudumisel esitatakse programm mis tahes praegusele kestale, millega te töötate. Minu puhul on see Bash (/ bin/bash).

Lubage mul näidet näidata. Ma loon ilma püstkoodita pythoni skripti ja kui programmile helistan, ei tea bash, et peaks selle programmi esitama pythoni tõlgile, selle asemel, et ta käivitaks programmi praeguses kestas.

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

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

Sellisel juhul võite programmi helistada, mainides, millisele tõlkile see tuleks edastada, või lisage lihtsalt shebangi rida, mida alati soovitatakse.

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

Nüüd, kui teate, kuidas skriptile helistada, oleks järgmine samm mõista, mis juhtub, kui me skripti kutsume. Kui käivitate skripti, nagu on näidatud ülaltoodud näidetes, loob see alamprotsessi (hargnemine) ja skript saadetakse alamprotsessi. Käivitasin skripti näidise, mis käivitab lihtsalt järgmise käsu ja näitab, et skript on alamprotsessile edastatud.

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

Skripti osana võib olla mitu alamprotsessi ja see sõltub meie koodist. Tuleb märkida, et alaindeksiga loodud keskkonnamuutujad loobutakse pärast selle valmimist. Lapseprotsess pääseb juurde vanemprotsessi loodud muutujatele, eksportides need. Kuid vanemprotsess ei pääse juurde lapseprotsessi loodud muutujatele.

Vaadake allolevaid artikleid, et saada lisateavet muutujate tööpõhimõtte ja muutujate eksportimise kohta.

  • „Linuxi muutujate” mõistmine ja kirjutamine Shelli skriptides
  • Lisateave $$ja $BASHPID erinevuse kohta Bashis

Skripti hankimine

Allikas on sisseehitatud shellikäsk, mis loeb talle argumendina edastatud faili ja käivitab koodi praeguses shellikeskkonnas. Sobiv kasutusjuht, mida enamasti kasutate, on konfiguratsiooni muutmine failis .bashrc või .bash_profile ja muudatuste uuesti laadimine käsuga source.

$ type -a source

Lähtekäsu käivitamiseks on kaks süntaktilist viisi. Võite valida igaühe kahest süntaksist ja see on isiklik valik.

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

Lubage mul näidata, kuidas allikas tegelikult töötab. Kavatsen luua kaks shelliskripti. Esimene skript (Module.sh) mahutab mõned muutujad ja funktsioonid. Teine skript (Main.sh) kavatseb muutuja printida ja funktsiooni kutsuda.

Fail Module.sh.

#!/usr/bin/env bash

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

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

Fail Main.sh.

#!/usr/bin/env bash

echo $VAR1
f1

Määrake skripti täitmisluba ja kutsuge põhiskripti "main.sh". Nüüd püüab see skript leida funktsiooni f1 ja muutuja VAR1 praeguses shellikeskkonnas ning nurjub, kui käsku ei leitud.

$ bash main.sh

Käivitame nüüd skripti sees käsu allikas, mis laadib muutuja ja funktsioonid praegusesse shellikeskkonda ning millele pääseb juurde aadressil „main.sh”.

Fail Module.sh.

#!/usr/bin/env bash

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

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

Fail Main.sh.

#!/usr/bin/env bash

source module.sh Tecmint
echo $VAR1
f1

Nüüd käivitage skript uuesti ja vaadake.

$ bash main.sh

Allikas on bashis väga kasulik, et järgida moodulprogrammeerimise lähenemist meie shelliskriptide loomisel. Saame jagada oma koodi väiksemateks mooduliteks ja seda saab kasutada paljudes programmides. Nii saame järgida põhimõtet DRY (Don’t Repeat Yourself).

See on selle artikli jaoks. Oleme lühidalt arutanud erinevust bashi hankimise ja hargnemise vahel. Tutvuge artikliga ja jagage meiega oma väärtuslikku tagasisidet.