(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 -tmais 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 zshet son propre statintégré (qui est antérieur à celui de GNU de quelques années), ici chargé zstatuniquement:
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 grepavec 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.