Lærðu muninn á innkaupum og gaffli í Bash


Megináherslan í þessari grein er að skilja greinilega hvað gerist þegar þú keyrir handritið á móti uppspretta handritsins í bash. Í fyrsta lagi munum við skilja hvernig forritið er sent inn þegar þú hringir í handritið á mismunandi vegu.

ATH: að búa til handritið með viðbót skiptir ekki máli. Script mun keyra fínt jafnvel án framlenginga.

Í grundvallaratriðum byrjar hvert handrit á línu sem kallast shebang(#!). Hash táknið í bash verður túlkað sem athugasemdir en shebang hefur sérstaka merkingu. Það segir bash að senda forritið í hvaða túlk sem þú nefndir í shebang.

Hér að neðan eru sýnishorn af forriti og ég er að tilgreina bash sem túlkinn minn.

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

$ chmod +x Hello_world.sh

Nú til að keyra handritið geturðu gert það á tvo vegu.

  • Notaðu hlutfallslega slóð til að kalla skriftuna. Farðu í möppuna þar sem handritið er til staðar og keyrðu ./Hello_world.sh.
  • Notaðu algeru slóðina til að kalla á handritið. Hvar sem er í skráarkerfinu skaltu slá inn alla slóðina að handritinu.

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

Nú skulum við sjá hvað gerist þegar þú reynir að senda inn forritið þitt án shebang. Ef ekki er um shebang, verður forritið sent til hvaða núverandi skel sem þú keyrir með, í mínu tilfelli er það Bash (/bin/bash).

Leyfðu mér að sýna dæmi. Ég er að búa til python skriftu án shebang og þegar ég hringi í forritið veit bash ekki að það ætti að senda þetta forrit til python túlksins í staðinn mun það keyra forritið í núverandi skel.

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

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

Í þessu tilviki geturðu hringt í forritið með því að nefna á hvaða túlk það á að senda það eða bara bæta við shebang línunni sem alltaf er mælt með.

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

Nú þegar þú veist hvernig á að kalla handritið, þá væri næsta skref að skilja hvað gerist þegar við köllum í handritið. Þegar þú kallar fram handritið eins og sýnt er í dæmunum hér að ofan mun það búa til undirferli (gaffla) og handritið verður sent til undirferlisins. Ég keyrði sýnishorn af skriftu sem mun bara keyra eftirfarandi skipun og sýnir að handritið er sent til undirferlis.

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

Það geta verið mörg undirferli sem hluti af handritinu og það fer eftir kóðanum okkar. Það skal tekið fram að umhverfisbreytur sem búnar eru til með áskrift munu falla niður þegar þeim er lokið. Undirferli getur fengið aðgang að breytum sem búnar eru til af yfirferlinu með því að flytja þær út. En foreldraferlið hefur ekki aðgang að breytunum sem eru búnar til af barnferlinu.

Skoðaðu greinarnar hér að neðan til að skilja meira um hvernig breytur virka og hvernig á að flytja breyturnar út.

  • Skilning og ritun „Linux breytur“ í Shell Scripting
  • Lærðu muninn á $$og $BASHPID í Bash

Uppruni handritsins

\Source er innbyggð skel skipun sem les skrána sem er send sem rök fyrir hana og keyrir kóðann í núverandi skel umhverfi. Viðeigandi notkunartilvik sem þú notar aðallega er að breyta stillingunum þínum í .bashrc eða .bash_profile og endurhlaða breytingarnar með frumskipuninni.

$ type -a source

Það eru tvær setningafræðilegar leiðir til að keyra frumskipunina. Þú getur valið hvern sem er úr tveimur setningafræði og það er að eigin vali.

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

Leyfðu mér að sýna fram á hvernig heimildin virkar í raun. Ég ætla að búa til tvö skeljaforskrift. Fyrsta handritið (Module.sh) mun geyma nokkrar breytur og aðgerðir. Annað handritið (Main.sh) ætlar að prenta breytuna og kalla aðgerðina.

Skráin Module.sh.

#!/usr/bin/env bash

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

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

Skrá Main.sh.

#!/usr/bin/env bash

echo $VAR1
f1

Stilltu framkvæmdarheimildina fyrir skriftuna og hringdu í aðalskriftuna \main.sh. Nú mun þetta skriftu reyna að finna aðgerðina f1 og breytuna VAR1 í núverandi skel umhverfi og mun mistakast með skipunina fannst ekki.

$ bash main.sh

Nú skulum við keyra frumskipunina inni í handritinu sem mun hlaða breytunni og virka inn í núverandi skel umhverfi og það verður aðgengilegt fyrir main.sh.

Skráin Module.sh.

#!/usr/bin/env bash

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

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

Skrá Main.sh.

#!/usr/bin/env bash

source module.sh Tecmint
echo $VAR1
f1

Keyrðu nú handritið aftur og sjáðu.

$ bash main.sh

Heimildin er mjög gagnleg í bash til að fylgja mát forritunaraðferðinni við að búa til skeljaforskriftir okkar. Við getum skipt kóðanum okkar í smærri einingar og hægt er að nota hann í mörgum forritum. Á þennan hátt getum við fylgt DRY (Don't Repeat Yourself) meginreglunni.

Það er það fyrir þessa grein. Við höfum stuttlega fjallað um muninn á uppsprettu og gaffli í bash. Farðu í gegnum greinina og deildu dýrmætu áliti þínu með okkur.