Pourquoi la commande exec est-elle utilisée pour la redirection de descripteur de fichier?

1

Sous UNIX, comme Bash et Korn exec est utilisé pour deux utilisations spécifiques.

Son utilisation pour remplacer le programme actuel par un autre, comme dans exec prog est compréhensible. Le nom exec est une contraction de la famille de routines C basée sur execve.

Si j'écrivais un shell et que je voulais une commande pour ouvrir un fichier, je l'appellerais probablement open, mais non, les obus Bash et Korn utilisent exec encore une fois, comme dans exec 3<file, par exemple.

Pourquoi le exec commande réutilisée pour quelque chose de complètement différent?

cdarke
la source

Réponses:

1

Ce n'est pas vraiment complètement différent: vous pouvez utiliser des redirections avec une commande

bash -c 'exec date > date.out' ; cat date.out

Pourquoi ne pas l'utiliser sans commande

bash -c 'exec > date.out; date' ; cat date.out
glenn jackman
la source
Je n'avais jamais considéré la commande exec de cette manière, même si je l'utilise depuis plus de 20 ans. Merci.
cdarke
1

Je suis 4 ans en retard à la fête, mais je viens de regarder moi-même.

Notez simplement que vous devez être prudent avec la réponse de Glenn, car dans le cas où vous utilisez exec avec à la fois une commande et une redirection, le résultat est simplement la redirection.

La commande supposée 'exec'd' sera exécutée dans un sous-shell, et les commandes suivantes dans le script appelant seront toujours exécutées.

Ce qui pour moi suggère que les deux utilisations devraient vraiment être deux commandes distinctes.

Jeff Beggs
la source
1
(1) Peut-être que je comprends mal ce que vous dites, mais je ne peux pas reproduire ce que je pense que vous dites dans bash4.1. J'ai fait exec date > date.out dans un script, et les commandes après dans le script didnotrun. (2) Ce n'est pas vraiment une réponse à la question.
Scott
1
Autant que je sache, la commande exec'd ne se produit pas dans un sous-shell mais dans le même processus, à moins que vous n'ayez la preuve qu'il s'agit d'un sous-shell. J'ai également essayé de reproduire cela et obtenu les mêmes résultats que @Scott dans les versions 3.2 et 4.4 de bash. Pour citer le code source ( builtins/exec.def ) Remplacez le shell avec la commande donnée. Exécutez COMMAND en remplaçant ce shell par le programme spécifié. Les arguments deviennent les arguments de COMMAND. Si COMMAND n'est pas spécifié, les redirections prennent effet dans le shell actuel.
cdarke
Pour répondre au point 2 de Scott - je n'ai pas la réputation de pouvoir commenter, j'ai donc ajouté une réponse - je ne sais pas si c'est approuvé ou non. Je vois ce que vous entendez par votre exemple de date. Je déboguais un script qui faisait quelque chose comme exec date | tee date.out et qui se comporte différemment. Si vous exécutez un script qui affiche $$ de cette façon, vous verrez que vous obtenez un nouveau shell. Donc, il semble qu'une pipe fonctionne différemment. Je cherchais un peu la même chose, mais je suppose qu'un tuyau inclut une redirection, mais représente plus qu'une simple redirection.
Jeff Beggs