Pagkat-on sa Kalainan Tali sa Sourcing ug Forking sa Bash


Ang panguna nga pokus sa kini nga artikulo mao ang tin-aw nga pagsabut kung unsa ang mahitabo kung imong gipadagan ang script kumpara sa gigikanan sa script sa bash. Una, klaro natong masabtan kung giunsa ang pagsumite sa programa kung imong tawagan ang script sa lainlaing mga paagi.

PAHINUMDOM: ang paghimo sa script nga adunay extension dili igsapayan. Maayo nga modagan ang script bisan kung wala’y mga extension.

Sa panguna, ang matag script nagsugod sa usa ka linya nga gitawag og shebang(#!). Ang simbolo sa Hash sa bash hubaron nga mga komento apan ang shebang adunay espesyal nga kahulugan. Gisultihan niini ang bash nga isumite ang programa sa bisan unsang tighubad nga imong gihisgutan sa shebang.

Sa ubos usa ka sampol nga programa ug akong gipiho ang bash isip akong tighubad.

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

$ chmod +x Hello_world.sh

Karon aron mapadagan ang script, mahimo nimo kini sa duha ka paagi.

  • Paggamit ug relatibong dalan sa pagtawag sa script. Ibalhin ngadto sa direktoryo diin anaa ang script ug pagdagan ./Hello_world.sh.
  • Gamita ang hingpit nga dalan sa pagtawag sa script. Gikan sa bisan asa sa file system i-type ang tibuok nga agianan paingon sa script.

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

Karon atong tan-awon kung unsa ang mahitabo kung imong gisulayan nga isumite ang imong programa nga wala’y shebang. Kung wala ang shebang, ang programa isumite sa bisan unsang karon nga kabhang nga imong gipadagan, Sa akong kaso, kini Bash (/bin/bash).

Tugoti ako nga magpakita ug usa ka pananglitan. Naghimo ako usa ka script sa python nga wala’y shebang ug kung tawagan nako ang programa, wala mahibal-an ni bash nga kinahanglan nga isumite kini nga programa sa tighubad sa python imbis nga ipadagan ang programa sa karon nga kabhang.

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

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

Sa kini nga kaso, mahimo nimong tawagan ang programa pinaagi sa paghisgot kung unsang tighubad kini kinahanglan isumite o idugang lang ang linya sa shebang nga kanunay girekomenda.

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

Karon nga nahibal-an na nimo kung giunsa pagtawag ang script, ang sunod nga lakang mao ang pagsabut kung unsa ang mahitabo kung tawagan namon ang script. Kung imong gihangyo ang script sama sa gipakita sa mga pananglitan sa ibabaw maghimo kini usa ka proseso sa bata (forking) ug ang script isumite sa proseso sa bata. Nagdagan ako usa ka sample nga script nga modagan lang sa mosunud nga mando ug gipakita nga ang script gisumite sa usa ka proseso sa bata.

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

Mahimong adunay daghang mga proseso sa bata ingon usa ka bahin sa script ug nagdepende kana sa among code. Kinahanglan nga hinumdoman nga ang mga variable sa kalikopan nga gihimo sa subscript ihulog kung kini mahuman. Ang proseso sa bata maka-access sa mga variable nga gihimo sa proseso sa ginikanan pinaagi sa pag-eksport niini. Apan ang proseso sa ginikanan dili maka-access sa mga variable nga gihimo sa proseso sa bata.

Tan-awa ang mga artikulo sa ubos aron mas masabtan kung giunsa ang paglihok sa mga variable ug kung giunsa ang pag-eksport sa mga variable.

  • Pagsabot ug Pagsulat sa 'Linux Variables' sa Shell Scripting
  • Pagkat-on sa Kalainan Tali sa $$ug $BASHPID sa Bash

Pagkuha sa Script

Ang \Source kay usa ka shell built-in nga command nga nagbasa sa file nga gipasa isip argumento niini ug nagpadagan sa code sa kasamtangan nga shell environment. Ang angay nga use case nga kasagaran nimong gigamit mao ang pag-usab sa imong configuration sa .bashrc o .bash_profile ug i-reload ang mga kausaban gamit ang source command.

$ type -a source

Adunay duha ka syntactic nga paagi sa pagpadagan sa source command. Makapili ka bisan kinsa gikan sa duha ka syntax ug kini personal nga kapilian.

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

Tugoti ako nga ipakita kung giunsa ang gigikanan sa tinuud nga paglihok. Maghimo kog duha ka shell script. Ang una nga script (Module.sh) maghupot sa pipila ka mga variable ug mga gimbuhaton. Ang ikaduha nga script (Main.sh) mag-imprinta sa variable ug tawagan ang function.

File Module.sh.

#!/usr/bin/env bash

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

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

File Main.sh.

#!/usr/bin/env bash

echo $VAR1
f1

Ibutang ang permiso sa pagpatuman alang sa script ug tawga ang main script nga \main.sh. Karon, kini nga script mosulay sa pagpangita sa function f1 ug variable VAR1 sa kasamtangan shell environment ug mapakyas sa command not found.

$ bash main.sh

Karon atong padaganon ang source command sulod sa script nga magkarga sa variable ug mogana sa kasamtangang shell environment ug kana ma-access sa \main.sh.

File Module.sh.

#!/usr/bin/env bash

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

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

File Main.sh.

#!/usr/bin/env bash

source module.sh Tecmint
echo $VAR1
f1

Karon pagdagan ang script pag-usab ug tan-awa.

$ bash main.sh

Ang tinubdan mapuslanon kaayo sa bash aron sundon ang modular programming approach sa paghimo sa atong shell scripts. Mahimo natong bungkagon ang atong code ngadto sa mas gagmay nga mga module ug magamit sa daghang mga programa. Niining mga paagiha, masunod nato ang prinsipyo sa DRY (Do not Repeat Yourself).

Mao kana alang niini nga artikulo. Gihisgutan namon sa kadali ang kalainan tali sa sourcing ug forking sa bash. Lakaw pinaagi sa artikulo ug ipaambit ang imong bililhong feedback kanamo.