teste de bash para "terminal aberto"

1

Notei na lista de EXPRESSÕES CONDICIONAIS do BASH uma -texpressão que testa se um descritor de arquivo é um terminal aberto. Eu tentei o seguinte:

if [[ -t $(tty) ]]; then
  echo open terminal $(tty)
else
  echo not open terminal $(tty)
fi;

e receba minha resposta

not open terminal /dev/pts/35

Eu tentei o mesmo de um console e obter

not open terminal /dev/tty1

na página de manual -t descreve seu argumento como FDum "descritor de arquivo" em vez de outras expressões condicionais que descrevem o argumento comoFILE

alguém pode fornecer um teste BASH bem-sucedido para um 'descritor de arquivo' que é "aberto" e "refere-se ao terminal"?

ben_wing
fonte

Respostas:

1

Os descritores de arquivo são pequenos números inteiros.

Em particular, stdiné fd 0; stdouté fd 1; e stderré fd 2.

Você verá o mesmo uso do "descritor de arquivo" em linhas como:

./cmd 2>&1

O que significa "executar ./cmd, redirecionando o fd 2 (stderr) para o fd 1 (stdout).

O uso normal de -té dizer se a entrada é proveniente de um terminal:

[[ -t 0 ]] && echo "Input is coming from a terminal"
rici
fonte
Obrigado por me apontar na direção certa. com a sua dica, comecei a explorar / dev / fd (que é um link simbólico para / proc / self / fd). E então, com catonmat.net/blog/bash-one-liners-explained-part-three, eu fui capaz de criar descritores de arquivos arbitrários e torná-los persistentes nos comandos (usando 'exec 6> ~ / filename' ou 'exec 7> / dev / pts / 1 '). Utilizando estes, pude determinar que '-t' testa positivamente qualquer fd arbitrário apontado para qualquer terminal arbitrário. então 'exec 13> / dev / tty3; [[-T 13]] && echo "aberta termo"' me deu a saída do "termo aberto" :)
ben_wing