Para alguns comandos, é possível especificar determinadas entradas como stdin ou como argumento da linha de comandos.
Especificamente, suponha que command
pode levar a entrada stdin e um nome de arquivo como argumento de linha de comando e command < myfile
, cat myfile | command
e command myfile
pode produzir o mesmo resultado.
Por exemplo,
Quando o comando é sed
:
sed s/day/night/ <myfile >new
sed s/day/night/ myfile >new
cat myfile | sed s/day/night/ >new
Quando o comando é cat
:
cat < myfile
cat myfile
- Fiquei me perguntando se existem algumas regras gerais sobre suas performances, ou seja, qual delas é geralmente a mais eficiente e qual a menos?
- O redirecionamento é sempre melhor que o pipe?
Respostas:
A
cat file | command
sintaxe é considerada um uso inútil deCat
. De todas as suas opções, é preciso um impacto no desempenho porque ele precisa gerar outro processo no kernel. Por mais insignificante que isso possa parecer, é uma sobrecarga que as outras formas não têm. Isso foi abordado em questões como: Devo me preocupar com gatos desnecessários?Entre as outras duas formas, praticamente não há diferenças de desempenho. STDIN é um nó de arquivo especial que o processo precisa abrir e ler como qualquer outro. Passar um nome de arquivo em vez de STDIN apenas abre um arquivo diferente.
A diferença estaria em quais recursos / flexibilidade você está procurando.
sed -i
para edição no local. (Observação: como é necessário criar um novo arquivo nos bastidores, não é um ganho de desempenho em relação a outros redirecionamentos, mas é uma etapa de conveniência.)sed [exp] < file1 file2
ou mesmosed [exp] < <(grep command)
. Detalhes deste caso de uso podem ser encontrados nesta pergunta: Substituição de processo e canalizaçãofonte
sed [exp] < <(grep command)
funcionará bem comosed [exp] <(grep command)
(desde que<(grep command)
cria um arquivo temporário nomeado para o tamanho do comando, quesed
é perfeitamente capaz de abrir por si mesmo sem a ajuda do shell).Dado que
command file
apenas abre o arquivo e, a partir de então, funciona como se fossestdin
, há pouca diferença. Com o redirecionamento do shell, basta abrir o arquivo com antecedência (o shell faz), em vez de comandar o próprio binário.Se estamos falando de
cat file | command
vs.command <file
, o último é o preferido. Você não notará diferença significativa de desempenho entre os dois, mas o primeiro é desnecessariamente complicado (processo extra e buffer de memória compartilhada para o pipe, com taxa de transferência limitada.) Além disso, você não podeseek
(alterar a posição do ponteiro do arquivo arbitrariamente) em um pipe, enquanto você pode em um arquivo comum. Alguns comandos podem usar um algoritmo mais eficiente quandoseek
-ing no arquivo de entrada é possível.fonte
<file
? Seu ponto é válido para o uso do nome do arquivo de entrada para derivar o nome do arquivo de saída resistente, por exemplo:gzip file
produzfile.gz
.close
sstdin
e chamadasdup
sobre o descritor de arquivo aberto, por isso substituir o antigostdin
(que era algum tipo de tty na maioria dos casos.) Do ponto jogador de filme de vista não há nenhuma diferença entre isso e abrir o arquivo por ele é nome no próprio jogador. O descritor de arquivo pode ser procurado nos dois cenários; portanto, quando pulamos para o final, não há diferença detectável pelo usuário.