Il "[email protected]"
bit si espanderà all'elenco dei parametri posizionali (solitamente gli argomenti della riga di comando), citati singolarmente per evitare la suddivisione delle parole e la generazione del nome file ("globbing").
L'exec
sostituirà il processo corrente con il processo risultante dall'esecuzione del suo argomento.
In breve, exec "[email protected]"
eseguirà il comando dato dai parametri della riga di comando in modo tale che il processo corrente venga sostituito da esso (se exec
è in grado di eseguire il comando).
Altre due risposte spiegano cosa exec "[email protected]"
fa. Questa risposta su Stack Overflow spiega perché è importante per Docker e, come supponi, ha a che fare con i segnali:
Questo è importante in Docker affinché i segnali vengano inoltrati correttamente. Ad esempio, se Redis è stato avviato senza
exec
, non riceverà unSIGTERM
sudocker stop
e non avrà la possibilità di spegnersi in modo pulito. In alcuni casi, ciò può portare alla perdita di dati o a processi zombi.Se avvii processi figli (cioè non usare
exec
), il processo padre diventa responsabile della gestione e dell'inoltro dei segnali come appropriato. Questo è uno dei motivi per cui è meglio usaresupervisord
o simile quando si eseguono più processi in un contenitore, poiché inoltrerà i segnali in modo appropriato.
"[email protected]"
nelle shell tipo Bourne, nei contesti elenco si espande a tutti i parametri posizionali come argomenti separati.
In uno script, inizialmente, i parametri posizionali sono gli argomenti che lo script stesso ha ricevuto.
exec
è eseguire un comando nello stesso processo della shell. Questo è l'ultimo comando che verrà eseguito da uno script, perché in seguito il processo eseguirà un comando diverso dalla shell.
Quindi, se il tuo script è
#! /bin/sh -
exec "[email protected]"
E chiami il tuo script usando una riga di comando della shell come:
/path/to/your-script 'echo' "some test" 'x y'
Chiamerà exec
con echo
, some test
e x y
come argomenti che eseguiranno echo
(nella maggior parte dei file sh
implementazioni, /bin/echo
al contrario del echo
shell integrato) nello stesso processo che in precedenza eseguiva la shell interpretando il tuo script con some test
e x y
come argomenti.