305 votes

Comment détecter si mon shell script s'exécute dans un tuyau ?

Comment puis-je détecter à l'intérieur d'un shell script si sa sortie standard cible un terminal ou si elle est canalisée vers un autre processus ? (Cas concret : j'aimerais ajouter des codes d'échappement pour colorer la sortie, mais uniquement lorsqu'elle est exécutée de manière interactive, mais pas lorsqu'elle est pipée, de manière similaire à ce qui se passe dans le cas de l'application ls --color fait.)

474voto

dmckee Points 50318

C'est du pur délit :

if [ -t 1 ] ; then echo terminal; fi

renvoie "terminal", car la sortie vous est directement adressée, alors que

(if [ -t 1 ] ; then echo terminal; fi) | cat

ne renvoie rien, car la sortie va vers cat .


L'option -t est décrite dans les pages du manuel comme suit

-t fd Vrai si le descripteur de fichier fd est ouvert et fait référence à un terminal.

et je profite des affectations habituelles des descripteurs de fichiers

0:     stdin  
1:     stdout  
2:     stderr

35voto

Beano Points 3021

La commande test (intégré dans bash ), a une option pour vérifier si un descripteur de fichier est un tty.

if [ -t 1 ]; then
    # stdout is a tty
fi

Voir " man test " ou " man bash "et recherchez " -t "

13voto

Dan Moulding Points 46866

Vous ne mentionnez pas le shell que vous utilisez, mais en Bash, vous pouvez le faire :

#!/bin/bash

if [[ -t 1 ]]; then
    # stdout is a terminal
else
    # stdout is not a terminal
fi

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X