Comportamento de Entrada Stdin Entre “gato” e “menos”

1

Quando eu emito cat , o terminal trava esperando pela entrada stdin. No entanto, quando less é emitido, recebo Missing filename ("less --help" for help) . Sabe-se que less e cat aceitam entrada de stdin. Qual é a diferença? Como isso é refletido nas man pages?

    
por boxofchalk1 07.01.2015 / 23:00

2 respostas

6

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 pipe comum, tudo bem com isso.

Ele presumivelmente faz isso porque precisa ler as respostas do terminal no final de cada página, e não há como distinguir os dados que estão sendo paginados e as respostas.

Isso não é mencionado na página man. Talvez devesse ser.

cat não exibe sua saída e não lê as respostas do terminal. Não tem nenhuma restrição quanto ao stdin ser um terminal.

    
por 07.01.2015 / 23:37
4

Meu palpite é que less chama isatty(3) no descritor de arquivo 0. Outra alternativa seria chamar fstat(2) no descritor de arquivo 0 e interpretar os valores dos campos st_ino e st_rdev . De qualquer forma, o ponto é um programa pode dizer algo sobre um descritor de arquivo, e stdin é apenas descritor de arquivo 0.

Quanto ao motivo pelo qual less exits e cat não, você precisa observar a finalidade dos dois programas diferentes. less é o pager GNU, uma reação ao pager BSD more (note o nome do punny). Não faz exatamente o sentido de paginar a entrada de um terminal, mas pode fazer sentido paginar a entrada de um cano. Qualquer um poderia ser stdin. Codificar um caso especial em less faz sentido. Codificar um caso especial em cat não faz sentido e reduz sua utilidade. Mesmo no final dos anos 80, as pessoas tinham sistemas de janelas e digitavam cat > somefile e depois colavam um grande pedaço de texto em "algum arquivo".

    
por 07.01.2015 / 23:37

Tags