Como a maioria de vocês já fez muitas vezes, é conveniente visualizar o texto longo usando less
:
some_command | less
Agora seu stdin está conectado a um pipe (FIFO). Como ele ainda pode ler comandos como up/down/quit?
Como a maioria de vocês já fez muitas vezes, é conveniente visualizar o texto longo usando less
:
some_command | less
Agora seu stdin está conectado a um pipe (FIFO). Como ele ainda pode ler comandos como up/down/quit?
Conforme mencionado por William Pursell ,
less
lê as teclas digitadas pelo usuário no terminal. Ele abre explicitamente/dev/tty
, o terminal de controle; que fornece um descritor de arquivo, separado da entrada padrão, a partir do qual pode ler a entrada interativa do usuário. Ele pode ler simultaneamente os dados para exibição de sua entrada padrão, se necessário. (Ele também pode gravar diretamente no terminal, se necessário.)Você pode ver isso acontecer executando
Mova-se pela entrada, saia
less
e observe o conteúdo deless.trace
: você o verá aberto/dev/tty
e lerá tanto o descritor de arquivo 0 quanto o que foi retornado quando foi aberto/dev/tty
(provavelmente 3).Essa é uma prática comum para programas que desejam garantir que estejam lendo e gravando no terminal. Um exemplo é o SSH, por exemplo , quando ele pede uma senha ou frase secreta.
Conforme explicado por schily , se
/dev/tty
não puder ser aberto,less
será lido a partir de seu erro padrão (descritor de arquivo 2).less
O uso de/dev/tty
foi introduzido na versão 177, lançada em 2 de abril de 1991.Se você tentar executar
cat /dev/tty | less
, como sugerido por Hagen von Eitzen ,less
terá sucesso na abertura/dev/tty
, mas não receberá nenhuma entrada atécat
fechá-lo. Então você verá a tela em branco, e nada mais até você pressionar CtrlCpara matarcat
(ou matá-lo de alguma outra forma); entãoless
mostrará o que você digitou durantecat
a execução e permitirá que você o controle.O UNIX oferece dois métodos para ler a entrada dos usuários enquanto o stdin foi redirecionado:
O método original é ler de stderr . Stderr está aberto para escrita e leitura e isso ainda é mencionado no POSIX.
Versões posteriores do UNIX adicionaram (por volta de 1979) uma
/dev/tty
interface de driver que permite abrir o tty de controle de um processo. Como existem processos sem um tty de controle, é possível que uma tentativa de abertura/dev/tty
falhe. O software escrito amigável, portanto, tem um fallback para o método original e, em seguida, tenta ler do stderr.