Forum Astuces.divers [Terminal] Du bon ordre des redirections

Posté par  .
Étiquettes : aucune
0
5
mar.
2002
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  . Évalué à 1.

    Il s'agit ici de bash.
    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 :
    shutup >& /dev/null 
    ou
    cmd1 |& cmd2
  • # Pipe -> erreur ?

    Posté par  (site web personnel) . Évalué à 1.

    Euh, soit je suis mal réveillé, soit je ne comprends pas ce que le Monsieur veut faire, soit l'exemple du pipe est faux.

    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  . Évalué à 1.

      En fait, je crois qu'il a mal compris comment ça marche !
      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  . Évalué à 1.

        On peut en effet créer plein de flux différents : 3, 4, 5, 6... jusqu'à 1023 sur mon bash ;-)
        Après, à vous de trouver l'intérêt d'en avoir autant...
  • # Re: Du bon ordre des redirections

    Posté par  . Évalué à 1.

    On aura bien sûr lu :

    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  . Évalué à 1.

    ... macommande &> /dev/null
    enverra l'ensemble des sorties vers /dev/null.

    Mes 2 cents
  • # Y a quelqu'un

    Posté par  . Évalué à 1.

    Bonjour

    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  . Évalué à 1.

      Le 2>&1 sert à faire en sorte que l'erreur standard pointe au même endroit que la sortie standard.
      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.