(por completude)
Embora a resposta da enzotib seja provavelmente o que você quer, não é o que você pediu. [ -t 1 ]
verifica se o descritor de arquivo é um dispositivo de terminal, não que seja algo diferente de um canal (como um arquivo normal, um soquete, outro tipo de dispositivo como /dev/null
...)
O comando [
não tem equivalente de -t
, mas para pipes. Para obter o tipo de arquivo associado a um descritor de arquivo, você precisa executar a chamada do sistema fstat()
. Não existe um comando padrão para fazer isso, mas alguns sistemas ou shells têm alguns.
Com o 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 com zsh
e seu próprio stat
builtin (que é anterior a um do GNU em alguns anos), aqui carregado como zstat
apenas:
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
}
Agora, algumas notas:
Não são apenas pipelines shell que usam pipes.
var=$(grep foo bar)
ou:
cmd <(grep foo bar)
ou:
coproc grep foo bar
também executa grep
com seu stdout indo para um pipe.
Se o seu shell for ksh93
, observe que em alguns sistemas, ele usa pares de soquetes em vez de tubos em seus pipelines.