Upotreba naredbe Exec u Shell skriptama

Upotreba Naredbe Exec U Shell Skriptama



Ovaj vodič razrađuje naredbu exec i njezinu upotrebu u skriptama ljuske.

Preduvjeti:

Za izvođenje koraka koji su prikazani u ovom vodiču potrebne su vam sljedeće komponente:

  • Funkcionalan Linux sustav. Nauči više o postavljanje Ubuntu VM-a pomoću VirtualBoxa .
  • Pristup a ne-root korisnik sa sudo privilegijom .
  • Prikladan uređivač teksta. Na primjer: Zašto / NeoVim , Nano , Uzvišeni tekst , VSCodium itd.

Naredba Exec

Naredba exec sama po sebi nije zaseban alat:







$ koji izvrs



Umjesto toga, to je interna naredba Bash ljuske:



$ čovjek izvrs





Kao što sugerira opis sa stranice priručnika, ako je navedena naredba, exec njome zamjenjuje ljusku, ne stvarajući nikakav dodatni proces. Postoji pregršt dostupnih opcija koje mijenjaju ponašanje naredbe exec.



Osnovna upotreba

Prema zadanim postavkama, kad god pokrene naredbu, Bash stvara podljusku i račva naredbu.

$ jeka $$ && spavati 999

$ pstree -str

Ovdje naredba echo ispisuje PID trenutne ljuske. Bash ljuska (PID: 978) stvara novi podređeni proces za rad s naredbom spavanja (PID: 8369).

Sada, što ako pokrenemo naredbu sleep koristeći exec?

$ jeka $$ && izvrs spavati 999

$ pstree -p

Nadređeni Bash proces zamijenjen je naredbom sleep. Nakon uspješnog izvršenja, ne vraća se u ljusku. Umjesto toga, sesija se prekida.

Čist okoliš

Zadana Bash konfiguracija dolazi s hrpom podešavanja i varijabli okruženja. U određenom scenariju (otklanjanje pogrešaka, na primjer), možda ćete htjeti pokrenuti svoju skriptu/program u čistom okruženju. Uz pomoć exec-a, možemo pokrenuti čistu instancu ljuske umjesto trenutne.

Prvo upotrijebite naredbu printenv za popis svih varijabli okoline koje su trenutno konfigurirane:

$ printenv

Sada upotrijebite exec za pokretanje čiste instance:

$ izvrs -c udarac

$ printenv

Pokretanje drugačije školjke

Osim Basha i 'sh', dostupno je više drugih programa ljuske, svaki sa svojim jedinstvenim pogodnostima. Ako program/skripta zahtijeva određenu ljusku, možete koristiti exec za zamjenu trenutne Bash ljuske željenom.

U sljedećem primjeru zamjenjujemo Bash sa 'sh':

$ pstree -str

$ izvrs sh

$ pstree -str

Korištenje Execa u skriptama

Nakon što smo riješili osnove, sada možemo početi koristiti exec u našim shell skriptama.

Primjer 1: Rad s različitim školjkama

Pogledajte sljedeću skriptu:

#!/bin/bash

jeka $ŠKOLJKA

jeka 'echo zsh uspješno pokrenut' > zsh.sh

izvrs zsh zsh.sh

Ovdje prva echo naredba ispisuje trenutnu ljusku. Prema zadanim postavkama trebao bi biti Bash. Zatim, naredba exec pokreće 'zsh' za izvođenje skripte 'zsh.sh'.

Pokrenite sljedeću skriptu:

$ . / test.sh

Primjer 2: Nadjačavanje postojećeg procesa

Kad god pozove naredbu/program, Bash pokreće novi proces. U većini situacija to nije razlog za zabrinutost. Međutim, kada radite sa sustavom s vrlo ograničenim resursima (ugrađeni hardver, na primjer), korištenje exec za nadjačavanje postojećeg procesa u memoriji može pomoći.

Pogledajte sljedeću skriptu:

#!/bin/bash

pstree -str

izvrs pstree -str

jeka 'Pozdrav svijete'

Ovdje prva naredba pstree prikazuje izvorni izgled stabla procesa. Nakon što se izvrši naredba exec, druga naredba pstree zamjenjuje pokrenutu ljusku. Naredba echo u zadnjem retku nije se izvršila.

Pokrenite sljedeću skriptu:

$ . / test.sh

Budući da je bio dio skripte, vraćamo se na izvornu ljusku nakon uspješnog izvođenja.

Kako naredba exec zamjenjuje nadređenu ljusku drugom naredbom/programom, svaki kod nakon toga postaje nevažeći. Budite oprezni kada ih koristite u svojim skriptama.

Primjer 3: Sječa

Bash ljuska nudi 3 jedinstvena deskriptora datoteke svakom pokrenutom programu/skripti:

  • STDOUT (1): standardni izlaz, pohranjuje normalan izlaz
  • STDERR (2): standardna pogreška, pohranjuje poruke o pogrešci
  • STDIN (0): standardni unos

Koristeći exec, možemo preusmjeriti ove deskriptore datoteka na drugu lokaciju, na primjer: datoteke dnevnika. Može pomoći s otklanjanjem pogrešaka i općenito zapisivanjem.

Općenito, ako želite preusmjeriti STDOUT i STDERR u datoteku dnevnika, koristite operator preusmjeravanja:

$ jeka $$ | tee test.log

$ redovnik 2 >& 1 | tee test.log

Ova metoda zahtijeva preusmjeravanje na svakoj točki koju želite prijaviti. Da bismo riješili ovaj problem, možemo koristiti naredbu exec za stvaranje trajnog preusmjeravanja za sesiju ljuske. Pogledajte sljedeći primjer:

#!/bin/bash

> test.log

izvrs 1 >> test.log

izvrs 2 >& 1

jeka 'Pozdrav svijete'

pogrešna_naredba

Ovdje prvi red stvara praznu datoteku dnevnika. Prva exec naredba uspostavlja trajno preusmjeravanje STDOUT-a na datoteku dnevnika. Druga exec naredba preusmjerava STDERR na STDOUT.

Uz ovu postavku, svi izlazi i poruke o pogreškama se ispisuju u datoteku dnevnika:

$ . / test.sh

$ mačka test.log

Što ako skripta generira stalne unose u dnevnik?

#!/bin/bash

> test.log

izvrs 1 >> test.log

izvrs 2 >& 1

dok pravi

čini

jeka $SLUČAJNO

spavati 5

učinjeno

Ovdje, u prvom dijelu, stvaramo trajno preusmjeravanje STDOUT-a i STDERR-a na našu datoteku dnevnika. Beskonačna while petlja pokreće naredbu echo dok je prisilno ne zatvorimo pomoću “Ctrl + C”. Varijabla $RANDOM je posebna varijabla koja vraća nasumični niz svaki put kada joj se pristupi.

Za provjeru unosa dnevnika ažuriranja upotrijebite sljedeću naredbu repa:

$ rep -f test.log

Imajte na umu da ovo preusmjeravanje traje samo za sesiju ljuske.

Primjer 4: Unos iz datoteke

Slično kao što smo stvorili trajno STDOUT i STDERR preusmjeravanje, možemo ga stvoriti i za STDIN. Međutim, budući da se za unos koristi STDIN, implementacija je malo drugačija.

U sljedećoj skripti uzimamo STDIN iz datoteke:

#!/bin/bash

jeka 'jeka ' Pozdrav svijete '' > ulazni

izvrs < ulazni

čitati linija 1

eval $line_1

Ovdje, u prvom redu, koristimo echo za generiranje sadržaja datoteke input_string pomoću preusmjeravanja. Naredba exec preusmjerava sadržaj input_string na STDIN trenutne sesije ljuske. Nakon čitanja niza koristimo eval za tretiranje sadržaja $line_1 kao shell koda.

Pokrenite sljedeću skriptu:

$ . / test.sh

Zaključak

Raspravljali smo o naredbi exec u Bashu. Također smo prikazali različite načine korištenja u skriptama. Demonstrirali smo korištenje exec-a za rad s višestrukim ljuskama, stvaranje memorijski učinkovitih skripti i preusmjeravanje deskriptora datoteka.

Ovo je samo mali dio onoga što se može postići korištenjem Bash skriptiranja. Saznajte više o Bash skriptiranju od Bash programiranje potkategorija.

Sretno računanje!