Contenu | Rechercher | Menus

Annonce

Ubuntu-fr vend de superbes t-shirts et de belles clés USB 32Go
Rendez-vous sur la boutique En Vente Libre

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 19/02/2020, à 20:05

diesel

[RESOLU] Question sur les entrées et sorties standard en bash

En shell, une commande envoie naturellement son résultat sur la sortie standard accessible via le fichier /dev/sdtout et d'éventuels commentaires sur la sortie d'erreur /dev/stderr.

Par exemple, si j'ai un fichier ~/toto contenant la chaîne de caractère "Texte à copier", la commande

dd if=~/toto of=~/tutu 2>~/titi

va me donner les résultats suivants :

rien sur la sortie standard

jean-marie@jean-marie:~$ cat tutu
Texte à copier
jean-marie@jean-marie:~$

et

jean-marie@jean-marie:~$ cat titi
0+1 enregistrements lus
0+1 enregistrements écrits
16 octets copiés, 0,000217142 s, 73,7 kB/s
jean-marie@jean-marie:~$

Jusque là, tout va bien.

Et si je fais

dd if=~/toto of=/dev/stdout 2>~/titi

J'ai le résultat suivant sur la sortie standard

jean-marie@jean-marie:~$ dd if=toto of=/dev/stdout 2>titi
texte à copier
jean-marie@jean-marie:~$

et titi contient la même chose que la fois précédente. Jusque là, tout va encore très bien.

Par contre, si j'ouvre une deuxième fenêtre terminal, la question que je me pose, c'est : Comment fait-il pour savoir sur quelle fenêtre il doit afficher le texte envoyé vers /dev/stdout ?

Amicalement.

Jean-Marie

Dernière modification par diesel (Le 19/02/2020, à 21:25)


Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.
Le mort, il sait pas qu'il est mort ; c'est pour les autres que c'est dur.................... Pour les cons, c'est pareil.

Hors ligne

#2 Le 19/02/2020, à 20:22

jplemoine

Re : [RESOLU] Question sur les entrées et sorties standard en bash

En fait, il faut utiliser > pour diriger la sortie standard avec remplacement et >> pour ajouter au fichier.
Pour la sortie erreur, c'est 2>

cmde > ./test.log 2>&1 --> redirige la sortie standard vers le fichier test.log et la sortie erreur vers la sortie standard
cmde > ./test.log 2>/dev/null --> redirige la sortie standard vers le fichier test.log et les erreurs tombent dans "un trou noir".


Membre de l'ALDIL (Association Lyonnaise pour le Développement de l'Informatique Libre)
- En pro, après 20 ans de développement, administrateur Linux / Unix depuis Avril 2019.
- En privé, sous Ubuntu-Xubuntu depuis 2009.

Hors ligne

#3 Le 19/02/2020, à 20:24

pingouinux

Re : [RESOLU] Question sur les entrées et sorties standard en bash

Bonsoir,
Chaque terminal semble avoir son propre stdout.

Premier terminal

$ file /dev/stdout
/dev/stdout: symbolic link to /proc/self/fd/1

$ file /proc/self/fd/1
/proc/self/fd/1: symbolic link to /dev/pts/1

$ tty
/dev/pts/1

Second terminal

$ file /dev/stdout
/dev/stdout: symbolic link to /proc/self/fd/1

$ file /proc/self/fd/1
/proc/self/fd/1: symbolic link to /dev/pts/14

$ tty
/dev/pts/14

Hors ligne

#4 Le 19/02/2020, à 21:11

diesel

Re : [RESOLU] Question sur les entrées et sorties standard en bash

Bonsoir Pingouinux,

Merci pour cette réponse qui m'éclaire un peu.

J'avais bien vu que /dev/stdout est un lien mais je n'avais pas suivi plus loin.

Et effectivement, si je vais voir le contenu de /dev/pts avec l'explorateur de fichiers, je vois apparaître des fichiers chaque fois que j'ouvre un terminal.

Je vais continuer de creuser cette piste et je vous donnerai le résultat de mes réflexions si je trouve le fin mot de l'histoire.

[EDIT]

Les fichiers stdin, stdout et stderr (enfin, les liens symboliques) sont communs à tous les environnements de terminaux.

C'est au niveau du système de fichiers /proc que se fait l'aiguillage, et en particulier au niveau du répertoire /proc/self. En fait, il s'agit d'une sorte de tableau de répertoires, un par processus, et le système oriente les flux d'informations en fonction du processus qui les a lancés. Voir là au 7.2.1.

Ensuite, quand on continue à descendre dans la hiérarchie du répertoire /proc, on finit par tomber sur un lien qui identifie le bon fichier (de type tty) associé au terminal dans le répertoire /dev/pts.

En fait, au niveau du système, les canaux de communication stdin, stdout et stderr sont banalisés. C'est au niveau des commandes que sont appliquées les conventions entrée sur stdin, sortie sur stdout et messages d'erreur sur stderr. La preuve, je peux très bien écrire :

jean-marie@jean-marie:~$ umount /dev/sda1 0>toto 2>&0
jean-marie@jean-marie:~$ cat toto
umount: /home: démontage échoué : Opération non permise.
jean-marie@jean-marie:~$

[/EDIT]

Amicalement.

Jean-Marie

Dernière modification par diesel (Le 19/02/2020, à 21:37)


Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.
Le mort, il sait pas qu'il est mort ; c'est pour les autres que c'est dur.................... Pour les cons, c'est pareil.

Hors ligne