245 votes

Quelle est l'utilisation de la commande exec dans le script shell?

Quelqu'un peut-il expliquer comment utiliser la commande exec dans le script shell avec des exemples simples?

276voto

cdarke Points 8020

L' exec de commande intégrée miroirs fonctions dans le noyau, il y a une famille en execve, ce qui est généralement appelé à partir de C.

exec remplace le programme actuel dans le processus actuel, sans forking 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é;

  1. 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:

     exec appln-program
    

    alors maintenant, il n'y a pas de shell pour revenir. Donc, même si l' appln-program se bloque, l'utilisateur final ne peut pas lancer un shell, parce qu'il n'est pas là - exec qu'il a remplacé.

  2. 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 à l' ksh. Alors que qui a travaillé, il a laissé un errant csh processus en cours d'exécution, et la déconnexion a été à deux étages, ce qui pourrait être source de confusion. Donc, nous l'avons changé en exec ksh qui vient d'être remplacé, 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 l' ksh n'est pas un login shell).

  3. Juste pour sauver les processus. Si nous appelons prog1 -> prog2 -> prog3 -> prog4 etc. et de ne jamais revenir en arrière, puis faire de chaque appel exec. Il permet d'économiser des ressources (pas beaucoup, il faut le dire. sauf 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.

Edit: j'ai réalisé que ma réponse ci-dessus est incomplète. Il y a deux utilisations de l' exec en coquilles, comme ksh et bash - utilisé pour l'ouverture de descripteurs de fichiers. Voici quelques exemples:

exec 3< thisfile          # open "thisfile" for reading on file descriptor 3
exec 4> thatfile          # open "thatfile" for writing on file descriptor 4
exec 8<> tother           # open "tother" for reading and writing on fd 8
exec 6>> other            # open "other" for appending on file descriptor 6
exec 5<&0                 # copy read file descriptor 0 onto file descriptor 5
exec 7>&4                 # copy write file descriptor 4 onto 7
exec 3<&-                 # close the read file descriptor 3
exec 6>&-                 # close the write file descriptor 6

Notez que l'espacement est très important ici. Si vous placez un espace entre le fd nombre et le symbole de redirection alors exec revient à la signification originelle:

  exec 3 < thisfile       # oops, overwrite the current program with command "3"

Il existe plusieurs façons vous pouvez utiliser ces, sur ksh utiliser read -u ou print -u, bash, par exemple:

read <&3
echo stuff >&4

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X