Uporaba ukaza Exec v lupinskih skriptih

Uporaba Ukaza Exec V Lupinskih Skriptih



Ta priročnik podrobneje opisuje ukaz exec in njegovo uporabo v lupinskih skriptih.

Predpogoji:

Za izvedbo korakov, prikazanih v tem priročniku, potrebujete naslednje komponente:

  • Funkcionalen sistem Linux. Izvedite več o nastavitev Ubuntu VM z uporabo VirtualBox .
  • Dostop do a nekorenski uporabnik s privilegiji sudo .
  • Primeren urejevalnik besedil. Na primer: zakaj / NeoVim , Nano , Vzvišeno besedilo , VSCodium itd.

Ukaz Exec

Ukaz exec sam po sebi ni ločeno orodje:







$ ki izv



Namesto tega je notranji ukaz lupine Bash:



$ moški izv





Kot nakazuje opis s strani z navodili, če je ukaz podan, exec z njim nadomesti lupino in ne sproži nobenega dodatnega procesa. Na voljo je peščica možnosti, ki spreminjajo vedenje ukaza exec.



Osnovna uporaba

Pri zagonu ukaza Bash privzeto ustvari podlupino in razcepi ukaz.

$ odmev $$ && spati 999

$ pstree -str

Tukaj ukaz echo natisne PID trenutne lupine. Lupina Bash (PID: 978) ustvari nov podrejeni proces za delo z ukazom spanja (PID: 8369).

Kaj pa, če zaženemo ukaz za spanje z uporabo exec?

$ odmev $$ && izv spati 999

$ pstree -p

Nadrejeni proces Bash je nadomeščen z ukazom spanja. Po uspešni izvedbi se ne vrne v lupino. Namesto tega se seja prekine.

Čisto okolje

Privzeta konfiguracija Bash je opremljena s kupom popravkov in spremenljivk okolja. V določenem scenariju (na primer odpravljanje napak) boste morda želeli zagnati skript/program v čistem okolju. S pomočjo exec lahko zaženemo čist primerek lupine namesto trenutnega.

Najprej uporabite ukaz printenv za seznam vseh spremenljivk okolja, ki so trenutno konfigurirane:

$ printenv

Zdaj uporabite exec za zagon čistega primerka:

$ izv -c bash

$ printenv

Zagon drugačne lupine

Poleg Bash in »sh« je na voljo več drugih lupinskih programov, vsak s svojimi edinstvenimi ugodnostmi. Če program/skript zahteva določeno lupino, lahko uporabite exec za zamenjavo trenutne lupine Bash z želeno.

V naslednjem primeru zamenjamo Bash s 'sh':

$ pstree -str

$ izv sh

$ pstree -str

Uporaba Exec v skriptih

Ko smo se naučili osnov, lahko zdaj začnemo uporabljati exec v naših lupinskih skriptih.

Primer 1: Delo z različnimi lupinami

Oglejte si ta skript:

#!/bin/bash

odmev $ŠKOLJKA

odmev 'echo zsh se je uspešno zagnal' > zsh.sh

izv zsh zsh.sh

Tukaj prvi ukaz echo natisne trenutno lupino. Privzeto bi moral biti Bash. Nato ukaz exec zažene »zsh«, da izvede skript »zsh.sh«.

Zaženite naslednji skript:

$ . / test.sh

2. primer: preglasitev obstoječega procesa

Kadarkoli pokliče ukaz/program, Bash sproži nov proces. V večini primerov ni zaskrbljujoče. Ko pa delate s sistemom z zelo omejenimi viri (na primer vgrajena strojna oprema), lahko pomaga uporaba exec za preglasitev obstoječega procesa v pomnilniku.

Oglejte si ta skript:

#!/bin/bash

pstree -str

izv pstree -str

odmev 'Pozdravljen, svet'

Tukaj prvi ukaz pstree prikazuje izvirno postavitev drevesa procesa. Ko je ukaz exec izveden, drugi ukaz pstree nadomesti delujočo lupino. Ukaz echo v zadnji vrstici se ni izvršil.

Zaženite naslednji skript:

$ . / test.sh

Ker je bil del skripte, se po uspešni izvedbi vrnemo na izvirno lupino.

Ker ukaz exec zamenja nadrejeno lupino z drugim ukazom/programom, postane katera koli koda po tem neveljavna. Bodite previdni, ko jih uporabljate v svojih skriptih.

Primer 3: Sečnja

Lupina Bash ponuja 3 edinstvene deskriptorje datotek za kateri koli program/skript, ki se izvaja:

  • STDOUT (1): standardni izhod, shrani običajni izhod
  • STDERR (2): standardna napaka, shrani sporočila o napakah
  • STDIN (0): standardni vhod

Z uporabo exec lahko te deskriptorje datotek preusmerimo na drugo lokacijo, na primer: datoteke dnevnika. Lahko pomaga pri odpravljanju napak in beleženju na splošno.

Na splošno, če želite preusmeriti STDOUT in STDERR v dnevniško datoteko, uporabite operater preusmeritve:

$ odmev $$ | majica test.log

$ menih 2 >& 1 | majica test.log

Ta metoda zahteva preusmeritev na vsaki točki, kjer se želite prijaviti. Za rešitev te težave lahko uporabimo ukaz exec za ustvarjanje trajne preusmeritve za lupinsko sejo. Oglejte si naslednji primer:

#!/bin/bash

> test.log

izv 1 >> test.log

izv 2 >& 1

odmev 'Pozdravljen, svet'

napačen_ukaz

Tukaj prva vrstica ustvari prazno datoteko dnevnika. Prvi ukaz exec vzpostavi trajno preusmeritev STDOUT v datoteko dnevnika. Drugi ukaz exec preusmeri STDERR na STDOUT.

S to nastavitvijo se vsi izhodi in sporočila o napakah prenesejo v dnevniško datoteko:

$ . / test.sh

$ mačka test.log

Kaj pa, če skript ustvari neprekinjene vnose v dnevnik?

#!/bin/bash

> test.log

izv 1 >> test.log

izv 2 >& 1

medtem prav

narediti

odmev $NAKLJUČNO

spati 5

Končano

Tukaj, v prvem delu, ustvarimo trajno preusmeritev STDOUT in STDERR v našo dnevniško datoteko. Neskončna zanka while zažene ukaz echo, dokler ga ne zapremo na silo z uporabo »Ctrl + C«. Spremenljivka $RANDOM je posebna spremenljivka, ki vrne naključni niz ob vsakem dostopu.

Če želite preveriti vnos v dnevnik posodabljanja, uporabite naslednji ukaz tail:

$ rep -f test.log

Upoštevajte, da ta preusmeritev traja samo za lupinsko sejo.

Primer 4: Vnos iz datoteke

Podobno kot smo ustvarili stalno preusmeritev STDOUT in STDERR, jo lahko ustvarimo tudi za STDIN. Ker pa se za vnos uporablja STDIN, je izvedba nekoliko drugačna.

V naslednjem skriptu vzamemo STDIN iz datoteke:

#!/bin/bash

odmev 'odmev' Pozdravljen, svet '' > vnos

izv < vnos

prebrati line_1

eval $line_1

Tukaj v prvi vrstici uporabimo echo za ustvarjanje vsebine datoteke input_string s preusmeritvijo. Ukaz exec preusmeri vsebino input_string v STDIN trenutne seje lupine. Ko preberemo niz, uporabimo eval za obravnavanje vsebine $line_1 kot lupinske kode.

Zaženite naslednji skript:

$ . / test.sh

Zaključek

Razpravljali smo o ukazu exec v Bashu. Predstavili smo tudi različne načine uporabe v skriptih. Prikazali smo uporabo exec za delo z več lupinami, ustvarjanje pomnilniško učinkovitih skriptov in preusmerjanje deskriptorjev datotek.

To je le majhen del tega, kar lahko dosežemo s skriptom Bash. Več o skriptiranju Bash iz Bash programiranje podkategorija.

Veselo računalništvo!