Marque o descritor como terminal para o teste -t

3

Pode-se testar se um descritor está conectado ao terminal com o teste -t.

if [ ! -t 0 ]; then
    echo "Stdin is not from terminal"
fi

Tendo um descritor X, apontando para um arquivo ou para um processo (com redirecionamento > (cmd)), é possível fazer com que pareça terminal? Para o teste -t passar?

    
por One Other 11.05.2016 / 16:53

2 respostas

4

Em vez de >(cmd) , assumindo que é stdin de cmd você deseja ser um tty em vez de um pipe, você pode tentar usar:

>(socat -u - exec:'cmd',pty)

socat usaria um par pseudo-tty e teria o stdin de cmd conectado à parte escrava ( [ -t 0 ] retornaria true).

O pseudo-terminal será colocado em modo raw, então a disciplina de linha não deve interferir com os dados, então, a esse respeito, é mais ou menos equivalente a um pipe.

No entanto, pseudo-terminais não podem ser fechados em uma extremidade apenas como os pipes. Então, socat não pode dizer a cmd que não há mais entrada. Em vez disso, depois que o stdin de socat atingir o final do arquivo, socat esperará um pouco e destruirá a pseudo-tty que geralmente significa cmd obtendo um SIGHUP.

Se o seu comando demorar mais para processar os dados, ou esperar pelo fim do arquivo no stdin antes de começar a fazer qualquer coisa, isso não funcionará corretamente.

    
por 11.05.2016 / 17:48
1

O comando test executa isatty(fd) para verificar se um descritor está relacionado a um TTY.

isatty(3) é uma função da biblioteca C que verifica se um descritor de arquivo permite enviar terminal ioctl(2) chamadas para o descritor.

Portanto, você não pode falsificar o resultado, a menos que você use LD_PRELOAD= para sobrescrever a função isatty() no shell.

    
por 11.05.2016 / 17:01