Por que a leitura do stdin varia em alguns programas?

0

Estou desenvolvendo um programa em ncurses que irá ler stdin, no entanto, ao verificar como alguns outros programas fazem isso, percebi que não é consistente. Por exemplo, os dois seguintes funcionam bem

tail file.txt | cat
tail file.txt | cat -

Embora estes não funcionem funcionem, a menos que eu use - :

cat file.txt | vim
cat file.txt | file

Existe algum motivo pelo qual alguns programas permitem dados de tubulação sem - e outros não? Eles devem apoiar os dois lados?

    
por Darren 19.02.2017 / 17:23

1 resposta

2

Programas que servem para atuar como filtros de fluxo , pegando dados de alguma fonte de entrada e processando-os progressivamente e produzindo saída, normalmente lidos da entrada padrão quando invocados sem argumentos não-opcionais. Portanto, por exemplo, cat , tail , etc. são lidos a partir da entrada padrão por padrão. Ferramentas como grep , sed , etc. requerem um operando (o regexp para grep, o script para sed) e lidas da entrada padrão se esse for o único operando. Vi (m) não se encaixa neste molde: é um programa interativo, não um filtro de fluxo, então ele inicia no modo interativo quando você não passa nenhum argumento.

file é uma exceção: ele não lê de stdin a menos que stdin seja dado como um argumento (possivelmente através da sintaxe - ). Não sei por que nem o autor original nem o comitê POSIX decidiram que não leria de stdin. Isso pode ocorrer porque file não se importa apenas com o conteúdo do arquivo, mas também com os tipos de arquivo - file foo informa se foo é um diretório, um arquivo regular, um link simbólico etc. filtrar como os outros, embora seja geralmente usado como tal. Está na metade do caminho entre grep (um filtro de fluxo) e ls (que se preocupa apenas com o arquivo como uma entrada de diretório e não com o conteúdo do arquivo).

( grep -r também se importa com os tipos de arquivo, mas essa é uma adição que veio muito depois do comando original).

    
por 19.02.2017 / 23:40

Tags