Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 12/09/2012, à 11:04

DonutMan75

[Résolu] Quelques questions concernant les redirecteurs

Bonjour à vous tous,

je fais quelques tests avec les descripteurs d'entrées/sorties et j'aurais aimé avoir vos avis éclairés sur quelques points.


=== Premier cas ===

Imaginons que dans le corps du script, je choisisse de changer les descripteurs standards de cette façon :

exec 0<entree.txt 1>sortie.txt 2>erreur.txt

Plus loin dans ce même script, je souhaite retrouver le comportement par défaut.
J'ai essayé la syntaxe suivante qui semble marcher :

exec 0</dev/tty 1>/dev/tty 2>/dev/tty

Vous paraît-t-elle propre ?
Par ailleurs, je n'ai pas très bien compris pourquoi il existe plusieurs tty dans /dev/ (tty0, tty1 etc...) ?


=== Second cas ===

Je souhaiterais rediriger la sortie standard et les messages d'erreur dans un seul et même fichier pour l'ensemble des commandes de mon script.

Pour cela, je dois écrire au début :

exec 1>sortie.txt 2>&1

De cette façon, les messages ne s'écrasent pas les uns et les autres et je garde la structure séquentielle des messages.

Problème : après exécution du script, quand je lis une ligne quelconque de sortie.txt, je ne sais pas s'il s'agit d'une ligne standard ou d'une ligne d'erreur. Pensez-vous qu'il soit possible de préfixer systématiquement chacune des lignes avec un tag "STD>>>" ou "ERR>>>" afin d'identifier la nature du message ? J'ai beau me creuser la tête, je ne vois pas comment faire ça....

Merci d'avance pour vos réponses smile

Donut

Dernière modification par DonutMan75 (Le 17/09/2012, à 17:20)

Hors ligne

#2 Le 12/09/2012, à 11:48

pingouinux

Re : [Résolu] Quelques questions concernant les redirecteurs

Bonjour,
Réponse au === Second cas ===

exec 1> >(sed 's/^/STD>>>/' >sortie.txt) 2> >(sed 's/^/\x08\x08\x08\x08\x08\x08ERR>>>/' >&1)

Ce n'est pas très joli, et il y a peut-être plus simple.

Ajouté : il y a plus simple

exec 1> >(sed 's/^/STD>>>/' >sortie.txt) 2> >(sed 's/^/\x0dERR>>>/' >&1)

Remarque : À l'écran, le fichier sortie.txt est correct. Si tu l'édites, tu verras que les messages d'erreur ressemblent à ceci :

STD>>>\rERR>>>Le message d'erreur

Dernière modification par pingouinux (Le 12/09/2012, à 12:10)

Hors ligne

#3 Le 12/09/2012, à 12:12

DonutMan75

Re : [Résolu] Quelques questions concernant les redirecteurs

Bonjour pingouinux,
merci pour ta réponse smile

Pourrais-tu détailler ta syntaxe ?
Je comprends bien les deux commandes sed, mais je ne comprends pas leur branchement avec le reste. En particulier, que signifie "1> >" ?

D'après ce que je comprends, les messages envoyés sur les sorties 1 et 2 sont filtrés par sed puis redirigés dans sortie.txt ?

Sortie 1 : le filtre ajoute "STD>>>" au début de la ligne

Sortie 2 : le filtre ajoute "ERR>>>" au début de la ligne ET supprime (par avance) les 6 caractères ("STD>>>") qui seront ajoutés dans &1

Merci smile

Hors ligne

#4 Le 12/09/2012, à 12:18

pingouinux

Re : [Résolu] Quelques questions concernant les redirecteurs

DonutMan75 #3 a écrit :

En particulier, que signifie "1> >" ?

command1 1> >(command2)

La sortie standard de command1 sert d'entrée standard à command2.

Hors ligne

#5 Le 12/09/2012, à 12:59

DonutMan75

Re : [Résolu] Quelques questions concernant les redirecteurs

Bonjour, je viens de tester sur mon pc et ça ne marche pas...

Pour simplifier, j'ai testé avec deux scripts :

PointA : redirige sa sortie standard sur l'entrée de pointB puis fait un echo "coucou"

#! /bin/bash

exec 1> >./PointB
echo "coucou"

PointB : redirige sa sortie standard dans sortieB.txt

#! /bin/bash

exec 1>./sortieB.txt

Quand j'execute PointA, j'ai l'erreur suivante :

./PointA : syntax error near unexpected token '>'
./PointA : 'exec 1> >./PointB'

Savez-vous pourquoi cela ne fonctionne pas ?
Je me demande par ailleurs s'il ne manque pas quelque chose dans PointB pour lui dire de recopier son entrée standard sur sa sortie standard ? Quelque chose comme exec 0 > &1  (mais je ne pense pas que ca soit valide)??

Merci smile

Donut

Hors ligne

#6 Le 12/09/2012, à 13:13

pingouinux

Re : [Résolu] Quelques questions concernant les redirecteurs

Voici ce qui marche :

$ cat PointA
#! /bin/bash

exec 1> >(./PointB)
echo "coucou"
$ cat PointB
#! /bin/bash

exec 1>./sortieB.txt
cat

Hors ligne

#7 Le 12/09/2012, à 13:52

DonutMan75

Re : [Résolu] Quelques questions concernant les redirecteurs

Super,
ça marche nickel maintenant,
j'ai juste remplacé le cat de PointB (pose problème) par :

while read ligne ; do
  echo "$ligne"
done;

Merci pour ton aide smile

Donut

Hors ligne

#8 Le 12/09/2012, à 13:54

pingouinux

Re : [Résolu] Quelques questions concernant les redirecteurs

Le cat fonctionne bien chez moi.

Hors ligne

#9 Le 12/09/2012, à 18:02

DonutMan75

Re : [Résolu] Quelques questions concernant les redirecteurs

Ah oui, je viens de retenter ça chez moi..
J'ai du faire une erreur de frappe de tout à l'heure...

Merci encore pour ton aide smile

Donut

Hors ligne

#10 Le 15/09/2012, à 11:58

Postmortem

Re : [Résolu] Quelques questions concernant les redirecteurs

Salut,

DonutMan75 a écrit :

Bonjour à vous tous,

je fais quelques tests avec les descripteurs d'entrées/sorties et j'aurais aimé avoir vos avis éclairés sur quelques points.


=== Premier cas ===

Imaginons que dans le corps du script, je choisisse de changer les descripteurs standards de cette façon :

exec 0<entree.txt 1>sortie.txt 2>erreur.txt

Plus loin dans ce même script, je souhaite retrouver le comportement par défaut.
J'ai essayé la syntaxe suivante qui semble marcher :

exec 0</dev/tty 1>/dev/tty 2>/dev/tty

Vous paraît-t-elle propre ?

Pour récupérer le comportement par défaut, il faut ajouter ceci juste avant de faire tes redirections ; ça va sauvegarder les descripteurs par défaut (la sortie standard dans le descripteur 3, la sortie d'erreur dans le descripteur 4 et l'entrée standard dans le descripteur 5) :

exec 3>&1 4>&2 5<&0
exec <ici vont tes redirections>

Puis, quand tu veux restaurer les descripteurs par défaut (ça ferme les descripteurs 3, 4 et 5 par la même occasion) :

exec >&3- 2>&4- <&5-

Comme ça, tu n'es pas embêté si tes descripteurs par défaut sont autres que /dev/tty.


Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#11 Le 17/09/2012, à 17:20

DonutMan75

Re : [Résolu] Quelques questions concernant les redirecteurs

Bonjour Postmortem,
merci pour ta réponse.
En effet, utiliser d'autres redirecteurs est plus propre (on ne touche pas aux redirecteurs par défaut).

Merci à vous tous wink

Donut

Hors ligne