"[email protected]"
bit se rozšíří na seznam pozičních parametrů (obvykle argumenty příkazového řádku), jednotlivě citované, aby se zabránilo dělení slov a generování názvu souboru ("globbing").
exec
nahradí aktuální proces procesem, který je výsledkem provedení jeho argumentu.
Stručně řečeno, exec "[email protected]"
spustí příkaz daný parametry příkazového řádku tak, že aktuální proces bude nahrazen jím (pokud exec
je schopen příkaz vůbec provést).
Dvě další odpovědi vysvětlují, co exec "[email protected]"
dělá. Tato odpověď na Stack Overflow vysvětluje, proč je to důležité pro Docker, a jak tušíte, souvisí to se signály:
To je v Dockeru důležité pro správné připojení signálů. Například pokud byl Redis spuštěn bez
exec
, neobdržíSIGTERM
nadocker stop
a nebude mít šanci se čistě vypnout. V některých případech to může vést ke ztrátě dat nebo zombie procesům.Pokud podřízené procesy spustíte (tj. nepoužívejte
exec
), nadřazený proces se stává odpovědným za zpracování a předávání signálů podle potřeby. To je jeden z důvodů, proč je nejlepší používatsupervisord
nebo podobně při spouštění více procesů v kontejneru, protože bude signály správně přeposílat.
"[email protected]"
v Bourneovských shellech se v kontextech seznamu rozšiřuje na všechny poziční parametry jako samostatné argumenty.
Ve skriptu jsou zpočátku poziční parametry argumenty, které skript sám obdržel.
exec
je spustit příkaz ve stejném procesu jako shell. To je poslední příkaz, který skript provede, protože po něm bude proces spouštět jiný příkaz než shell.
Pokud je tedy váš skript
#! /bin/sh -
exec "[email protected]"
A svůj skript zavoláte pomocí příkazového řádku shellu jako:
/path/to/your-script 'echo' "some test" 'x y'
Zavolá exec
s echo
, some test
a x y
jako argumenty, které spustí echo
(ve většině sh
implementace, /bin/echo
na rozdíl od echo
shell vestavěný) ve stejném procesu, který dříve spouštěl shell interpretující váš skript pomocí some test
a x y
jako argumenty.