(para completar)
Embora a resposta do @ enzotib seja provavelmente o que você deseja, não é o que você pediu. [ -t 1 ]
verifica se o descritor de arquivo é um dispositivo terminal, não se trata de algo que não seja um pipe (como um arquivo comum, um soquete, outro tipo de dispositivo como /dev/null
...)
O [
comando não tem equivalente a não -t
ser para pipes. Para obter o tipo de arquivo associado a um descritor de arquivo, você precisa executar a fstat()
chamada do sistema. Não existe um comando padrão para fazer isso, mas alguns sistemas ou shells possuem.
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 antecede o GNU um por 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 os oleodutos que usam tubos.
var=$(grep foo bar)
ou:
cmd <(grep foo bar)
ou:
coproc grep foo bar
também corra grep
com seu stdout indo para um cano.
Se o seu shell for ksh93
, observe que em alguns sistemas, ele usa pares de soquetes em vez de tubos em seus pipelines.
[[ -t 0 && -t 1 ]]
se você quiser apenas números de linha se a entrada e a saída padrão estiverem conectadas a um terminal.