(pour être complet)
Bien que la réponse de @ enzotib soit probablement ce que vous voulez, ce n'est pas ce que vous avez demandé. [ -t 1 ]
vérifie si le descripteur de fichier est un périphérique terminal, et non pas autre chose qu'un tube (comme un fichier normal, une socket, un autre type de périphérique comme /dev/null
...)
La [
commande n'a pas d'équivalent -t
mais pour les tuyaux. Pour obtenir le type du fichier associé à un descripteur de fichier, vous devez effectuer l' fstat()
appel système sur celui-ci. Il n'y a pas de commande standard pour le faire, mais certains systèmes ou shells en ont.
Avec GNU stat
:
grep() {
if { [ "$(LC_ALL=C stat -c %F - <&3)" = fifo ]; } 3>&1 ||
[ "$(LC_ALL=C stat -c %F -)" = fifo ]; then
command grep "$@"
else
command grep -n "$@"
fi
}
Ou avec zsh
et son propre stat
intégré (qui est antérieur à celui de GNU de quelques années), ici chargé zstat
uniquement:
grep() {
zmodload -F zsh/stat b:zstat
local stdin_type stdout_type
if zstat -A stdin_type -s -f 0 +mode &&
zstat -A stdout_type -s -f 1 +mode &&
[[ $stdin_type = p* || $stdout_type = p* ]]
then
command grep "$@"
else
command grep -n "$@"
fi
}
Maintenant quelques notes:
Ce ne sont pas seulement les pipelines shell qui utilisent des tuyaux.
var=$(grep foo bar)
ou:
cmd <(grep foo bar)
ou:
coproc grep foo bar
aussi courir grep
avec sa sortie standard vers un tuyau.
Si votre shell l'est ksh93
, notez que sur certains systèmes, il utilise des paires de sockets au lieu de tuyaux dans ses pipelines.
[[ -t 0 && -t 1 ]]
si vous ne voulez des numéros de ligne que si l'entrée standard et la sortie standard sont connectées à un terminal.