"[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žíSIGTERMnadocker stopa 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žívatsupervisordnebo 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.