Eu quero executar alguma ação apenas se meu shell estiver "conectado" a um terminal, ou seja, apenas se minha entrada padrão vier da entrada de um terminal e minha saída padrão (e erro padrão? Talvez isso não importe) for impressa / ecoada para um terminal.
Como posso fazer isso, sem depender /proc/self
diretamente das especificidades do GNU / Linux (como )?
command-line
terminal
einpoklum - restabelece Monica
fonte
fonte
Respostas:
isatty
é uma função para verificar isso , e a-t
bandeira dotest
comando torna isso acessível a partir de um script de shell:Você pode verificar se FD 0 (entrada padrão) é um TTY com:
Você pode fazer o mesmo nos FDs 1 e 2 para verificar os fluxos de saída e erro, ou todos eles:
O comando retornará 0 (êxito) se os descritores estiverem conectados a um terminal e, caso contrário, será falso.
test
também está disponível como o[
comando para um "teste de suporte":é uma maneira idiomática de escrever isso condicional.
fonte
Imagino que seja uma duplicata, mas não consigo encontrá-la. Usar
e
para testar respectivamente se a entrada e a saída padrão estão conectadas a um terminal.
man test
tem os detalhes.fonte
Apenas uma nota extra sobre as respostas finas que já foram dadas. Observe que
[ -t 0 ]
testa se o descritor de arquivo 0 está aberto, um arquivo que é um arquivo de dispositivo com uma disciplina de linha tty (normalmente, isso é feito verificando se um termo inofensivo ioctl () é bem-sucedido).Além disso, isso não significa necessariamente que exista um terminal ou emulador de terminal (com um usuário real digitando em um teclado) do outro lado (embora na imensa maioria dos casos e provavelmente na maioria dos que você se importa, isso é bom o suficiente). aproximação).
Os dispositivos tty e pty também podem ser usados para transferência de dados ou como um mecanismo de comunicação entre processos.
Por exemplo, alguém poderia fazer:
Para alimentar o que é recebido pelo RS232 para
myscript
.teria
myscript
de ser um dispositivo de entrada padrão Pty (comsshd
, na outra extremidade, e, eventualmente, (através da ligação ssh) não um terminal, mas um tubo alimentado porecho
)Para verificar ainda mais se existe um terminal na outra extremidade da linha ou pty RS232, você também pode verificar se uma
$TERM
variável está definida e não-vazia ([ -n "$TERM" ]
) e enviar uma sequência de escape do Relatório de status do dispositivo sobre esse fd e verificar se você recebe uma resposta (além de[ -t 0 ]
e[ -n "$TERM" ]
).É respondido com um
\e[0n
pela maioria dos terminais.Agora, existem vários problemas com isso, então eu não recomendaria fazer isso, exceto no caso em que você deseja verificar porque deseja executar um aplicativo TUI visual (nesse caso, seria melhor usar bibliotecas como
ncurses
, e, em vez do DSR, você deseja enviar uma sequência de escape de identificação do dispositivo para consultar o tipo de terminal com mais precisão do que via$TERM
):printf
falha, mas no caso de o stdin ser um dispositivo tty aberto no modo leitura + gravação, isso terá o efeito colateral de enviar essa sequência para o outro lado. Por exemplo, em nosso exemplo ssh acima, isso realmente enviará a sequência para um terminal (mas a resposta não será apresentada no stdin)fonte