< from > to
não funciona porque não há comando lá; nenhum processo. O shell abre / cria os arquivos e organiza os redirecionamentos (o que significa que os descritores de arquivos que fazem referência a esses arquivos são plantados como 0 e 1: entrada padrão e saída padrão). Mas não há nada lá para executar um loop para ler a entrada padrão e gravar na saída padrão.
zsh
faz esse trabalho substituindo um comando configurável pelo usuário nesse caso "comando nulo". O comando não está visível na linha de comando, mas ainda está lá. Um processo é criado para isso e funciona da mesma maneira. NULLCMD
é cat
por padrão, então < from > to
na verdade significa cat < from > to
em zsh
, a menos que NULLCMD
esteja definido como algo diferente; é um comando "gato implícito".
Um "uso inútil de gato" ocorre quando cat
é usado como intermediário para ler de um arquivo e alimentar os dados para outro processo, cujo descritor de arquivo pode ser conectado ao arquivo original.
Se cat
for removível da situação, de forma que os comandos restantes ainda possam executar a mesma tarefa, isso é inútil. Se não for removível, então não é inútil.
# useless, removable:
$ cat archive.tar | tar tf - # --> tar tf archive.tar
# not removable (in POSIX shell):
$ cat > file
abc
[Ctrl-D]
# likewise:
STRING=$(cat file)
Um cat
que é substituível não é a mesma coisa. Por exemplo, em vez de cat > file
, podemos usar vi file
para criar o arquivo. Isso não conta como remoção de cat
, enquanto usa o que resta para realizar a mesma tarefa.
Se cat
for o comando somente no pipeline, então é claro que não pode ser removido; nenhum rearranjo do que sobrar fará o trabalho equivalente.
Alguns gerenciadores de scripts de shell usam cat
porque acham que eles podem mover o operando de entrada para mais perto do lado esquerdo da linha de comando. No entanto, os redirecionamentos podem estar em qualquer lugar na linha de comando:
# If you're so inclined:
# move source archive operand to the left without cat:
$ < archive.tar tar xf - > listing