Quelles sont les utilisations de la commande exec dans des scripts shell?
Quelqu'un peut-il expliquer ce que sont les utilisations de la commande exec dans des scripts shell avec des exemples simples?
- Les liens vers d'linux.about.com ne sont pas utiles. Ils ne se rendent pas à distance clair comment l'exécution d'une commande ou d'un pipeline de commandes à l'aide de 'exec' diffère de l'exécution d'eux normalement. D'où l'OP de la question "qu'est-ce que l'utilisation de exec"?
- Stack Overflow est un site pour la programmation et les questions de développement. Cette question semble être hors-sujet, car il n'est pas sur la programmation ou le développement. Voir Quels sont les sujets que pouvez-vous nous parler ici dans le Centre d'Aide. Peut-être Super-Utilisateur ou Unix & Linux Stack Exchange serait un meilleur endroit pour demander cela.
Vous devez vous connecter pour publier un commentaire.
La
exec
de commande intégrée miroirs fonctions dans le noyau, il y a une famille à base deexecve
, ce qui est généralement appelé à partir de C.exec
remplace le programme actuel dans le processus actuel, sansfork
ing un nouveau processus. Il n'est pas quelque chose que vous utilisez dans tous les scripts que vous écrivez, mais il est très pratique à l'occasion. Voici quelques scénarios que j'ai utilisé;Nous voulons que l'utilisateur d'exécuter un programme d'application spécifique, sans accès à la coquille. Nous pourrions changer le signe de programme dans /etc/passwd, mais peut-être que nous voulons paramètre d'environnement pour être utilisé à partir de fichiers de démarrage. Ainsi, dans (dire)
.profile
, la dernière déclaration dit quelque chose comme:alors maintenant, il n'y a pas de shell pour revenir. Même si
appln-program
se bloque, l'utilisateur final ne peut pas lancer un shell, parce qu'il n'y est pas - laexec
l'a remplacé.Nous voulons utiliser un environnement différent de celui dans /etc/passwd. Stupide que cela puisse paraître, certains sites ne permettent pas aux utilisateurs de modifier leur inscription dans un shell. Un site que je connais tout le monde de commencer avec
csh
, et tout le monde vient de mettre dans leur.login
(csh fichier de démarrage) un appel àksh
. Alors que qui a travaillé, il a laissé un errantcsh
processus en cours d'exécution, et la déconnexion a été à deux étages, ce qui pourrait être source de confusion. Nous avons donc changé pourexec ksh
qui viens juste de remplacer le c-shell programme avec le korn shell, et fait tout simple (il y a d'autres problèmes avec cela, comme le fait que leksh
n'est pas un login shell).Juste pour sauver les processus. Si nous appelons
prog1 -> prog2 -> prog3 -> prog4
etc. ne jamais revenir en arrière, puis faire de chaque appel exec. Il permet d'économiser des ressources (pas de beaucoup, certes, à moins répété), et de fait de l'arrêt de plus simple.Vous avez évidemment vu
exec
utilisé quelque part, peut-être que si vous a montré le code qui énerve de vous, nous pourrions justifier son utilisation.Modifier: j'ai réalisé que ma réponse ci-dessus est incomplète. Il y a deux utilise de
exec
en coquilles, commeksh
etbash
- utilisé pour l'ouverture de descripteurs de fichiers. Voici quelques exemples:Remarque que l'espacement est très important ici. Si vous placez un espace entre le fd nombre et le symbole de redirection puis
exec
revient à la signification originelle:Il existe plusieurs façons vous pouvez utiliser ces, sur ksh utilisation
read -u
ouprint -u
, surbash
, par exemple:exec gunicorn
de donner les bonnes pid retour au superviseur.exec
peut être utilisé pour la redirection: > Si la commande n'est pas spécifiée, toutes les redirections prendre effet dans le shell courant, et l'état de retour est 0. Si il y a une redirection de l'erreur, de l'état de retour est 1. Mais comment neexec
fait travailler pour changer un descripteur de fichier? Pourquoi est-ce une commande en particulier choisi pour cette tâche? (Markdown est défaillant à l'instant?)exec >.\logfilename.log 2>&1
@
variable dansman bash
. Leexec
remplace le programme actuel par un nouveau, de nouveau, look-upexec
dans les pages man.exec &> /var/log/userdata.log
, lorsqu'il est suivi par d'autres commandes comme yum install? Il me semble qu'il provoque des commandes à éditer dans le fichier journal au lieu d'être exécutébash
extension (voirman bash
) et votre exemple est équivalent àexec >/var/log/userdata.log 2>&1
. En d'autres termes, il redirige stdout et stderr vers ce fichier. Les commandes qui suivent hériteront de ces redirections, sauf s'ils sont remis à zéro, mais ils seront exécutés.Juste pour augmenter la accepté de répondre à un bref newbie-friendly à réponse courte, vous n'avez probablement pas besoin de
exec
.Si vous êtes encore ici, la suite de la discussion devrait, espérons-le révéler pourquoi. Lorsque vous exécutez, disons,
vous exécutez une
sh
instance, puis commencer àcommand
comme un enfant de cetsh
instance. Lorsquecommand
finitions, lash
instance termine.exécute une
sh
instance, puis remplace quesh
exemple avec lecommand
binaire, et s'exécute à la place.Bien sûr, ces deux sont inutiles dans ce cadre limité; vous voulez simplement
Il y a quelques frange des situations où vous souhaitez que le shell pour lire son fichier de configuration ou en quelque sorte le contraire de définir l'environnement comme une préparation pour la course
command
. C'est à peu près la seule situation oùexec command
est utile.Ce n'des trucs à préparer l'environnement de sorte qu'il contient ce qui est nécessaire. Une fois cela fait, le
sh
instance n'est plus nécessaire, et c'est donc une (petite) optimisation de remplacer simplement lash
exemple avec lecommand
processus, plutôt que d'avoirsh
l'exécuter en tant que processus enfant et de l'attendre, puis la quitter dès qu'elle est terminée.De même, si vous souhaitez libérer autant de ressources que possible pour une heavyish commande à la fin d'un script shell, vous pouvez
exec
qui commande comme d'optimisation.Si quelque chose vous oblige à exécuter
sh
mais vous avez vraiment envie de faire quelque chose d'autre,exec something else
est bien sûr une solution pour remplacer les indésirablessh
instance (comme, par exemple, si vous avez vraiment envie de lancer votre propre soignégosh
au lieu desh
, mais la vôtre n'est pas répertorié dans/etc/shells
de sorte que vous ne pouvez pas spécifier que votre shell de connexion).La deuxième utilisation de
exec
pour manipuler les descripteurs de fichier est un sujet distinct. La accepté de répondre à des couvre-bien; pour garder cette auto-contenue, je vais reporter au manuel d'utilisation pour rien oùexec
est suivie par une redirection au lieu d'un nom de commande.bash -c "<command>"
, (2)bash -c "exec <command>"
, puis, après l'exécution je vérifier l'état de retour en utilisant$?
, vous demandez-vous si il y a des différences? Dans les deux cas$?
de suivi si le<command>
est réussie? Ou suivi si le shell lui-même est ok?bush
. Bien sûr, cela s'applique àbash
ou plus généralement n'importe quel shell Unix ainsi; bien que @anishsane notes, Bash secrètement optimisebash -c 'command'
en faisantexec command
.exec
comprendre bash exécution conditionnelle comme||
et&&
? Merci.bash -c 'exec nonesvch || echo still here'
(indice: ce n'est pasecho
et le code de sortie est 127).sh -c command
dans mon livre; vous pourriez tout aussi bien écrirecommand
et il serait essentiellement le même effet, avec un processus moins. Ainsi, la première section de cette réponse n'est pas vraiment utile — comme vous allez sur l'admettre. Vous pouvez utiliserexec
de terminer le script et de le remplacer avec la commande que vous exécuter; cela permet de réduire le nombre de processus et obtient la coque hors de la boucle lors de la déclaration de l'état de sortie.exec command
parce que vous pouvez utilisersh -c command
à la place". Si ce n'est pas ce que vous voulez dire, vous devez réviser la langue pour le rendre 100% explicites. Crois-moi savoir quand vous avez révisé.exec command
lorsque la commande est la dernière instruction du script au lieu de simplementcommand
. Je crois que je préfère un plus grand réécriture.