Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

redirection entree sortie

16 réponses
Avatar
vraifaux
Bonjour,

J'ai un répertoire /travail qui est vide.

je fais
1)rmdir aa > /dev/null 2>&1
et rien ne s'affiche à l'écran

j'essaie de comprendre :
D'abord l'instruction rmdir aa >/dev/ null semble envoyer la sortie ecran à
la corbeille mais n'en fait pas de même pour la sortie erreur qui s'affiche
à l'écran.

Or 2>&1 redirige 2 vers l'écran, aussi je ne comprends pas que rien
s'affiche à la fin de 1)


ensuite je fais
2)rmdir aa 2>&1 > /dev/null
et s'affiche alors " rmdir : aa :Aucun fichier ou répertoire de ce type."

J'essaie de comprendre :
rmdir aa 2>&1 redirige 2 vers 1 donc le message d'erreur vers la sortie
écran
et > /dev/null envoie cette sortie à la corbeille. Aussi je ne comprends
pas que dans ce cas un message d'erreur apparaisse.

Je me doute que cette question est bien connue et malgré mes recherches avec
google et les livres
Linux Redhat Fedora (700 pages) je n'arrive pas à éclaircir ce mystère.
Merci mille fois à celui qui saura m'expliquer ces redirections qui me
paraissent obscures.

6 réponses

1 2
Avatar
Nicolas George
"vraifaux" wrote in message <h8e519$h7k$:
on duplique le fd 1 et on l'assigne au fd 2 ?



Un programme Unix manipule les fichiers par le biais de file descriptors
(fd), de petits entiers qui servent au noyau d'index pour des structures de
données.

Un file descriptor pointe vers un élément « description », qui correspond
plus directement au fichier ou pseudo-fichier (extrémité de pipe, device)
lui-même.

Plusieurs file descriptors peuvent pointer sur la même description. Le noyau
garde le compte, pour chaque description, du nombre de file descriptors qui
pointent dessus. Quand ce nombre tombe a zéro, il supprime la description.

L'appel système open crée une description pour le fichier indiqué, puis
trouve le premier file descriptor libre, et le fait pointer sur cette
description.

L'appel système close(X) vide le file descriptor X. Ce qui peut avoir pour
conséquence de supprimer la description correspondante.

L'appel système dup2(X, Y) commence par faire comme close(Y), puis copie le
file descriptor X dans le file descriptor Y.

Quand on écrit « X> foo », le shell commence par faire un open("foo"), et
obtient un filedescriptor Y qui pointe vers une description correspondant au
fichier foo. Ensuite, si X est différent de Y, le shell fait un dup2(Y, X),
de sorte que maintenant, le file descriptor X pointe vers la description de
foo. Enfin, il appelle close(Y).

Quand on écrit « X>&Y », le shell fait un dup2(Y, X).

Dernier point : quand on a « foo | bar », le shell appelle pipe pour obtenir
une paire de file descriptors X et Y qui correspondent à une paire de
descriptions qui sont les extrémités d'un pipe. Puis il se scinde en deux
processus. Dans celui de gauche, il ferme le file descriptor X de lecture,
puis se débrouille avec fup2 et close pour que le file descriptor Y
d'écriture devienne 1. Idem dans le processus de droite, il ne garde que le
file descriptor X de lecture et se débrouille pour qu'il devienne 0. Ceci se
produit _avant_ de commencer à faire les redirections décrites dans foo.
Donc quand on a un pipe, la redirection correspondant au pipe, bien
qu'apparaissant tout à droite de la commande de gauche, intervient en
premier.
Avatar
Eric Dorino
On Fri, 11 Sep 2009 20:31:12 +0200, vraifaux wrote:


Qu'entendez vous par
on duplique le fd 1 et on l'assigne au fd 2 ?



Tiens, je n'ai rien de mieux que le message de Nicolas.


--
Eric
Avatar
vraifaux
"vraifaux" a écrit dans le message de news:
h8cqiu$l0b$
Bonjour,

J'ai un répertoire /travail qui est vide.

je fais
1)rmdir aa > /dev/null 2>&1
et rien ne s'affiche à l'écran

j'essaie de comprendre :
D'abord l'instruction rmdir aa >/dev/ null semble envoyer la sortie ecran
à la corbeille mais n'en fait pas de même pour la sortie erreur qui
s'affiche à l'écran.

Or 2>&1 redirige 2 vers l'écran, aussi je ne comprends pas que rien
s'affiche à la fin de 1)


ensuite je fais
2)rmdir aa 2>&1 > /dev/null
et s'affiche alors " rmdir : aa :Aucun fichier ou répertoire de ce type."

J'essaie de comprendre :
rmdir aa 2>&1 redirige 2 vers 1 donc le message d'erreur vers la sortie
écran
et > /dev/null envoie cette sortie à la corbeille. Aussi je ne comprends
pas que dans ce cas un message d'erreur apparaisse.



Merci à tous et notamment à Eric Dorino dont l'explication

"La situation de départ:
stdout (fd 1) sur /dev/pts/42
stderr (fd 2) sur /dev/pts/42

En spécifiant ls 2>&1 >/dev/null:
- on duplique le fd 1 et on l'assigne au fd 2 (ce qui ne change rien);
- on assigne /dev/null sur stdout;
stdout (fd 1) sur /dev/null
stderr (fd 2) sur /dev/pts/42
et les erreurs vont sur le terminal.

En spécifiant ls >/dev/null 2>&1:
- on assigne /dev/null sur stdout.
stdout (fd 1) sur /dev/null
stderr (fd 2) sur /dev/pts/42
- on duplique le fd 1 et on l'assigne au fd 2;
stdout (fd 1) sur /dev/null
stderr (fd 2) sur /dev/null
et le programme est muet."

est claire
et à Nicolas George dont l'explication complète méritera encore plusieurs
lectures.
Avatar
Nicolas George
Nicolas George wrote in message
<4aaaa1d1$0$31100$:
Un programme Unix manipule les fichiers par le biais de file descriptors
(fd), de petits entiers qui servent au noyau d'index pour des structures de
données.


<snip>

Exercices pour ceux qui pensent avoir compris : comprendre et expliquer la
différence entre ces deux commandes :

programme >log 2>&1
programme >log 2>>log

Tous les éléments de réponses ne sont pas dans mon message, mais il y a
l'essentiel.
Avatar
vraifaux
"Nicolas George" <nicolas$ a écrit dans le message de
news: 4aab4ea9$0$22872$
Nicolas George wrote in message
<4aaaa1d1$0$31100$:
Un programme Unix manipule les fichiers par le biais de file descriptors
(fd), de petits entiers qui servent au noyau d'index pour des structures
de
données.


<snip>

Exercices pour ceux qui pensent avoir compris : comprendre et expliquer la
différence entre ces deux commandes :

programme >log 2>&1
programme >log 2>>log


J'ai experimenté .


1)[ /]# mplayer tv.mpg >log1 2>>log1

MPlayer 1.0rc1-4.1.1 (C) 2000-2006 MPlayer Team

CPU: AMD Athlon(tm) 64 Processor 3200+ (Family: 15, Model: 15, Stepping: 0)

CPUflags: MMX: 1 MMX2: 1 3DNow: 1 3DNow2: 1 SSE: 1 SSE2: 1

Playing tv.mpg.

?

Exiting... (End of file)

o such file or directory

Can't init input joystick

mplayer: could not connect to socket

mplayer: No such file or directory

Failed to open LIRC support. You will not be able to use your remote
control.





Ici affichage ecran puis affichage des erreurs

2)[ /]# mplayer tv.mpg

MPlayer 1.0rc1-4.1.1 (C) 2000-2006 MPlayer Team

CPU: AMD Athlon(tm) 64 Processor 3200+ (Family: 15, Model: 15, Stepping: 0)

CPUflags: MMX: 1 MMX2: 1 3DNow: 1 3DNow2: 1 SSE: 1 SSE2: 1

Can't open joystick device /dev/input/js0: No such file or directory

Can't init input joystick

mplayer: could not connect to socket

mplayer: No such file or directory

Failed to open LIRC support. You will not be able to use your remote
control.

Playing tv.mpg.

?

Exiting... (End of file)

?

3)[ /]# mplayer tv.mpg >log 2>&1

MPlayer 1.0rc1-4.1.1 (C) 2000-2006 MPlayer Team

CPU: AMD Athlon(tm) 64 Processor 3200+ (Family: 15, Model: 15, Stepping: 0)

CPUflags: MMX: 1 MMX2: 1 3DNow: 1 3DNow2: 1 SSE: 1 SSE2: 1

Can't open joystick device /dev/input/js0: No such file or directory

Can't init input joystick

mplayer: could not connect to socket

mplayer: No such file or directory

Failed to open LIRC support. You will not be able to use your remote
control.

Playing tv.mpg.

?

Exiting... (End of fichier)

mplayer tv.mpg >log 2>&1 affiche comme mplayer tv.mpg

Il reste une enigme :

l'erreur dans 2) et 3)

Can't open joystick device /dev/input/js0: No such file or directory

est raccourcie dans 1) en

o such file or directory.

Pourquoi?
Avatar
YBM
vraifaux a écrit :
"Nicolas George" <nicolas$ a écrit dans le message de


...
programme >log 2>&1
programme >log 2>>log


J'ai experimenté .


1)[ /]# mplayer tv.mpg >log1 2>>log1



On peut choisir une commande plus simple...
$ ls -d /var /rav
ls: ne peut accéder /rav: Aucun fichier ou répertoire de ce type
/var


...
Can't open joystick device /dev/input/js0: No such file or directory

est raccourcie dans 1) en

o such file or directory.

Pourquoi?



$ rm -f log; ls -d /var /rav >log 2>&1 ; cat log
ls: ne peut accéder /rav: Aucun fichier ou répertoire de ce type
/var

$ rm -f log; ls -d /var /rav >log 2>>log ; cat log
/var
e peut accéder /rav: Aucun fichier ou répertoire de ce type

idem.

Combien de fois le fichier est-il ouvert dans les deux cas de
figure ?

Outre qu'ouvrir en écriture deux fois le fichier est source
d'ennuis assurés (comme ici), c'est, amha, le buffer d'e/s
de la libc qui emmelle encore plus les données.
1 2