Az Exec parancs használata a Shell-szkriptekben

Az Exec Parancs Hasznalata A Shell Szkriptekben



Ez az útmutató részletesen ismerteti az exec parancsot és annak használatát shell szkriptekben.

Előfeltételek:

Az ebben az útmutatóban bemutatott lépések végrehajtásához a következő összetevőkre van szüksége:

  • Működőképes Linux rendszer. Tudj meg többet Ubuntu virtuális gép beállítása VirtualBox segítségével .
  • Hozzáférés a nem root felhasználó sudo jogosultsággal .
  • Megfelelő szövegszerkesztő. Például: Miért / NeoVim , Nano , Magasztos szöveg , VSCodium stb.

Az Exec parancs

Az exec parancs önmagában nem különálló eszköz:







$ melyik végrehajtó



Inkább a Bash shell belső parancsa:



$ Férfi végrehajtó





Ahogy a man oldal leírása is sugallja, ha egy parancs meg van adva, az exec lecseréli a parancsértelmezőt, és nem indít további folyamatot. Maroknyi lehetőség áll rendelkezésre, amelyek módosítják az exec parancs viselkedését.



Alapvető használat

Alapértelmezés szerint, amikor egy parancsot futtat, a Bash létrehoz egy alhéjat, és elágazza a parancsot.

$ visszhang $$ && alvás 999

$ pstree -o

Itt az echo parancs kiírja az aktuális shell PID-jét. A Bash shell (PID: 978) új utódfolyamatot hoz létre, amely az alvás paranccsal (PID: 8369) működik.

Mi van akkor, ha az alvás parancsot az exec segítségével futtatjuk?

$ visszhang $$ && végrehajtó alvás 999

$ pstree -p

A szülő Bash folyamatot az alvás parancs váltja fel. Sikeres végrehajtás után nem tér vissza a héjba. Ehelyett a munkamenet megszakad.

Tiszta környezet

Az alapértelmezett Bash konfiguráció egy csomó finomítást és környezeti változót tartalmaz. Bizonyos esetekben (például hibakeresés) érdemes lehet tiszta környezetben futtatni a szkriptet/programot. Az exec segítségével egy tiszta shell példányt indíthatunk a jelenlegi helyett.

Először a printenv paranccsal listázza ki az összes jelenleg konfigurált környezeti változót:

$ printenv

Most az exec segítségével indítson el egy tiszta példányt:

$ végrehajtó -c bash

$ printenv

Egy másik shell elindítása

A Bash és az „sh” mellett számos más shell-program is elérhető, mindegyik egyedi előnyeivel. Ha egy program/szkript egy adott parancsértelmezőt igényel, az exec segítségével lecserélheti az aktuális Bash shellt a kívántra.

A következő példában a Bash-t „sh”-ra cseréljük:

$ pstree -o

$ végrehajtó SH

$ pstree -o

Az Exec használata a szkriptekben

Miután az alapokat már nem tudtuk megtenni, most már használhatjuk az exec-et a shell szkriptjeinkben.

1. példa: Különböző shellekkel való munka

Nézze meg a következő szkriptet:

#!/bin/bash

visszhang $SHELL

visszhang 'Az echo zsh sikeresen elindult' > zsh.sh

végrehajtó zsh zsh.sh

Itt az első echo parancs kiírja az aktuális shellt. Alapértelmezés szerint Bash-nak kell lennie. Ezután az exec parancs elindítja a „zsh” parancsot a „zsh.sh” parancsfájl végrehajtásához.

Futtassa a következő szkriptet:

$ . / teszt.sh

2. példa: A meglévő folyamat felülbírálása

Amikor parancsot/programot hívunk, a Bash új folyamatot indít el. A legtöbb esetben ez nem aggodalomra ad okot. Ha azonban nagyon korlátozott erőforrásokkal (például beágyazott hardverrel) rendelkező rendszerrel dolgozik, az exec használata a memóriában meglévő folyamat felülírására segíthet.

Nézze meg a következő szkriptet:

#!/bin/bash

pstree -o

végrehajtó pstree -o

visszhang 'Helló Világ'

Itt az első pstree parancs a folyamatfa eredeti elrendezését mutatja. Az exec parancs végrehajtása után a második pstree parancs lecseréli a futó shellt. Az utolsó sorban lévő echo parancs nem futott le.

Futtassa a következő szkriptet:

$ . / teszt.sh

Mivel a forgatókönyv része volt, sikeres végrehajtás után visszatérünk az eredeti héjhoz.

Mivel az exec parancs lecseréli a szülő shellt egy másik paranccsal/programmal, az ezt követő kód érvénytelenné válik. Legyen óvatos, amikor ezeket a szkriptekben használja.

3. példa: Naplózás

A Bash shell 3 egyedi fájlleírót kínál minden futó programhoz/szkripthez:

  • STDOUT (1): szabványos kimenet, normál kimenetet tárol
  • STDERR (2): standard hiba, hibaüzeneteket tárol
  • STDIN (0): szabványos bemenet

Az exec használatával átirányíthatjuk ezeket a fájlleírókat egy másik helyre, például: naplófájlok. Segíthet általában a hibakeresésben és a naplózásban.

Általában, ha az STDOUT-t és az STDERR-t egy naplófájlba szeretné átirányítani, használja az átirányítási operátort:

$ visszhang $$ | póló test.log

$ szerzetes 2 >& 1 | póló test.log

Ez a módszer minden naplózni kívánt ponton átirányítást igényel. A probléma megoldásához az exec paranccsal létrehozhatunk egy állandó átirányítást a shell-munkamenethez. Nézze meg a következő példát:

#!/bin/bash

> test.log

végrehajtó 1 >> test.log

végrehajtó 2 >& 1

visszhang 'Helló Világ'

rossz_parancs

Itt az első sor egy üres naplófájlt hoz létre. Az első exec parancs létrehozza az STDOUT állandó átirányítását a naplófájlba. A második exec parancs átirányítja az STDERR-t az STDOUT-ra.

Ezzel a beállítással az összes kimenet és hibaüzenet a naplófájlba kerül:

$ . / teszt.sh

$ macska test.log

Mi van, ha a szkript folyamatos naplóbejegyzéseket generál?

#!/bin/bash

> test.log

végrehajtó 1 >> test.log

végrehajtó 2 >& 1

míg igaz

csináld

visszhang $RANDOM

alvás 5

Kész

Itt az első részben létrehozzuk az STDOUT és STDERR állandó átirányítását a naplófájlunkba. A végtelen while ciklus addig futtatja az echo parancsot, amíg nem zárjuk be a „Ctrl + C” billentyűkombinációval. A $RANDOM változó egy speciális változó, amely véletlenszerű karakterláncot ad vissza minden alkalommal, amikor hozzáfér.

A frissítési naplóbejegyzés ellenőrzéséhez használja a következő tail parancsot:

$ farok -f test.log

Vegye figyelembe, hogy ez az átirányítás csak a shell munkamenetre érvényes.

4. példa: Bevitel a fájlból

Hasonlóan ahhoz, ahogy állandó STDOUT és STDERR átirányítást hoztunk létre, létrehozhatunk egyet az STDIN számára is. Mivel azonban az STDIN bemenetet használnak, a megvalósítás egy kicsit más.

A következő szkriptben egy fájlból vesszük ki az STDIN kódot:

#!/bin/bash

visszhang 'visszhang' Helló Világ '' > bemenet

végrehajtó < bemenet

olvas sor_1

eval $line_1

Itt az első sorban az echo segítségével állítjuk elő az input_string fájl tartalmát átirányítással. Az exec parancs átirányítja az input_string tartalmát az aktuális shell-munkamenet STDIN kódjára. A karakterlánc beolvasása után az eval segítségével a $line_1 tartalmát shell kódként kezeljük.

Futtassa a következő szkriptet:

$ . / teszt.sh

Következtetés

Megbeszéltük az exec parancsot a Bashban. Bemutattuk a szkriptekben való felhasználásának különféle módjait is. Bemutattuk, hogy az exec segítségével több héjjal is dolgozhat, memóriahatékony szkripteket hozhat létre, és átirányítja a fájlleírókat.

Ez csak egy kis része annak, amit a Bash szkriptekkel el lehet érni. Tudjon meg többet a Bash szkriptekről a Bash programozás alkategória.

Boldog számítástechnikát!