Quando utilizo less file1 file2
, recebo os dois arquivos mostrados no "menos visualizador de buffer", mas less file1 file2 | cat
imprimo o conteúdo de ambos os arquivos anexados ao stdout. Como menos sabe se deve mostrar o "menos visualizador de buffer" ou produzir saída para stdout para um próximo comando? Que mecanismo é usado para fazer isso?
21
bash script.sh
,bash script.sh | cat
,bash script.sh > file
, e ver o que saída que você tem.stdout
não é algo que possa ser "gravado em um arquivo". É algo que vocêwrite()
deve fazer .less
não precisa fazer nada diferente, dependendo de sua saída ser um arquivo, tubo, soquete ou dispositivo de bloco ou qualquer outra coisa. Só importa que não seja um tty, então apenas se comporta comocat
. (Presumo que você soubesse disso e apenas escolhesse as palavras erradas para explicá-lo, mas pensei em apontar isso para outros leitores).less
não "descobri" ocat
próximo. Ele se comporta como,cat
independentemente do que vem a seguir, se o stdout não é um tty.less
iria adiante e usaria um TCGETS para obter as dimensões terminais ou descobrir que não é um tty, mas aparentemente eu imaginei errado.less
verifica sestdout
é um terminal e se comporta comocat
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 sesome_command --fullhelp > help.txt
ainda esperasse pela barra de espaço no stdin para folhear o texto, ou algo assim. Alguns comandos (por exemploman
) verificam sua própria saída para decidir se devem enviar sua saída através de um pager ou não. Se você executarman 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 queioctl(2)
ele usastdout
retornaria ENOTTY em um não terminal, portanto não pode evitar o manuseio do caso não terminal.less
realmente usaisatty(3)
antes de verificar as dimensões do terminal, masisatty
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 exemplogrep foo bar.txt | less
), ele não tem que abrir/dev/tty
para a entrada do teclado. (Você pode vê-lo fazer isso comecho foo | strace less
).fonte