less
verifica se stdout
é um terminal e se comporta como cat
quando não é (copia stdin para stdout até EOF).
Esse recurso permite que você escreva scripts ou programas que sempre enviam sua saída (por exemplo, --help
saída) less
enquanto permitem um redirecionamento fácil para um arquivo. Seria péssimo se some_command --fullhelp > help.txt
ainda esperasse pela barra de espaço no stdin para folhear o texto, ou algo assim. Alguns comandos (por exemplo man
) verificam sua própria saída para decidir se devem enviar sua saída através de um pager ou não. Se você executar man ls > ls.txt
, ele nunca chamará o seu $PAGER
.
less
O comportamento semelhante a um gato é útil se você esquecer de editá-lo em uma única linha ao adicionar mais estágios a um pipeline também.
less
precisa descobrir as dimensões do terminal (tamanho da tela, para saber quantas linhas mostrar ao mesmo tempo). O que ioctl(2)
ele usa stdout
retornaria ENOTTY em um não terminal, portanto não pode evitar o manuseio do caso não terminal. less
realmente usa isatty(3)
antes de verificar as dimensões do terminal, mas isatty
funciona tentando um ioctl somente de tty e verificando a falta de erro.
Até um paginador simples como more(1)
(pelo menos a versão util-linux) possui esse recurso, porque é provavelmente o comportamento mais simples possível de implementar nesse caso.
Observe que quando você tubo algo em less
(por exemplo grep foo bar.txt | less
), ele não tem que abrir /dev/tty
para a entrada do teclado. (Você pode vê-lo fazer isso com echo foo | strace less
).
bash script.sh
,bash script.sh | cat
,bash script.sh > file
, e ver o que saída que você tem.