Uzziniet atšķirību starp piegādēm un dakšu izgatavošanu Bashā


Šī raksta galvenā uzmanība ir skaidri jāsaprot, kas notiek, palaižot skriptu pret avotu skriptam bash. Pirmkārt, mēs skaidri sapratīsim, kā programma tiek iesniegta, ja dažādos veidos izsaucat skriptu.

PIEZĪME: skripta izveidei ar paplašinājumu nav nozīmes. Skripts darbosies labi pat bez paplašinājumiem.

Būtībā katrs skripts sākas ar līniju, ko sauc par šebangu (#!). Hash simbols basā tiks interpretēts kā komentāri, bet šebangam ir īpaša nozīme. Tas liek basham iesniegt programmu neatkarīgi no tulka, kuru jūs pieminējāt šebangā.

Zemāk ir programmas paraugs, un es kā tulku norādu bash.

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

$ chmod +x Hello_world.sh

Tagad, lai palaistu skriptu, to varat izdarīt divos veidos.

  • Izmantojiet relatīvo ceļu, lai izsauktu skriptu. Pārejiet uz direktoriju, kurā atrodas skripts, un palaidiet ./Hello_world.sh.
  • Izmantojiet absolūto ceļu, lai izsauktu skriptu. No jebkuras vietas failu sistēmā ierakstiet pilnu ceļu uz skriptu.

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

Tagad redzēsim, kas notiek, mēģinot iesniegt programmu bez šebanga. Ja nav shebang, programma tiks iesniegta neatkarīgi no pašreizējā čaulas, ar kuru jūs darbojaties. Manā gadījumā tas ir Bash (/ bin/bash).

Ļaujiet man parādīt piemēru. Es veidoju pitona skriptu bez shebang, un, piezvanot programmai, bash nezina, ka tai jāiesniedz šī programma pitona tulkotājam, tā vietā, lai palaistu programmu pašreizējā čaulā.

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

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

Šajā gadījumā jūs varat piezvanīt programmai, minot, kuram tulkotājam tā jāiesniedz, vai vienkārši pievienojiet vienmēr ieteicamo shebang līniju.

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

Tagad, kad jūs zināt, kā izsaukt skriptu, nākamais solis būtu saprast, kas notiek, kad mēs izsaucam skriptu. Kad jūs izsauksit skriptu, kā parādīts iepriekšējos piemēros, tas radīs bērnu procesu (dakšas), un skripts tiks iesniegts bērna procesam. Es izpildīju skripta paraugu, kas vienkārši izpildīs šo komandu un parādīs, ka skripts ir iesniegts bērna procesam.

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

Skripta ietvaros var būt vairāki pakārtoti procesi, un tas ir atkarīgs no mūsu koda. Jāatzīmē, ka ar indeksu izveidotie vides mainīgie tiks izmesti, tiklīdz tas būs pabeigts. Bērna process var piekļūt vecāku procesa izveidotajiem mainīgajiem, tos eksportējot. Bet vecāku process nevar piekļūt bērna procesa izveidotajiem mainīgajiem.

Apskatiet tālāk minētos rakstus, lai uzzinātu vairāk par mainīgo darbību un mainīgo mainīšanu.

  • “Linux mainīgo” izpratne un rakstīšana čaulas skriptos
  • Uzziniet atšķirību starp $$un $BASHPID Bashā

Skripta iegūšana

“Avots” ir čaulas iebūvētā komanda, kas nolasa failu, kas tam nodots kā arguments, un palaiž kodu pašreizējā čaulas vidē. Piemērots izmantošanas gadījums, kuru galvenokārt izmantojat, ir konfigurācijas modificēšana mapē .bashrc vai .bash_profile un izmaiņu ielāde, izmantojot avota komandu.

$ type -a source

Ir divi sintaktiski veidi, kā palaist avota komandu. Jūs varat izvēlēties jebkuru no divām sintaksēm, un tā ir personīga izvēle.

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

Ļaujiet man parādīt, kā avots faktiski darbojas. Es gatavojos izveidot divus čaulas skriptus. Pirmajā skriptā (Module.sh) būs daži mainīgie un funkcijas. Otrais skripts (Main.sh) gatavojas izdrukāt mainīgo un izsaukt funkciju.

Fails Module.sh.

#!/usr/bin/env bash

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

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

Fails Main.sh.

#!/usr/bin/env bash

echo $VAR1
f1

Iestatiet skripta izpildes atļauju un izsauciet galveno skriptu “main.sh”. Tagad šis skripts mēģinās atrast funkciju f1 un mainīgo VAR1 pašreizējā čaulas vidē un neizdosies, ja komanda nav atrasta.

$ bash main.sh

Tagad palaidīsim avota komandu skripta iekšienē, kas ielādēs mainīgo un funkcijas pašreizējā čaulas vidē, un kurai piekļūs “main.sh”.

Fails Module.sh.

#!/usr/bin/env bash

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

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

Fails Main.sh.

#!/usr/bin/env bash

source module.sh Tecmint
echo $VAR1
f1

Tagad palaidiet skriptu vēlreiz un redziet.

$ bash main.sh

Avots ir ļoti noderīgs bash, lai sekotu moduļu programmēšanas pieejai, veidojot mūsu čaulas skriptus. Mēs varam sadalīt mūsu kodu mazākos moduļos, un to var izmantot daudzās programmās. Šādā veidā mēs varam ievērot principu DRY (Don’t Repeat Yourself).

Tas ir šis raksts. Mēs īsi esam apsprieduši atšķirību starp izejmateriālu iegūšanu no bash. Izskatiet rakstu un dalieties ar mums savās vērtīgajās atsauksmēs.