Les sorties stdin et stdout sont des pointeurs.
Si vous voulez mettre stdin et stdout vers /dev/null :
macommande > /dev/null 2>&1
Dans l'autre sens, stderr sortira sur la console.
idem, stderr et stdout vers un pipe :
macommande | commande2 2>&1
L'inverse ne fonctionnera pas.
# bash | tcsh/csh
Posté par dvrasp . Évalué à 1.
Avec tcsh ou csh, il n'est pas possible - à ce que je sais - de rediriger séparément les deux canaux de sortie. On peut par contre les joindre de cette manière :
ou
# Pipe -> erreur ?
Posté par Florent Rougon (site web personnel) . Évalué à 1.
En tout cas, je ferais comme ça :
sh % sh -c "echo aa && echo bb 1>&2" 2>&1 | cat >res
puis :
sh % cat res
aa
bb
Mon cat a donc bien récupéré sur son entrée standard le aa envoyé sur stdout par le sh -c ainsi que le bb envoyé sur stderr par ce même sh.
[^] # Re: Pipe -> erreur ?
Posté par harbort . Évalué à 1.
En effet, la commande "&n" permet de pointer vers le même fichier que le fichier de sortie de descripteur n sachant que 1 c'est stdout et 2 c'est stderr.
Maintenant "n>" permet de rediriger le fichier vers lequel pointe de le fichier de descripteur n.
Ainsi, on peut même compliquer un peu les choses et écrire des choses du genre :
sh -c "echo aa & echo bb >&2" 3>res 1>&3 2>&3
Ce qui affecte le descripteur 3 au fichier res puis redirige les sorties 1 et 2 vers le même fichier que 3.
En fait donc, sa commande avec pipe ne marche pas car il redirige la sortie stderr de la seconde commande alors qu'il faut rediriger celle de la première ! En effet, si on veux que le pipe envoie tout, comme il n'envoie que stdout il faut rediriger stderr AVANT le pipe !
A noter qu'il existe, avec bash au moins, un raccourcis pour rediriger les deux sorties standard stdout et stderr vers un fichier :
macommande &> fichier
[^] # Re: Pipe -> erreur ?
Posté par Teuxe . Évalué à 1.
Après, à vous de trouver l'intérêt d'en avoir autant...
[^] # Re: Pipe -> erreur ?
Posté par Philippe F (site web personnel) . Évalué à 1.
# Re: Du bon ordre des redirections
Posté par Teuxe . Évalué à 1.
Si vous voulez mettre stdout et stderr vers /dev/null :
macommande > /dev/null 2>&1
Dans l'autre sens,
macommande 2>&1 >/dev/null
explications plus claires : on redirige le flux d'erreur vers la sortie standard tandis que le flux de sortie "normal" du programme est envoyé vers /dev/null (on "croise" les flux). Eh oui l'ordre des redirections est important.
stdout ---. .--- console
X
stderr ---' `-----------> /dev/null
(waouh, de l'ascii-art -- si ça se trouve, il passe mal chez vous, désolé)
Enfin, stdin (puisqu'on en parle) est désigné par <. On ne peut évidemment pas adresser ce flux : qui enverrait sa sortie sur sa propre entrée ? (quoique quelque part ca pourrait ressembler à de la récurrence... ;-) Non, si c'était possible, je ne vous raconte pas le bazar...
Les développeurs C noteront la similitude entre &var et &flux... d'où la désignation de "pointeur".
Je ne considère pas ça comme une astuce : les flux sont une base dans l'utilisation d'Unix quand même. Lire, écrire dans un fichier, rediriger à travers un pipe, etc. font partie de l'essentiel du fonctionnement d'Unix, donc de Linux...
# Plus rapide ...
Posté par tchibitchi . Évalué à 1.
enverra l'ensemble des sorties vers /dev/null.
Mes 2 cents
# Y a quelqu'un
Posté par techdexploit . Évalué à 1.
Je suis nouveau sur ce site et malgré vos commentaire je ne saisit toujours pas l'interet de " 2>&1 " cela veut-il dire de rediriger l'erreur vers la sortie standart? Excusez mon ignorance en tant que tech d'exsploit je fais tout en ligne de commande et je me familiarise seulement maintenant avec le shell.
En attendant de recevoir peut etre une reponse je vais regarder vos commentaires de plus pres...
[^] # Re: Y a quelqu'un
Posté par VinDuv . Évalué à 1.
Donc si on fait >/dev/null 2>&1 : (les redirections sont lues de gauche à droite)
1) stdout (la sortie standard) est redirigée sur /dev/null
2) stderr (l'erreur standard) est redirigée sur ce que pointe stdout, dans ce cas /dev/null
Donc tout finit dans /dev/null. On pourrait écrire >/dev/null 2>/dev/null, ça aurait le même effet.
On pourrait aussi faire : 2>/dev/null (rediriger stderr sur /dev/null) >&2 (rediriger stdout sur ce que pointe stderr)
Si on fait 2>&1 >/dev/null :
1) stderr est redirigée sur ce que pointe stdout, dans ce cas la console (donc rien ne change)
2) stdout est redirigée sur /dev/null.
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.