Meu ambiente: zsh, macOS
Comando em causa:
echo 'hi' | tee > a b c
echo 'hi' > a b c
- O comando 1 cria arquivos nomeados
a
eb
comc
conteúdohi
. - O comando 2 cria um arquivo chamado
a
com conteúdohi b c
.
AFAIK, apenas o uso do Comando 1 sem >
está documentado na página de manual de tee
:
echo 'hi' | tee a b c
Eu quero alguma ajuda para entender por que adicionar >
o código acima (ou seja, Comando 1) ainda cria vários arquivos, enquanto o Comando 2 cria apenas um arquivo.
O redirecionamento (
>
neste caso) “consome” o seguinte argumento como alvo do redirecionamento; todo o resto é deixado sozinho. Entãoé equivalente a
tee
duplica sua entrada parab
,c
e a saída padrão que vai paraa
.é equivalente a
e saídas
hi b c
para a saída padrão, que vai paraa
.Esta é a sintaxe básica do shell. O operador de redirecionamento
>
recebe exatamente um argumento que usa como nome de arquivo para redirecionar a saída padrão. Os argumentos restantes são passados para o comando.Então seu primeiro comando:
executa o comando
echo 'hi' | tee b c
, redirecionando sua saída padrão para o arquivoa
. Como isso acontece,tee
copia sua entrada padrão para todos os arquivos fornecidos como argumentos, além de sua saída padrão. Assim, os dados emitidos porecho 'hi'
são copiadostee
para arquivosb
ec
, e para sua saída padrão que por redirecionamento é arquivoa
.Seu segundo comando:
executa o comando
echo 'hi' b c
, redirecionando novamente sua saída padrão para o arquivoa
. Se você quiser olhar para o arquivo resultantea
, verá que ele contém o textohi b c
, enquanto no primeiro caso os três arquivos criados contêm apenas o textohi
.tee
pega o fluxo stdin e envia uma cópia para o(s) arquivo(s) indicado(s) e também para stdout. Com o> a
você está capturando o fluxo stdout para o arquivoa
enquantotee
está gravando normalmente em arquivosb
e arquivosc
.> filename
pode aparecer em qualquer ponto do seu lado|
(desde que esteja espaçado adequadamente e não seja escapado).Para ilustrar, todos são sinônimos: