Você normalmente deseja o redirecionamento de stdin para enviar algum arquivo como uma entrada para algum comando. Isso acontece principalmente em scripts, onde você pode ter resultados temporários armazenados em um arquivo. Dependendo do contexto, pode-se usar um pipe (para que um arquivo temporário não seja necessário) ou um arquivo temporário com redirecionamento de stdin (uma vantagem é que controlar erros de maneira portátil através do status de saída é mais fácil).
Agora, alguns comandos podem aceitar a entrada como um argumento e, nesse caso, o redirecionamento de stdin não é necessário ... em geral. Mas o interessante é que pode haver diferenças dependendo de como a entrada é fornecida, de modo que um uso inútil de cat
possa realmente ser útil. Vamos dar um exemplo: gzip
.
$ echo foo > text
$ gzip -k text
$ file text.gz
text.gz: gzip compressed data, was "text", last modified: Thu Sep 18 00:38:18 2014, from Unix
Aqui, um recebe o registro de data e hora do arquivo text
. Então, em vez de fornecer o text
filename como argumento, vamos usar um redirecionamento:
$ gzip < text > text.gz
$ file text.gz
text.gz: gzip compressed data, last modified: Thu Sep 18 00:38:18 2014, from Unix
Um ainda recebe o mesmo timestamp, mas o nome do arquivo original não é mais armazenado no arquivo compactado (o was "text"
desapareceu). Agora, vamos usar um pipe, com o que parece ser um uso inútil de cat
:
$ cat text | gzip > text.gz
$ file text.gz
text.gz: gzip compressed data, last modified: Thu Sep 18 00:43:46 2014, from Unix
Desta vez, o timestamp foi alterado: é a data / hora em que o gzip foi executado, não o timestamp do arquivo text
.
Então, dependendo do que você quer e do tipo de comando, você tem 3 soluções diferentes que parecem equivalentes, mas na verdade dão resultados ligeiramente diferentes.
Observação: outro exemplo é o comando lpr
printing, para o qual você pode usar um redirecionamento em vez de um nome de arquivo como argumento, se não quiser que o nome do arquivo vaze na fila da impressora.