Úvod
Linux exec
příkaz spustí příkaz Shell bez vytvoření nového procesu. Místo toho nahrazuje aktuálně otevřenou operaci Shell. V závislosti na použití příkazu exec
má různé chování a případy použití.
Tento článek ukazuje, jak používat exec
příkaz v Linuxu.

Předpoklady
- Přístup k příkazovému řádku/terminálu jako sudo.
- Základní znalost příkazů terminálu Linuxu (použijte náš cheat sheet pro příkazy Linuxu).
- Textový editor pro Linux, jako je nano.
Syntaxe příkazu Linux exec
exec
syntaxe příkazu je:
exec [options] [command [arguments]] [redirection]
Příkaz se chová odlišně v závislosti na počtu argumentů:
- Pokud je přítomen argument,
exec
příkaz nahradí aktuální shell spuštěným programem. Ve skriptu Bash se žádné příkazy po nespustí . - Pokud není přítomen žádný argument příkazu, všechna přesměrování proběhnou v aktuálním shellu.
exec
příkaz se nikdy nevrátí k původnímu procesu, pokud nedojde k chybě nebo pokud příkaz není spuštěn v subshell.
Možnosti příkazu Linux exec
Níže je stručné vysvětlení všech exec
možnosti:
Možnost | Popis |
---|---|
-c | Provede příkaz v prázdném prostředí. |
-l | Předává pomlčku (- ) jako nultý argument. |
-a [name] | Projde [name] jako nultý argument. |
Pokračujte ve čtení a zjistěte, jak exec
funguje na příkladech.
Příklady příkazů Linux exec
Níže uvedené příklady ukazují chování exec
příkaz v terminálu a prostřednictvím skriptů Bash.
Základní použití (náhrada procesu)
Chcete-li zjistit, jak exec
funguje, proveďte následující:
1. Otevřete terminál a seznam běžících procesů:
ps

Výstup zobrazuje aktuálně spuštěný Bash shell a ps
příkaz. Bash shell má jedinečný PID.
2. Pro potvrzení zkontrolujte aktuální ID procesu pomocí:
echo $$

PID je stejný jako výstup z ps
označující, že se jedná o aktuálně spuštěný proces Bash.
3. Nyní spusťte exec
a předejte příkaz spánku na sto sekund:
exec sleep 100
sleep
příkaz čeká 100 sekund.
4. Na další kartě terminálu vypište všechny aktuálně spuštěné procesy a zadejte sleep
příkaz:
ps -ae | grep sleep

PID pro proces je stejný jako PID prostředí Bash, což znamená exec
příkaz nahradil proces prostředí Bash.
Relace Bash (záložka terminálu) se zavře, když skončí těch sto sekund a proces skončí.
Nahradit aktuální relaci prostředí
Použijte exec
příkaz k nahrazení aktuální relace shellu:
1. Zkontrolujte aktuální PID shellu:
echo $$
2. Použijte exec
pro přepnutí na Bourne Shell:
exec sh

3. Na další kartě zkontrolujte PID pro proces Bourne Shell:
ps -ae | grep "\bsh\b"

Poznámka: \b
v grep
je Regex pro shodu mezi slovy, což umožňuje přesnou shodu sh
ve výstupu. Více se dozvíte v našem tutoriálu Grep Regex.
Příkaz nahrazuje proces Bash. Ukončení Bourne Shell úplně ukončí relaci terminálu.
Naprogramujte volání pomocí exec ve skriptech Bash
Chcete-li zjistit, jak exec
funguje ve skriptech Bash, proveďte následující:
1. Otevřete textový editor, například Nano, a vytvořte soubor skriptu:
nano [script name]
2. Vložte následující kód:
#!/bin/bash
while true
do
echo "1. Update "
echo "2. Upgrade "
echo "3. Exit"
read Input
case "$Input" in
1) exec sudo apt update ;;
2) exec sudo apt upgrade ;;
3) break
esac
done

Skript provede následující:
- Řádek 3 vytvoří nekonečný
while
smyčka. - Řádky 5–7 vytiskněte tři možné možnosti.
- Řádek 8 přečte vstup uživatele do proměnné
$Input
. - Řádek 9 spustí
case
příkaz kontrolující vstup uživatele. - Řádky 10–11 spusťte
apt update
neboapt upgrade
příkaz místo aktuálního shellu. Když proces aktualizace nebo upgradu skončí, relace terminálu se ukončí. - Řádek 12 používá
break
příkaz opustit nekonečnéwhile
smyčka a ukončí skript. Relace se vrátí do aktuálního prostředí jako obvykle.
3. Uložte skript a zavřete Nano.
4. Spusťte skript Bash v aktuálním prostředí, abyste viděli výsledky:
. [script name]

Spuštění skriptu pomocí příkazu source aplikuje chování skriptu na aktuální prostředí Bash. Použijte exec
spouštět Bash skripty v jiných programech pro čisté ukončení.
Protokolování Bash skriptů
exec
příkaz najde využití při manipulaci s deskriptory souborů pro protokolování chyb ve skriptech Bash. Výchozí linuxové deskriptory souborů jsou:
- stdin (0) – standardní v
- stdout (1) – standardní výstup
- stderr (2) – standardní chyba
Použijte exec
a přesměrujte deskriptory souborů do souboru, abyste vytvořili protokoly. Chcete-li vidět, jak protokolování funguje, postupujte podle následujících kroků:
1. Vytvořte ukázkový skript Bash:
nano logging.sh
2. Vložte kód do souboru:
#!/bin/bash
# Create test.log file
touch test.log
# Save test.log to log_file variable
log_file="test.log"
# Redirect stdin to $log_file
exec 1>>$log_file
# Redirect stderr to the same place as stdin
exec 2>&1
echo "This line is added to the log file"
echo "And any other lines after"
eho "This line has an error and is logged as stderr"

Skript přesměruje všechny výstupy příkazů a chyby do stejného souboru (test.log ).
3. Uložte skript a zavřete textový editor.
4. Změňte oprávnění skriptu na spustitelný soubor:
chmod +x logging.sh
5. Spusťte skript:
./logging.sh
Skript nevydává žádný kód. Místo toho se všechny výstupní protokoly zapisují do test.log soubor.
6. Pomocí příkazu cat zobrazíte test.log obsah souboru:
cat test.log

Soubor protokolu obsahuje všechny standardní výstupy a chybová hlášení. Použijte exec
k ladění skriptů a protokolování vstupů, výstupů nebo chyb v závislosti na situaci.
Spouštějte skripty v čistém prostředí
-c
možnost pro exec
příkaz vytváří čisté prostředí. Chcete-li demonstrovat, proveďte v terminálu následující:
1. Spusťte novou relaci prostředí Bash:
bash
2. Použijte printenv
příkaz k tisku všech proměnných prostředí v aktuálním prostředí Bash:
printenv

Příkaz vytiskne všechny proměnné prostředí pro aktuální relaci prostředí Bash.
3. Spusťte stejný příkaz pomocí exec
s -c
příznak:
exec -c printenv

Příkaz printenv
běží v čistém prostředí a do konzole se nevypisují žádné proměnné. Použijte -c
možnost spouštět skripty nebo příkazy v čistých prostředích.
exec s příkazem find
Příkaz find v Linuxu má exec
příkaz jako možnost provedení akce s nalezeným obsahem. Například řádek níže provede chmod
příkaz na find
výsledky příkazu:
sudo find ~ -name "test.log" -exec chmod +x '{}' \;

find
příkaz prohledává domovský adresář (~ ) pro test.log soubor a provede změnu oprávnění.
Závěr
Po provedení příkladů z tohoto tutoriálu byste měli vědět, jak používat exec
ve skriptech Bash.
Dále se dozvíte, jak automaticky spustit úlohu při restartu pomocí Crontab.