exec
-
exec – specjalny builtin specyfikacji POSIX pozwalający:
- uruchomić wskazane polecenie w miejsce bieżącej powłoki (bez tworzenia procesu potomnego),
- lub otworzyć/zamknąć/przekierować deskryptory plików w kontekście aktualnej powłoki (np.
exec 3>plik
).
-
Stosowany w skryptach startowych, kontenerach (PID 1), demonyzacji procesów, zaawansowanych konstrukcjach przekierowań i optymalizacji (eliminacja forka).
-
Dostępny w Bourne sh, Bash, Zsh, Dash, BusyBox, KornShell – składnia opcji (-c/-l/-a) może się różnić między implementacjami.
Składnia
Dział zatytułowany „Składnia”# Zastąpienie procesu powłokiexec [-cl] [-a argv0] [--] polecenie [argumenty]
# Zarządzanie deskryptorami (bez polecenia)exec [przekierowania]
-
Gdy polecenie nie jest podane,
exec
wpływa wyłącznie na deskryptory otwarte/zmienione w przekierowaniach. -
Opcje w Bash ≥ 4:
-c
– czyści środowisko, pozostawiając zmienne z linii poleceń.-l
– ustawia pierwszy znakargv[0]
na dash (-
), tworząc tryb login.-a argv0
– ustawia konkretną wartośćargv[0]
dla uruchamianego programu.
Parametry i przekierowania
Dział zatytułowany „Parametry i przekierowania”Element | Opis |
---|---|
polecenie | Program lub funkcja powłoki zastępująca bieżący proces. |
argumenty | Parametry przekazywane do nowego programu. |
-c | Uruchom bez dziedziczenia środowiska (GNU/Bash). |
-l | Symuluje login shell poprzez zmianę argv[0] . |
-a <nazwa> | Ustawia własne argv[0] (widoczne w ps ). |
n>plik , n<plik | Otwiera plik i przypisuje do deskryptora n. |
n>&m , n<&m | Duplikuje deskryptor m na n. |
n>&- , n<&- | Zamyka deskryptor n. |
POSIX: Jedyną przenośną opcją jest brak opcji;
-c
,-l
,-a
to rozszerzenia Basha/Ksh.
Przykłady użycia
Dział zatytułowany „Przykłady użycia”# 1. Replacing shell with python script (no extra PID)exec python3 app.py # po tym wierszu skrypt się nie wykonuje dalej
# 2. Uruchomienie procesu jako "login" i z niestandardową nazwąexec -a "mydaemon" -l /usr/bin/someservice --foreground
# 3. Otwarcie pliku do odczytu i zapis pod FD 3exec 3<>log.txtecho "Start $(date)" >&3 # zapis przez fd 3read -r firstline <&3 # odczyt z fd 3exec 3>&- # zamknięcie
# 4. Przekierowanie stdout skryptu do pliku bez forkaexec >result.txt # od tej linii wszystko trafia do result.txtecho "Linia w pliku"
# 5. Daemonizacja – zamknięcie FD 0‑2 i przekierowanie do /dev/nullexec 0</dev/null 1>/dev/null 2>&1
- Brak powrotu: Po
exec cmd
kod skryptu dalej nie jest wykonywany –exec
nie wraca, a kod wyjścia skryptu to kod wyjścia nowego programu. - PID zachowany: Program startuje z tym samym PID co powłoka – kluczowe w initach i systemd
ExecStart=
zType=forking
. - Przenośność FD: Numer deskryptora 3 i wyższe są zazwyczaj wolne, ale nie gwarantuje tego środowisko – sprawdź
lsof -p $$
. - Alternatywy: Dla modyfikacji środowiska bez zamiany procesu użyj
env VAR=... cmd
. - Bezpieczeństwo: Niewłaściwe zamknięcie FD może pozbawić programu stdout/stderr – przy debugowaniu użyj
exec 2>debug.log
zamiast pełnego przekierowania.
Najczęściej spotykane błędy i jak je naprawić
Dział zatytułowany „Najczęściej spotykane błędy i jak je naprawić”Błąd / Zachowanie | Przyczyna | Rozwiązanie |
---|---|---|
Skrypt “znika” po exec | Zamieniono powłokę, kolejne linie nie wykonują się | Przenieś kod przed exec lub uruchom polecenie bez exec . |
command not found mimo poprawnej ścieżki | exec -c zeruje $PATH | Ustaw PATH= w tej samej linii lub unikaj -c . |
Proces nie zapisuje logów | stdout/stderr przekierowane do /dev/null | Nie przekierowuj FD 1/2 lub użyj pliku logu. |
exec: Bad file descriptor | Próba użycia zamkniętego FD | Zweryfikuj kolejność exec 3>&- oraz odwołań. |
Linki i źródła
Dział zatytułowany „Linki i źródła”- Bash Reference Manual – exec – opis opcji Bash.
- POSIX specification – exec – zachowanie przenośne.
- Advanced Bash Scripting Guide – File descriptors – przykłady zaawansowanych przekierowań.