Um comando em um pipeline de shell pode determinar as características tty de seu contexto?

1

Eu tenho um script bash que colunde uma lista de itens. Por padrão, ele irá adivinhar o número de colunas a serem produzidas, com base na largura do terminal, conforme relatado por stty size . Mas quando o script está em um pipeline, stty informa "ioctl inadequado para o dispositivo".

O que eu quero é permitir que meu script, ao ser executado como um comando no meio de um pipeline, descubra se o pipeline do qual ele faz parte está, em última instância, saindo para um tty - e, se assim for, ser capaz de diminuir suas características .

SOLUÇÃO: Como apontado abaixo, stty -F /dev/tty parece funcionar em qualquer lugar em um pipeline.

    
por RashaMatt 23.03.2015 / 11:03

1 resposta

6

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 e stderr 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 e stderr 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 .

    
por 23.03.2015 / 11:25