![Comportamento de entrada Stdin entre “cat” e “less”](https://rvso.com/image/36024/Comportamento%20de%20entrada%20Stdin%20entre%20%E2%80%9Ccat%E2%80%9D%20e%20%E2%80%9Cless%E2%80%9D.png)
Quando eu emito cat
, o terminal trava aguardando a entrada stdin. No entanto, quando less
é emitido, recebo Missing filename ("less --help" for help)
. Sabe-se que ambos less
aceitam cat
entrada stdin. Qual é a diferença? Como isso se reflete nas páginas de manual?
Responder1
less
executa o seguinte código quando não recebe nenhum argumento de nome de arquivo:
if (isatty(fd0))
{
error("Missing filename (\"less --help\" for help)", NULL_PARG);
quit(QUIT_OK);
}
return (edit("-"));
Está reclamando quando a entrada padrão é um terminal. Se a entrada padrão for um arquivo ou canal comum, tudo bem.
Presumivelmente, isso acontece porque precisa ler as respostas do terminal no final de cada página e não haveria como distinguir os dados que estão sendo paginados e as respostas.
Isso não é mencionado na página de manual. Talvez devesse ser.
cat
não pagina sua saída e não lê as respostas do terminal. Não tem nenhuma restrição quanto ao stdin ser um terminal.
Responder2
Meu palpite é que less
chama isatty(3)
o descritor de arquivo 0. Outra alternativa seria chamar fstat(2)
o descritor de arquivo 0 e interpretar os valores dos campos st_ino
e st_rdev
. De qualquer forma, a questão é que um programa pode dizer algo sobre um descritor de arquivo, e stdin é apenas o descritor de arquivo 0.
Quanto ao porquê less
de sair e cat
não sair, você precisa observar a finalidade dos dois programas diferentes. less
é o pager GNU, uma reação ao pager BSD more
(observe o nome insignificante). Não faz exatamente sentido paginar a entrada de um terminal, mas pode fazer sentido paginar a entrada de um canal. Qualquer um pode ser stdin. Codificar um caso especial less
faz sentido. Codificar um caso especial cat
não faz sentido e reduz sua utilidade. Mesmo no final da década de 1980, as pessoas tinham sistemas de janelas e digitavam cat > somefile
e colavam um grande pedaço de texto em "algum arquivo".