Muitas pessoas usam oneliners e scripts que contêm código ao longo das linhas
cat "$MYFILE" | command1 | command2 > "$OUTPUT"
O primeiro cat
é freqüentemente chamado de "uso inútil de gato", porque tecnicamente requer o início de um novo processo (geralmente /usr/bin/cat
) onde isso poderia ser evitado se o comando tivesse sido executado.
< "$MYFILE" command1 | command2 > "$OUTPUT"
porque o shell só precisa iniciar command1
e simplesmente apontar stdin
para o arquivo fornecido.
Por que o shell não faz essa conversão automaticamente? Eu sinto que a sintaxe "uso inútil de gato" é mais fácil de ler e o shell deve ter informações suficientes para se livrar automaticamente do gato inútil. Como cat
é definido no padrão POSIX, o shell deve implementá-lo internamente, em vez de usar um caminho binário. O shell pode até conter implementação apenas para exatamente uma versão de argumento e fallback para binário no caminho.
lseek
ainda é um comportamento definido e pode causar um resultado diferente, o comportamento de bloqueio diferente pode ser semanticamente significativo etc. Seria permitido fazer a alteração se você soubesse quais eram os outros comandos e sabia que eles não se importavam, ou se você simplesmente não se importava com a compatibilidade nesse nível, mas o benefício é bem pequeno. Imagino que a falta de benefício conduz a situação mais do que o custo de conformidade.
cat
, ou qualquer outro utilitário. Também é permitido saber como os outros utilitários que pertencem ao sistema funcionam (por exemplo, ele pode saber como se comporta a grep
implementação externa que acompanha o sistema ). Isso é completamente viável, por isso é perfeitamente justo imaginar por que eles não o fazem.
grep
. E sed
. E awk
. E du
. E quantas centenas, senão milhares de outros utilitários?