Použití příkazu Exec ve skriptech Shell

Pouziti Prikazu Exec Ve Skriptech Shell



Tato příručka podrobně popisuje příkaz exec a jeho použití ve skriptech shellu.

Předpoklady:

K provedení kroků, které jsou uvedeny v této příručce, potřebujete následující součásti:

  • Funkční systém Linux. Dozvědět se víc o nastavení virtuálního počítače Ubuntu pomocí VirtualBoxu .
  • Přístup k a uživatel bez oprávnění root s oprávněním sudo .
  • Vhodný textový editor. Například: Proč / NeoVim , Nano , Vznešený text , VSCodium , atd.

Příkaz Exec

Příkaz exec sám o sobě není samostatným nástrojem:







$ který exec



Spíše je to interní příkaz shellu Bash:



$ muž exec





Jak napovídá popis z manuálové stránky, pokud je zadán příkaz, exec jím nahradí shell a nevyvolá žádný další proces. Existuje několik dostupných voleb, které upravují chování příkazu exec.



Základní použití

Ve výchozím nastavení při každém spuštění příkazu Bash vytvoří subshell a rozvětví příkaz.

$ echo $$ && spát 999

$ pstree -p

Zde příkaz echo vypíše PID aktuálního shellu. Bash shell (PID: 978) vytvoří nový podřízený proces pro práci s příkazem sleep (PID: 8369).

Nyní, co když spustíme příkaz spánku pomocí exec?

$ echo $$ && exec spát 999

$ pstree -p

Rodičovský proces Bash je nahrazen příkazem sleep. Po úspěšném provedení se nevrátí do shellu. Místo toho je relace ukončena.

Čisté prostředí

Výchozí konfigurace Bash přichází s řadou vylepšení a proměnných prostředí. V určitých scénářích (například ladění) můžete chtít spustit skript/program v čistém prostředí. S pomocí exec můžeme spustit čistou instanci shellu místo aktuální.

Nejprve pomocí příkazu printenv vypište všechny aktuálně nakonfigurované proměnné prostředí:

$ printenv

Nyní použijte exec ke spuštění čisté instance:

$ exec -C bash

$ printenv

Spuštění jiného shellu

Kromě Bash a „sh“ je k dispozici několik dalších shell programů, z nichž každý má své jedinečné výhody. Pokud program/script vyžaduje specifický shell, můžete použít exec k nahrazení aktuálního Bash shellu požadovaným.

V následujícím příkladu nahradíme Bash za „sh“:

$ pstree -p

$ exec sh

$ pstree -p

Použití Exec ve skriptech

Když jsou základy z cesty, můžeme nyní začít používat exec v našich skriptech shellu.

Příklad 1: Práce s různými skořepinami

Podívejte se na následující skript:

#!/bin/bash

echo $SHELL

echo 'echo zsh úspěšně spuštěn' > zsh.sh

exec zsh zsh.sh

Zde první příkaz echo vytiskne aktuální shell. Ve výchozím nastavení by to měl být Bash. Poté příkaz exec spustí „zsh“ a spustí skript „zsh.sh“.

Spusťte následující skript:

$ . / test.sh

Příklad 2: Přepsání existujícího procesu

Kdykoli volá příkaz/program, Bash vytvoří nový proces. Ve většině situací to není problém. Při práci se systémem s velmi omezenými zdroji (například vestavěný hardware) však může pomoci použití exec k přepsání existujícího procesu v paměti.

Podívejte se na následující skript:

#!/bin/bash

pstree -p

exec pstree -p

echo 'Ahoj světe'

Zde první příkaz pstree ukazuje původní rozvržení stromu procesu. Po provedení příkazu exec nahradí spuštěný shell druhý příkaz pstree. Příkaz echo na posledním řádku se neprovedl.

Spusťte následující skript:

$ . / test.sh

Protože to bylo součástí skriptu, vrátíme se po úspěšném provedení k původnímu shellu.

Protože příkaz exec nahradí nadřazený shell jiným příkazem/programem, jakýkoli kód poté se stane neplatným. Při jejich použití ve skriptech buďte opatrní.

Příklad 3: Logování

Shell Bash nabízí 3 jedinečné deskriptory souborů pro jakýkoli spuštěný program/script:

  • STDOUT (1): standardní výstup, ukládá normální výstup
  • STDERR (2): standardní chyba, ukládá chybová hlášení
  • STDIN (0): standardní vstup

Pomocí exec můžeme přesměrovat tyto deskriptory souborů na jiné místo, například: soubory protokolu. Může pomoci s laděním a logováním obecně.

Obecně platí, že pokud chcete přesměrovat STDOUT a STDERR do souboru protokolu, použijte operátor přesměrování:

$ echo $$ | tričko test.log

$ mnich 2 >& 1 | tričko test.log

Tato metoda vyžaduje přesměrování v každém bodě, který chcete přihlásit. K vyřešení tohoto problému můžeme použít příkaz exec k vytvoření trvalého přesměrování pro relaci shellu. Podívejte se na následující příklad:

#!/bin/bash

> test.log

exec 1 >> test.log

exec 2 >& 1

echo 'Ahoj světe'

chybný_příkaz

Zde první řádek vytvoří prázdný soubor protokolu. První příkaz exec vytvoří trvalé přesměrování STDOUT do souboru protokolu. Druhý příkaz exec přesměruje STDERR na STDOUT.

S tímto nastavením se všechny výstupy a chybové zprávy ukládají do souboru protokolu:

$ . / test.sh

$ kočka test.log

Co když skript generuje průběžné položky protokolu?

#!/bin/bash

> test.log

exec 1 >> test.log

exec 2 >& 1

zatímco skutečný

dělat

echo $NÁHODNÉ

spát 5

Hotovo

Zde v první části vytvoříme trvalé přesměrování STDOUT a STDERR do našeho log souboru. Nekonečná smyčka while spouští příkaz echo, dokud jej násilně nezavřeme pomocí „Ctrl + C“. Proměnná $RANDOM je speciální proměnná, která vrací náhodný řetězec při každém přístupu.

Chcete-li zkontrolovat záznam aktualizace, použijte následující příkaz tail:

$ ocas -F test.log

Všimněte si, že toto přesměrování trvá pouze pro relaci shellu.

Příklad 4: Vstup ze souboru

Podobně jako jsme vytvořili trvalé přesměrování STDOUT a STDERR, můžeme je vytvořit také pro STDIN. Protože se však pro vstup používá STDIN, implementace je trochu jiná.

V následujícím skriptu vezmeme STDIN ze souboru:

#!/bin/bash

echo 'echo' Ahoj světe '' > vstup

exec < vstup

číst řádek_1

eval $line_1

Zde v prvním řádku používáme echo ke generování obsahu souboru input_string pomocí přesměrování. Příkaz exec přesměruje obsah vstupního_řetězce na STDIN aktuální relace shellu. Po přečtení řetězce použijeme eval k zacházení s obsahem $line_1 jako s kódem shellu.

Spusťte následující skript:

$ . / test.sh

Závěr

Diskutovali jsme o příkazu exec v Bash. Také jsme si ukázali různé způsoby použití ve skriptech. Ukázali jsme použití exec pro práci s více shelly, vytváření paměťově úsporných skriptů a přesměrování deskriptorů souborů.

To je jen malá část toho, čeho lze dosáhnout pomocí skriptování Bash. Další informace o skriptování Bash z Bash programování podkategorie.

Hodně štěstí při práci s počítačem!