Diferença entre abrir arquivo e abrir STDIN, quando usar cada [duplicata]

0

Em muitas respostas, principalmente sobre os comandos text-processing , vi comandos como sed , awk , grep , entre outros, sendo usado com STDIN e a simples abertura de um arquivo

por exemplo,

$ sed -e 's|foo|bar|g' file # open file
$ sed -e 's|foo|bar|g' <file # open STDIN

ou

$ grep 'PATTERN' file # open file
$ grep 'PATTERN' <file # open STDIN

Em um arquivo pessoal, sempre uso o método de arquivo aberto, mas quero saber quando e quando não usá-los, e também qual é a diferença.

    
por tachomi 03.03.2016 / 23:04

4 respostas

1

Depende da necessidade. Aqui está um caso em que usar nomes de arquivos ou linhas de stdin faz a diferença.

bash-4.1$ cat /etc/passwd /etc/group | wc -l
128
bash-4.1$ wc -l /etc/passwd /etc/group
  49 /etc/passwd
  79 /etc/group
 128 total
bash-4.1$ 

Além disso, a entrada padrão tende a não ser muito lseek(3) , portanto, se um aplicativo precisar de um descritor de arquivo que possa buscar (por exemplo, retroceder até o início), isso provavelmente excluiria a entrada padrão.

    
por 04.03.2016 / 00:43
0

Não há diferença em termos de saída.

$ grep 'PATTERN' file abrirá o arquivo especificado no argumento 2 e procurará o padrão.

$ grep 'PATTERN' <file lerá o conteúdo de file em STDIN (um dos recursos do bash) e canalizará STDIN em grep .

Não tenho certeza se há benefícios exatos de um ou outro, mas continuaria usando o primeiro ao invés do último.

O último é redundante, assim como cat file | grep 'PATTERN' e cat file | sed -e 's|foo|bar|g' são redundantes.

    
por 03.03.2016 / 23:29
0

Existem casos em que os dois não são exatamente equivalentes, como:

$ wc -l ./script.sh
4948 ./script.sh
$ wc -l <./so
4948

Na primeira instância wc sabia qual arquivo estava sendo processado e imprimia o nome do arquivo com a contagem de linhas. No segundo, o comando wc não sabe qual arquivo está processando, é uma entrada anônima.

No comando específico do seu exemplo com o grep:

$ grep 'PATTERN' file
$ grep 'PATTERN' <file

Não há diferença na saída. Mas com isso, existe (se houver um jogo):

$ grep -H 'PATTERN' file
$ grep -H 'PATTERN' <file

Além disso, no caso do redirecionamento <file , é o shell que está fazendo a leitura do arquivo, que também pode ter consequências na velocidade ou no tamanho do buffer (para comandos diferentes).

    
por 04.03.2016 / 00:51
0

A diferença é principalmente em quem abre o arquivo. Isso pode ser importante para motivos de segurança - o shell pode ter privilégios que o programa iniciado não possui.

O uso do método STDIN implica a herança do fluxo para toda a árvore de processos criada pelo programa iniciado. Isso pode ser útil em certos casos.

Com o método arquivo aberto , o programa lançado conhece o nome do arquivo mais prontamente. Os programas que usam a rota de nome de arquivo provavelmente usarão o nome do arquivo em sua saída, e a rota do nome de arquivo pode diferir de outras maneiras, como desempenho: Os programas geralmente assumem apenas o acesso ao fluxo básico para STDIN (sem busca, sem mmapability) e buscabilidade para argumentos de nome de arquivo.

    
por 04.03.2016 / 01:38