Bruk av Exec-kommandoen i Shell-skript

Bruk Av Exec Kommandoen I Shell Skript



Denne veiledningen utdyper exec-kommandoen og dens bruk i shell-skript.

Forutsetninger:

For å utføre trinnene som er demonstrert i denne veiledningen, trenger du følgende komponenter:

  • Et funksjonelt Linux-system. Lære mer om sette opp en Ubuntu VM ved hjelp av VirtualBox .
  • Tilgang til en ikke-rootbruker med sudo-privilegium .
  • Et passende tekstredigeringsprogram. For eksempel: Hvorfor / NeoVim , Nano , Sublim tekst , VSCodium , etc.

Exec-kommandoen

Exec-kommandoen er ikke et eget verktøy i seg selv:







$ hvilken exec



Snarere er det en intern kommando fra Bash-skallet:



$ Mann exec





Som beskrivelsen fra man-siden antyder, hvis en kommando er spesifisert, erstatter exec skallet med det, og gir ingen ekstra prosess. Det er en håndfull alternativer tilgjengelig som endrer oppførselen til exec-kommandoen.



Grunnleggende bruk

Som standard, når du kjører en kommando, lager Bash et subshell og gafler kommandoen.

$ ekko $$ && sove 999

$ pstree -s

Her skriver ekko-kommandoen ut PID-en til gjeldende skall. Bash-skallet (PID: 978) skaper en ny underordnet prosess for å fungere med sleep-kommandoen (PID: 8369).

Hva om vi kjører sleep-kommandoen ved å bruke exec?

$ ekko $$ && exec sove 999

$ pstree -s

Den overordnede Bash-prosessen erstattes av dvalekommandoen. Ved vellykket utførelse går den ikke tilbake til skallet. I stedet avsluttes økten.

Rent miljø

Standard Bash-konfigurasjonen kommer med en haug med justeringer og miljøvariabler. I visse scenarier (f.eks. feilsøking), vil du kanskje kjøre skriptet/programmet i et rent miljø. Ved hjelp av exec kan vi lansere en clean shell-instans i stedet for den nåværende.

Først bruker du printenv-kommandoen for å liste opp alle miljøvariablene som er konfigurert for øyeblikket:

$ printenv

Bruk nå exec for å starte en ren forekomst:

$ exec -c bash

$ printenv

Lansering av et annet skall

Foruten Bash og 'sh', er det flere andre shell-programmer tilgjengelig, hver med sine unike fordeler. Hvis et program/skript krever et spesifikt skall, kan du bruke exec til å erstatte det gjeldende Bash-skallet med det ønskede.

I følgende eksempel erstatter vi Bash med 'sh':

$ pstree -s

$ exec sh

$ pstree -s

Bruke Exec i skript

Med det grunnleggende ute av veien, kan vi nå begynne å bruke exec i våre shell-skript.

Eksempel 1: Arbeid med forskjellige skjell

Sjekk ut følgende skript:

#!/bin/bash

ekko $SHELL

ekko 'echo zsh ble lansert vellykket' > zsh.sh

exec zsh zsh.sh

Her skriver den første ekkokommandoen ut gjeldende skall. Som standard skal det være Bash. Deretter starter exec-kommandoen 'zsh' for å utføre 'zsh.sh'-skriptet.

Kjør følgende skript:

$ . / test.sh

Eksempel 2: Overstyre den eksisterende prosessen

Når du ringer en kommando/program, skaper Bash en ny prosess. I de fleste situasjoner er det ikke et spørsmål om bekymring. Men når du arbeider med et system med svært begrensede ressurser (innebygd maskinvare, for eksempel), kan det hjelpe å bruke exec for å overstyre den eksisterende prosessen i minnet.

Sjekk ut følgende skript:

#!/bin/bash

pstree -s

exec pstree -s

ekko 'Hei Verden'

Her viser den første pstree-kommandoen det opprinnelige oppsettet til prosesstreet. Når exec-kommandoen er utført, erstatter den andre pstree-kommandoen det kjørende skallet. Ekkokommandoen på den siste linjen ble ikke utført.

Kjør følgende skript:

$ . / test.sh

Siden det var en del av manuset, går vi tilbake til det originale skallet etter vellykket utførelse.

Ettersom exec-kommandoen erstatter det overordnede skallet med en annen kommando/program, blir enhver kode etter det ugyldig. Vær forsiktig når du bruker dem i skriptene dine.

Eksempel 3: Logging

Bash-skallet tilbyr 3 unike filbeskrivelser til ethvert kjørende program/skript:

  • STDOUT (1): standard utgang, lagrer normal utgang
  • STDERR (2): standard feil, lagrer feilmeldinger
  • STDIN (0): standardinngang

Ved å bruke exec kan vi omdirigere disse filbeskrivelsene til et annet sted, for eksempel: loggfiler. Det kan hjelpe med feilsøking og logging generelt.

Generelt, hvis du vil omdirigere STDOUT og STDERR til en loggfil, bruker du omdirigeringsoperatøren:

$ ekko $$ | tee test.log

$ munk 2 >& 1 | tee test.log

Denne metoden krever omdirigering på hvert punkt du vil logge. For å løse dette problemet kan vi bruke exec-kommandoen til å lage en permanent omdirigering for shell-økten. Sjekk ut følgende eksempel:

#!/bin/bash

> test.log

exec 1 >> test.log

exec 2 >& 1

ekko 'Hei Verden'

feil_kommando

Her oppretter den første linjen en tom loggfil. Den første exec-kommandoen etablerer en permanent omdirigering av STDOUT til loggfilen. Den andre exec-kommandoen omdirigerer STDERR til STDOUT.

Med dette oppsettet blir alle utdataene og feilmeldingene dumpet inn i loggfilen:

$ . / test.sh

$ katt test.log

Hva om skriptet genererer kontinuerlige loggoppføringer?

#!/bin/bash

> test.log

exec 1 >> test.log

exec 2 >& 1

samtidig som ekte

gjøre

ekko $RANDOM

sove 5

ferdig

Her, i den første delen, oppretter vi en permanent omdirigering av STDOUT og STDERR til loggfilen vår. Den uendelige mens-løkken kjører ekko-kommandoen til vi lukker den med makt ved å bruke 'Ctrl + C'. $RANDOM-variabelen er en spesiell variabel som returnerer en tilfeldig streng hver gang den åpnes.

For å sjekke oppdateringsloggoppføringen, bruk følgende halekommando:

$ hale -f test.log

Merk at denne omdirigeringen bare varer for shell-økten.

Eksempel 4: Inndata fra fil

I likhet med hvordan vi opprettet en permanent STDOUT og STDERR omdirigering, kan vi også lage en for STDIN. Men siden STDIN brukes for input, er implementeringen litt annerledes.

I følgende skript tar vi STDIN fra en fil:

#!/bin/bash

ekko 'ekko ' Hei Verden '' > input

exec < input

lese linje 1

eval $line_1

Her, i den første linjen, bruker vi ekko for å generere innholdet i input_string-filen ved å bruke omdirigering. Exec-kommandoen omdirigerer innholdet av input_string til STDIN for gjeldende shell-sesjon. Etter å ha lest strengen bruker vi eval for å behandle innholdet i $line_1 som en skallkode.

Kjør følgende skript:

$ . / test.sh

Konklusjon

Vi diskuterte om exec-kommandoen i Bash. Vi viste også frem de ulike måtene å bruke det på i skript. Vi demonstrerte å bruke exec til å jobbe med flere skall, lage minneeffektive skript og omdirigere filbeskrivelsene.

Dette er bare en liten del av det som kan oppnås ved å bruke Bash-skriptingen. Lær mer om Bash-skripting fra Bash-programmering underkategori.

Lykke til med databehandling!