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,
stdinestderrsã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,
stdoutestderrsã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 .