Je ne comprends pas la commande bash exec
. Je l'ai vu utilisé dans des scripts pour rediriger toutes les sorties vers un fichier (comme indiqué dans ceci ). Mais je ne comprends pas comment ça marche ou ce que ça fait en général. J'ai lu les pages de manuel mais je ne les comprends pas.
108
exec
une manière particulière, qui peut être expliquée beaucoup plus simplement, je vais écrire une réponse.Réponses:
man bash
dit:Ce qui est important, ce sont les deux dernières lignes: si vous exécutez tout
exec
seul, sans commande, les redirections s’appliqueront simplement au shell actuel. Vous savez probablement que lorsque vous exécutezcommand > file
, la sortie decommand
est écrite aufile
lieu de sur votre terminal (on parle de redirection ). Si vous l'exécutez à laexec > file
place, la redirection s'applique à l'ensemble du shell: toute sortie produite par le shell est écrite aufile
lieu de sur votre terminal. Par exemple iciJe commence d'abord un nouveau
bash
shell. Ensuite, dans ce nouveau shell, je lanceexec > file
, de sorte que toutes les sorties soient redirigéesfile
. En effet, après cela, je coursdate
mais je n’obtiens aucune sortie, car la sortie est redirigée versfile
. Ensuite, je quitte mon shell (pour que la redirection ne s'applique plus) et je constate quefile
contient effectivement le résultat de ladate
commande que j'ai exécutée précédemment.la source
exec
sert également à remplacer le processus shell actuel par une commande, de sorte que le parent aille de l’avant et que l’enfant possède le pid. Ce n'est pas seulement pour la redirection. S'il vous plaît ajouter cette informationexec nginx <various nginx arguments>
. Cela signifie que nginx reprend le pid du script bash et maintenant, nginx est le processus principal d'exécution du conteneur, pas le script. Je suppose que ceci est juste pour la propreté, à moins que quelqu'un d'autre connaisse une raison plus concrète pour cela?gnome-terminal
, qui au moins sur 14.04 avait un script de wrapper pour configurer des arguments. Et c’est leur seul but, vraiment - mettre en scène les arts et l’environnement. Un autre cas serait de nettoyer - tuez d’abord l’instance précédente d’un processus et en lancer un nouveauexec
exemple similaire à l'nginx
exemple donné par @LukeGriffiths est le~/.vnc/xstartup
script quivncserver
utilise pour configurer un processus de serveur VNC, puisexec gnome-session
ouexec startkde
et ainsi de suite.exec
un script de démarrage de conteneur est que le PID 1, ENTRYPOINT du conteneur, a une signification particulière dans Docker. C'est un processus principal qui reçoit des signaux et, lorsqu'il existe, le conteneur se ferme également.exec
juste un moyen desh
sortir de cette chaîne de commande et de faire du démon le processus principal du conteneur.exec
est une commande avec deux comportements très distincts, selon qu’au moins un argument est utilisé avec elle ou pas du tout.Si au moins un argument est passé, le premier est utilisé comme nom de commande et
exec
tente de l'exécuter en tant que commande, en transmettant les arguments restants, le cas échéant, à cette commande et en gérant les redirections, le cas échéant.Si la commande passée en tant que premier argument n'existe pas, le shell actuel, pas seulement la commande exec, se termine en erreur.
Si la commande existe et qu'elle est exécutable, elle remplace le shell actuel. Cela signifie que si
exec
apparaît dans un script, les instructions qui suivent l'appel exec ne seront jamais exécutées (sauf si ellesexec
sont elles-mêmes dans un sous-shell).exec
ne revient jamais. Les pièges tels que "EXIT" ne seront pas déclenchés non plus.Si aucun argument n'est passé,
exec
est uniquement utilisé pour redéfinir les descripteurs de fichier shell actuels. Le shell continue après leexec
, contrairement au cas précédent, mais l'entrée standard, la sortie, l'erreur ou tout autre descripteur de fichier redirigé prend effet.Si certaines des redirections utilisent
/dev/null
, toute entrée de celle-ci renverra EOF et toute sortie vers celle-ci sera supprimée.Vous pouvez fermer les descripteurs de fichier en utilisant
-
comme source ou destination, par exempleexec <&-
. Les lectures ou écritures suivantes échoueront alors.Voici deux exemples:
Ce script affichera "foo" en tant que commande cat, au lieu d'attendre la saisie de l'utilisateur, comme cela aurait été le cas habituel, prendra son entrée dans le fichier / tmp / bar qui contient foo.
Ce script affiche
4
(le nombre d'octets dans / tmp / bar) et se termine immédiatement. Lacat
commande ne sera pas exécutée.la source
/dev/null
, donc les écritures réussissent toujours et les lectures retournent EOF.close(2)
sur un fd, les appels système en lecture / écriture renverraient des erreurs, ce que vous feriez avec,exec 2>&-
par exemple.exec 3</dev/null;
ls -l /proc/self/fd
notez que le fd 3 sera ouvert en lecture seule sur / dev / null. Puis fermez-le à nouveau avecexec 3<&-
, et vous verrez (avec àls -l /proc/$$/fd
nouveau) que votre processus shell n'a plus de fd 3. (fermer stdin avecexec <&-
peut être utile dans les scripts, mais interactivement c'est une déconnexion.)exec
la réponse la plus votée actuelle ne parle que d'un cas d'utilisation et l'autre réponse de g_p ne parle que de l'autre cas d'utilisation. Et cette réponse est agréable et concise / lisible pour un sujet aussi complexe.Pour comprendre,
exec
vous devez d'abord comprendrefork
. J'essaie de rester bref.Lorsque vous arrivez à un embranchement, vous avez généralement deux options. Les programmes Linux atteignent cette fourchette lorsqu'ils lancent un
fork()
appel système.Les programmes normaux sont des commandes système existant sous une forme compilée sur votre système. Lorsqu'un tel programme est exécuté, un nouveau processus est créé. Ce processus enfant a le même environnement que son parent, seul le numéro d'identification du processus est différent. Cette procédure s'appelle une fourchette .
exec
est utilisé.exec
remplacera le contenu du processus en cours d'exécution par les informations d'un programme binaire.la source
exec
peut rediriger une sortie de script, comme dans le lien que j'ai posté?Dans
bash
, si vous faiteshelp exec
:Le bit pertinent:
exec
est un shell intégré , qui est l’équivalent du shell de laexec
famille des appels système dont parle G_P (et dont vous semblez avoir lu les pages de manuel). Il ne dispose que de la fonctionnalité mandatée par POSIX qui affecte le shell actuel si aucune commande n'est spécifiée.la source