OVH Cloud OVH Cloud

Detection d'un pipe

5 réponses
Avatar
Pim
Bonjour,

Je travaille sous Linux Debian.

Je souhaite savoir comment faire en sorte qu'un script
puisse reconnaitre si il a un pipe sur son entrée pour que :

Si je lui envoie des données en pipe :
-il traite stdin

Si je lui donne un fichier en paramêtre :
-il traite les données de ce fichier

Si je ne lui met aucun argument et aucun pipe:
-il quitte sans rien faire.




par exemple:

ls -ltr | MonScript.sh => traite stdin et renvoie le résultat

MonScript.sh => ne fait rien MAIS NE BLOQUE PAS!

MonScript.sh CeFichier.txt => traite CeFichier.txt et renvoie le
résultat.

Une solution en C (système Unix) me convient.

Je présise:
Le fait de traiter la présence ou non d'un paramêtre n'est pas la
question.

La question est comment détecter le fait qu'on lui envoie des données
en pipe ou pas.

Je vous remercie par avance de votre précieuse aide.

Pim.

5 réponses

Avatar
gilles civario
Pim wrote:

Bonjour,

Je travaille sous Linux Debian.

Je souhaite savoir comment faire en sorte qu'un script
puisse reconnaitre si il a un pipe sur son entrée pour que :

Si je lui envoie des données en pipe :
-il traite stdin

Si je lui donne un fichier en paramêtre :
-il traite les données de ce fichier

Si je ne lui met aucun argument et aucun pipe:
-il quitte sans rien faire.




par exemple:

ls -ltr | MonScript.sh => traite stdin et renvoie le résultat

MonScript.sh => ne fait rien MAIS NE BLOQUE PAS!

MonScript.sh CeFichier.txt => traite CeFichier.txt et renvoie le
résultat.

Une solution en C (système Unix) me convient.

Je présise:
Le fait de traiter la présence ou non d'un paramêtre n'est pas la
question.

La question est comment détecter le fait qu'on lui envoie des données
en pipe ou pas.

Je vous remercie par avance de votre précieuse aide.

Pim.
$ cat ispipe.c

#include <unistd.h>
#include <stdio.h>

int
main (int argc, char** argv) {
printf("isatty(fileno(stdin)) = %dn",isatty(fileno(stdin)));
return 0;
}
$ cc ispipe.c -o ispipe
$ ./ispipe
isatty(fileno(stdin)) = 1
$ echo toto | ./ispipe
isatty(fileno(stdin)) = 0


gilles

Avatar
Stephane Chazelas
2004-01-26, 12:59(+00), Pim:
[...]
Je travaille sous Linux Debian.

Je souhaite savoir comment faire en sorte qu'un script
puisse reconnaitre si il a un pipe sur son entrée pour que :

Si je lui envoie des données en pipe :
-il traite stdin


Tu préfèreras peut-être vérifier que l'entrée standard n'est pas
un terminal [ ! -t 0 ]

Sinon, pour vérifier que c'est un pipe,

if perl -MPOSIX -e 'exit !S_ISFIFO((stat STDIN)[2])'; then
echo "stdin est un pipe"
else
echo "stdin n'est pas un pipe"
fi

Si je lui donne un fichier en paramêtre :
-il traite les données de ce fichier

Si je ne lui met aucun argument et aucun pipe:
-il quitte sans rien faire.


Et si tu lui donnes un fichier sur son entrée standard
(MonScript.sh < fichier) ?

Une solution en C (système Unix) me convient.


Similaire en C qu'en perl (voir fstat(2) et S_ISFIFO)

Sur Linux (et sur Linux seulement, probablement), tu peux aussi
utiliser:

if [ "$(($(stat -Lc 0x%f /dev/stdin) & 0x1000))" -eq $((0x1000)) ]

(if faut que /dev/stdin soit supporté, et encore sous la forme
d'un lien symbolique vers le fichier original [et que "stat"
soit le GNU stat]).

Avec zsh:

zmodload -i zsh/stat
stat -A mode -f 0 +mode
if (( $mode & 0x1000 ))

--
Stéphane ["Stephane.Chazelas" arobase "free.fr"]

Avatar
Jean-Marc Bourguet
Pim writes:

Bonjour,

Je travaille sous Linux Debian.

Je souhaite savoir comment faire en sorte qu'un script puisse
reconnaitre si il a un pipe sur son entrée pour que :

Si je lui envoie des données en pipe :
-il traite stdin

Si je lui donne un fichier en paramêtre :
-il traite les données de ce fichier

Si je ne lui met aucun argument et aucun pipe:
-il quitte sans rien faire.


Tester si c'est un terminal, c'est possible en shell (test -t 0).
C'est vraissemblablement d'ailleurs mieux que de tester si c'est un
pipe car je doute que tu veuilles traiter

script < fichier

de maniere differente que

cat fichier | script


(Mais bon perso j'aime vraiment pas ce genre de comportement ou on
depend de la source)

A+

--
Jean-Marc
Site de usenet-fr: http://www.usenet-fr.news.eu.org

Avatar
Stephane Chazelas
2004-01-26, 14:32(+01), Stephane Chazelas:
[...]
Sinon, pour vérifier que c'est un pipe,

if perl -MPOSIX -e 'exit !S_ISFIFO((stat STDIN)[2])'; then


Well,

if perl -e 'exit ! -p STDIN'

devrait suffire.

--
Stéphane ["Stephane.Chazelas" arobase "free.fr"]

Avatar
Pim
Le 26 Jan 2004 12:59:59 GMT,
Pim disait ceci :

Je vous remercie par avance de votre précieuse aide.
Et aussi après.

Voiçi un ensemble d'informations que je vais pouvoir mettre de coté.
Merci à tous donc.
Pim.