L'exemple est juste dans la pratique. L'explication originale du livre est une description précise de ce que dit la norme POSIX, mais les shells de type POSIX que j'ai à portée de main (bash
et dash
, les seuls que l'on voit souvent sous Linux) ne sont pas si pointilleux.
La norme POSIX says the same thing as the book sur les entrées et les descripteurs de sortie, et poursuit en disant ceci: pour n<&word
, « si les chiffres word
ne représentent pas un descripteur de fichier déjà ouvert pour l'entrée, une erreur de redirection entraîne ». Donc, si vous voulez faire attention à la compatibilité POSIX, vous devriez éviter cette utilisation. La documentation bash également says the same thing environ <&
et >&
, mais sans la promesse d'une erreur. Ce qui est bien, car cela ne donne pas d'erreur. Au lieu de cela, empiriquement n<&m
et n>&m
semblent être interchangeables. La seule différence entre <&
et >&
est que si vous laissez le numéro fd à gauche, <&
est par défaut à 0 (stdin) et >&
à 1 (stdout).
Par exemple, nous allons commencer une coquille avec fd 1 pointant vers un fichier bar
, puis essayer exactement le exec 4<&1
exemple, essayez d'écrire sur le fd résultant 4, et voir si cela fonctionne:
$ sh -c 'exec 4<&1; echo foo >&4' >bar; cat bar
foo
C'est le cas, et cela vaut en utilisant soit dash
ou bash
(ou bash --posix
) pour le shell.
Sous le capot, ce sens parce que < & et> & sont presque certainement appeler juste dup2(), qui ne se soucie pas de savoir si les fds sont ouverts pour la lecture ou l'écriture ou annexant ou quoi.
[EDIT : Ajout d'une référence à Posix après discussion dans les commentaires.]
+1, génial à savoir! – l0b0
Merci, surtout pour la référence. Je suis plus intéressé par ce qui est censé fonctionner que par ce qui peut parfois fonctionner dans la pratique. –
@Alexandros: Assez juste. En regardant le standard POSIX (http://pubs.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html#tag_02_07_05), qui est une interprétation de "supposé fonctionner", il dit pour "n <& word' que" si les chiffres de 'word' ne représentent pas un descripteur de fichier déjà ouvert, une erreur de redirection doit se produire". Donc, si vous voulez faire attention à la compatibilité POSIX, vous devriez éviter cette utilisation. –