Le "[email protected]"
bit s'étendra à la liste des paramètres de position (généralement les arguments de la ligne de commande), entre guillemets individuellement pour éviter le fractionnement des mots et la génération de noms de fichiers ("globbing").
Le exec
remplacera le processus courant par le processus résultant de l'exécution de son argument.
En bref, exec "[email protected]"
exécutera la commande donnée par les paramètres de la ligne de commande de manière à ce que le processus en cours soit remplacé par celle-ci (si le exec
est capable d'exécuter la commande du tout).
Deux autres réponses expliquent ce que exec "[email protected]"
Est-ce que. Cette réponse sur Stack Overflow explique pourquoi c'est important pour Docker, et comme vous le supposez, cela a à voir avec les signaux :
Ceci est important dans Docker pour que les signaux soient correctement proxy. Par exemple, si Redis a été démarré sans
exec
, il ne recevra pas deSIGTERM
surdocker stop
et n'aura pas la chance de s'arrêter proprement. Dans certains cas, cela peut entraîner une perte de données ou des processus zombies.Si vous démarrez des processus enfants (c'est-à-dire n'utilisez pas
exec
), le processus parent devient responsable de la gestion et de la transmission des signaux, le cas échéant. C'est l'une des raisons pour lesquelles il est préférable d'utilisersupervisord
ou similaire lors de l'exécution de plusieurs processus dans un conteneur, car il transmettra les signaux de manière appropriée.
"[email protected]"
dans les shells de type Bourne, dans les contextes de liste, s'étend à tous les paramètres de position en tant qu'arguments séparés.
Dans un script, initialement, les paramètres positionnels sont les arguments que le script lui-même a reçus.
exec
consiste à exécuter une commande dans le même processus que le shell. C'est la dernière commande qu'un script exécutera car après cela, le processus exécutera une autre commande que le shell.
Donc, si votre script est
#! /bin/sh -
exec "[email protected]"
Et vous appelez votre script en utilisant une ligne de commande shell comme :
/path/to/your-script 'echo' "some test" 'x y'
Il appellera exec
avec echo
, some test
, et x y
comme arguments qui exécuteront echo
(dans la plupart des sh
implémentations, /bin/echo
par opposition au echo
shell intégré) dans le même processus qui exécutait précédemment le shell interprétant votre script avec some test
et x y
comme arguments.