Brug af Exec-kommandoen i Shell-scripts

Brug Af Exec Kommandoen I Shell Scripts



Denne vejledning uddyber exec-kommandoen og dens brug i shell-scripts.

Forudsætninger:

For at udføre de trin, der er vist i denne vejledning, skal du bruge følgende komponenter:

  • Et funktionelt Linux-system. Lær mere om opsætning af en Ubuntu VM ved hjælp af VirtualBox .
  • Adgang til en ikke-root-bruger med sudo-privilegium .
  • En passende teksteditor. For eksempel: Hvorfor / NeoVim , Nano , Sublim tekst , VSCodium , etc.

Exec-kommandoen

Exec-kommandoen er ikke et separat værktøj i sig selv:







$ hvilken exec



Det er snarere en intern kommando af Bash-skallen:



$ mand exec





Som beskrivelsen fra man-siden antyder, hvis en kommando er angivet, erstatter exec skallen med den, hvilket ikke afføder yderligere proces. Der er en håndfuld muligheder tilgængelige, der ændrer opførselen af ​​exec-kommandoen.



Grundlæggende brug

Som standard, når du kører en kommando, afføder Bash en subshell og gafler kommandoen.

$ ekko $$ && søvn 999

$ pstree -s

Her udskriver ekkokommandoen PID for den aktuelle shell. Bash-skallen (PID: 978) afføder en ny underordnet proces til at arbejde med sleep-kommandoen (PID: 8369).

Hvad nu hvis vi kører sleep-kommandoen ved hjælp af exec?

$ ekko $$ && exec søvn 999

$ pstree -s

Den overordnede Bash-proces erstattes af sleep-kommandoen. Efter vellykket udførelse vender den ikke tilbage til skallen. I stedet afsluttes sessionen.

Rent miljø

Standard Bash-konfigurationen kommer med en masse tweaks og miljøvariabler. I visse scenarier (f.eks. fejlretning) vil du måske køre dit script/program i et rent miljø. Ved hjælp af exec kan vi starte en clean shell-instans i stedet for den nuværende.

Brug først printenv-kommandoen til at liste alle de miljøvariabler, der i øjeblikket er konfigureret:

$ printenv

Brug nu exec til at starte en ren instans:

$ exec -c bash

$ printenv

Lancering af en anden skal

Udover Bash og 'sh' er der flere andre shell-programmer tilgængelige, hver med deres unikke frynsegoder. Hvis et program/script kræver en specifik shell, kan du bruge exec til at erstatte den nuværende Bash shell med den ønskede.

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

$ pstree -s

$ exec sh

$ pstree -s

Brug af Exec i scripts

Med det grundlæggende af vejen, kan vi nu begynde at bruge exec i vores shell-scripts.

Eksempel 1: Arbejde med forskellige skaller

Tjek følgende script:

#!/bin/bash

ekko $SHELL

ekko 'echo zsh blev lanceret med succes' > zsh.sh

exec zsh zsh.sh

Her udskriver den første ekkokommando den aktuelle shell. Som standard skal det være Bash. Derefter starter exec-kommandoen 'zsh' for at udføre 'zsh.sh'-scriptet.

Kør følgende script:

$ . / test.sh

Eksempel 2: Tilsidesættelse af den eksisterende proces

Når du kalder en kommando/program, afføder Bash en ny proces. I de fleste situationer er det ikke et spørgsmål om bekymring. Men når du arbejder med et system med meget begrænsede ressourcer (f.eks. indlejret hardware), kan det hjælpe at bruge exec til at tilsidesætte den eksisterende proces i hukommelsen.

Tjek følgende script:

#!/bin/bash

pstree -s

exec pstree -s

ekko 'Hej Verden'

Her viser den første pstree-kommando det originale layout af procestræet. Når exec-kommandoen er udført, erstatter den anden pstree-kommando den kørende shell. Ekkokommandoen på den sidste linje blev ikke udført.

Kør følgende script:

$ . / test.sh

Da det var en del af manuskriptet, vender vi tilbage til den originale skal efter vellykket udførelse.

Da exec-kommandoen erstatter den overordnede shell med en anden kommando/program, bliver enhver kode efter det ugyldig. Vær forsigtig, når du bruger dem i dine scripts.

Eksempel 3: Logning

Bash-skallen tilbyder 3 unikke filbeskrivelser til ethvert kørende program/script:

  • STDOUT (1): standard output, gemmer normal output
  • STDERR (2): standardfejl, gemmer fejlmeddelelser
  • STDIN (0): standardindgang

Ved at bruge exec kan vi omdirigere disse filbeskrivelser til en anden placering, for eksempel: logfiler. Det kan hjælpe med fejlfinding og logning generelt.

Generelt, hvis du vil omdirigere STDOUT og STDERR til en logfil, bruger du omdirigeringsoperatoren:

$ ekko $$ | tee test.log

$ munk 2 >& 1 | tee test.log

Denne metode kræver omdirigering på hvert punkt, du vil logge. For at løse dette problem kan vi bruge kommandoen exec til at oprette en permanent omdirigering til shell-sessionen. Tjek følgende eksempel:

#!/bin/bash

> test.log

exec 1 >> test.log

exec 2 >& 1

ekko 'Hej Verden'

forkert_kommando

Her opretter den første linje en tom logfil. Den første exec-kommando etablerer en permanent omdirigering af STDOUT til logfilen. Den anden exec-kommando omdirigerer STDERR til STDOUT.

Med denne opsætning dumpes alle output og fejlmeddelelser i logfilen:

$ . / test.sh

$ kat test.log

Hvad hvis scriptet genererer kontinuerlige logposter?

#!/bin/bash

> test.log

exec 1 >> test.log

exec 2 >& 1

mens rigtigt

gør

ekko $RANDOM

søvn 5

Færdig

Her, i den første del, opretter vi en permanent omdirigering af STDOUT og STDERR til vores logfil. Den uendelige mens-løkke kører ekkokommandoen, indtil vi lukker den med magt ved hjælp af 'Ctrl + C'. $RANDOM-variablen er en speciel variabel, der returnerer en tilfældig streng, hver gang den tilgås.

For at kontrollere opdateringslogposten skal du bruge følgende halekommando:

$ hale -f test.log

Bemærk, at denne omdirigering kun varer for shell-sessionen.

Eksempel 4: Input fra fil

På samme måde som vi oprettede en permanent STDOUT og STDERR omdirigering, kan vi også oprette en til STDIN. Men da STDIN bruges til input, er implementeringen en smule anderledes.

I følgende script tager vi STDIN fra en fil:

#!/bin/bash

ekko 'ekko ' Hej Verden '' > input

exec < input

Læs linje_1

eval $line_1

Her, i den første linje, bruger vi ekko til at generere indholdet af input_string-fil ved hjælp af omdirigering. Exec-kommandoen omdirigerer indholdet af input_string til STDIN for den aktuelle shell-session. Efter at have læst strengen, bruger vi eval til at behandle indholdet af $line_1 som en shell-kode.

Kør følgende script:

$ . / test.sh

Konklusion

Vi diskuterede om exec-kommandoen i Bash. Vi viste også de forskellige måder at bruge det på i scripts. Vi demonstrerede at bruge exec til at arbejde med flere skaller, skabe hukommelseseffektive scripts og omdirigere filbeskrivelserne.

Dette er blot en lille del af, hvad der kan opnås ved hjælp af Bash-scripting. Lær mere om Bash-scripting fra Bash programmering underkategori.

God computer!