Quelqu'un peut-il expliquer comment utiliser la commande exec dans le script shell avec des exemples simples?
Réponse
Trop de publicités?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 fork
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: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é. 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 errantcsh
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é enexec 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).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