Comportamento de entrada Stdin entre “cat” e “less”

Comportamento de entrada Stdin entre “cat” e “less”

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 lessaceitam catentrada stdin. Qual é a diferença? Como isso se reflete nas páginas de manual?

Responder1

lessexecuta 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.

catnã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 lesschama 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_inoe 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ê lessde sair e catnã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 lessfaz sentido. Codificar um caso especial catnão faz sentido e reduz sua utilidade. Mesmo no final da década de 1980, as pessoas tinham sistemas de janelas e digitavam cat > somefilee colavam um grande pedaço de texto em "algum arquivo".

informação relacionada