Bash: connaître la valeur de stdout

bonjour,
je me pose la question de savoir comment capter et connaître la valeur de stdout, en général (si standard ou pas), et en particulier dans ce cas de figure:

file=/tmp/script-tmp commande1 | script.sh > $file

la sortie standard de script.sh est donc redirigé vers $file …
Comment, dans mon script, puis-je en connaitre la valeur ?
exemple:

[code]#!/bin/bash

script.sh: un script quelconque, stdout est en théorie /tmp/script-tmp

stdout=/tmp/script-tmp

vers où ma sortie est elle redirigée ?

verifeversou={code que je cherche pour obtenir /tmp/script-tmp}
[ “$stdout” == “$verifeversou” ] && echo “$verifeversou est bien $stdout”[/code]
C’est clair ?

Je suis pas sur que ce soit possible, puis que la redirection se fait à un autre niveau.

merci …
il suffirait de pouvoir évaluer &1, je me dis qu’il y a surement une variable faite pour ça, où une syntaxe pour, car bash connait bien la valeur de &1, alors comment lui faire ‘recrâcher’ … :smiling_imp:

Je crois (mais je suis pas tout à fait sur), que lorsque que bash excute un executable bash, il crée un processus fils qui s’occupe d’intérpréter le code source pendant que le premier se charge du reste (redirection de l’entrée et des sorties justement justement).

Mais peut être qu’il existe une variable (je viens d’un peu chercher j’ai rien trouvé).

Je ne suis pas un pro du bash, mais je pense qu’il doit y avoir moyen de récupérer le texte de la ligne de commande non ? Ensuite à toi de SPLITer avec l’espace … Un peut barbare, mais ça doit marcher non ?
En C, je pense que le “>” doit se retrouver dans **argv de main.

merci, non je pense pas que c’est possible, la redirection n’apparait pas dans les arguments de la ligne de commande …
Voilà, comme en C, mais est-ce que cet **argv est visible d’autre part que de la fonction main ? je me demande … (je connais pas le c). Pour info, tu aurai la ligne de code C qui récupère la valeur de ‘>’ ?

A vu de nez :

#include <stdio.h>

void main(int argc, char **argv)
{
printf("Nombre d'argument : %d\n",argc);
// si je reprends ton exemple commande1 | script.sh > $file
printf("stdout doit être %s",argv[2]);
}

Sans grande conviction …

Pour info le ‘>’ n’est pas du tout analyser par votre programme en argument , en effet il est directement et en premier lieux interpréter par bash , qui récupere le flux de sortie (le flux texte qui par defaut est écrit sur le stream stdout) et va l’écrire dans un fichier , en effet :

avec :

#include <stdio.h>

int main (int argc , char *argv[])
{
        printf("argc : %d\n", argc-1);
        for (int i = 1; i < argc; i++)
                printf("argv[%d] : %s\n", i, argv[i]);
        return 0;
}

Pour ceux ne connaissant pas le c , ce programme affiche le nombre d’arguments et affiche également tout les arguments passés en paramètres .

en supposant que vous appeler l’éxècutable de ce programme "test"
un :

$ ./test > file

va en premier lieux creer le fichier “file” si ce dernier n’existe pas , puis écrire séquentiellement la sortie de ./teste dans file.

vous pouvez constater que ‘>’ est “file” ne sont pas du tout des paramètres , sinon ils seraient affichés :wink:

PS : tu cherche la valeur de stdout au sens le descripteur de fichier ? (qui pour stdout est 1) ou la valeur que cette sortie standard va contenir ?

Si je comprend bien tu renvoie la sortie standard dans un fichier mais tu voudrait connairtre ce qu’il ecrit dedans ?
Une solution serait de lire le fichier … un “tail -f $file” te permettera de suivre l’ecriture dans ce fichier.

non c’est pas ça que je cherche … regardez :

Il est “facile” de savoir ce que stdout, qu’il soit standard ou non, envoie dans la commande 2, et en effet, ça n’est pas des paramètres, mais un flux (comme une pièce jointe à un mail). Exemple:

commande1: ls
commande2: un script maison

$ commande1 | commande2 > /tmp/fic

Mes questions sont:

  • Est-ce que dans le code de commande1 /tmp/fic est visible, au sens ou déjà dans commande1 on sait vers où va être redirigé la sortie (SDTOUT ou un fichier de nom ‘fic’ ? je ne pense pas, d’autant qu’elle est pipée.

  • Est-ce que dans le code de commande1 toujours, bash sait, et donc peut nous dire, vers où va être redirigé la sortie (vers l’entrée de commande2 via le pipe, en l’occurence).

  • Là où ça m’interesse le plus en fait, c’est :
    Est-ce que dans commande2, je peux, dans un bloc de code, connaître (question identique aux autres) la redirection, en tant que descripteur, sans me préoccuper de son contenu, ou de ce qu’il va devenir.

J’illustre l’exemple avec commande1 et commande2, dans un terminal:

On a ici une redirection des 2 flux de sortie vers le fichier. (on pourrait surement simplifier par &>/tmp/fic !).
Mais, dans le code de commande2, on :

[code]#!/bin/bash

je peux récuperer les options et les paramètre, mais aussi le flux puisque ce script reçoit la sortie d’une commande pipée.

etat=0
nom=
while [ -z “$1” ]; do
opt="$1"

je traite les options et les paramètres, ex:

case “$opt” in
-e*) etat=1 ;;
… etc …
*) # là c’est un paramètre par exemple
nom="$opt" ;;
esac
shift
done

Maintenant qu’on a les options et les paramètres, on traite :

en réalité, même si ça n’est pas interdit, je récupère un paramètre

pour montrer plus tard, mais l’exécution de ce script ne se limite pas

au traitement de l’option etat' et du paramètrenom’, et pour cause,

il reçoit un flux, et je le récupère comme ça:

while read line; do

là je traite ce qui est reçu

if [ -n “$nom” ] && [ “$line” = “toto” ]; then
echo "blahblahblah $nom papaute"
fi
done< &0
exit 0[/code]
Donc, je vais retrouver dans /tmp/fic : `blahblahblah toto papaute’ x fois … ça c’est ok.

Maintenant, comment je fais si je veux modifier le test if :

# là je traite ce qui est reçu if [ -n "$nom" ]; then if [ "$line" = "toto" ]; then echo "blahblahblah $nom papaute" elif [ "$line" = "cocofaitdupiedatoto" ]; then # et c'est là que ça coince parce que je veux remettre le fichier à zéro: > /tmp/fic # le blem, c'et que je ne le connais pas d'ici .. juste ? fi fi

Bonsoir,

Conscient que ce fil date, j’y réponds tout de même afin d’y apporter une solution.
Donc oui, il est tout à fait possible de connaître le fichier correspondant à la sortie standard. Qu’elle soit définie en ligne de commande (pipé ou non) ou dans le script.

Pour cela :