A resposta "definitiva" é, obviamente, levada até você pelo Uso inútil do cat
Award .
The purpose of cat is to concatenate (or "catenate") files. If it's only one file, concatenating it with nothing at all is a waste of time, and costs you a process.
O Instantiating cat apenas para que seu código seja lido de maneira diferente, faz apenas mais um processo e mais um conjunto de fluxos de entrada / saída que não são necessários. Normalmente, a real retenção de seus scripts será um loop ineficiente e um processamento real. Na maioria dos sistemas modernos, um cat
extra não vai matar seu desempenho, mas existe quase sempre outra forma de escrever seu código.
A maioria dos programas, como você nota, é capaz de aceitar um argumento para o arquivo de entrada. No entanto, há sempre o shell embutido <
que pode ser usado sempre que um fluxo STDIN for esperado, o que economizará um processo, fazendo o trabalho no processo de shell que já está em execução.
Você pode até ser criativo com ONDE o escreve. Normalmente, ele seria colocado no final de um comando antes de você especificar quaisquer redirecionamentos de saída ou canais como este:
sed s/blah/blaha/ < data | pipe
Mas não tem que ser assim. Pode até vir em primeiro lugar. Por exemplo, seu código de exemplo poderia ser escrito assim:
< data \
sed s/bla/blaha/ |
grep blah |
grep -n babla
Se a legibilidade do script for sua preocupação e seu código estiver confuso o suficiente para permitir que seja mais fácil seguir a adição de uma linha para cat
, existem outras maneiras de limpar seu código. Um que eu uso muito que ajuda a tornar os scripts mais fáceis de descobrir é dividir os pipes em conjuntos lógicos e salvá-los em funções. O código de script então se torna muito natural, e qualquer parte da piplina é mais fácil de depurar.
function fix_blahs () {
sed s/bla/blaha/ |
grep blah |
grep -n babla
}
fix_blahs < data
Você pode continuar com fix_blahs < data | fix_frogs | reorder | format_for_sql
. Uma linha de dados que pareça assim é realmente fácil de seguir, e os componentes individuais podem ser depurados facilmente em suas respectivas funções.