Você pode testar as coisas com um script como
#!/bin/sh
for fd in 0 1 2; do
if [ -t $fd ]; then echo $fd is a TTY; fi
done
Executando isso, vejo que:
- se o script for executado sozinho, todos os três FDs serão TTYs
- se o script for executado no início de um pipeline,
stdin
estderr
são TTYs - se o script for executado no meio de um pipeline,
stderr
é um TTY - se o script for executado no final de um pipeline,
stdout
estderr
são TTYs
Tudo isso parece lógico. Obviamente, se o pipeline redirecionar stderr
, o comportamento será diferente.
Para responder à sua pergunta na íntegra, não acho que seja possível determinar as características do terminal em todos os casos, mas se você puder encontrar um FD (examine todas as entradas em /dev/fd
) que é um TTY, stty
sobre isso ... Mas não é possível a partir do meio de um pipeline determinar onde o final do pipeline está indo.
Como mencionado por Janis , se você quiser obter informações sobre o terminal de controle, independentemente do canal , você pode usar /dev/tty
, por exemplo com stty -F /dev/tty
; mas isso falhará se o script for executado sem um terminal de controle, por exemplo, de um trabalho cron
.