Tanto quanto sei, posso usar o comando tee para dividir a saída padrão na tela e em outros arquivos:
command -option1 -option2 argument | tee file1 file2 file3
É possível redirecionar a saída para comandos em vez de arquivos usando tee, para que eu pudesse, teoricamente, criar uma cadeia de comandos?
command-line
pipe
tee
Abdul Al Hazred
fonte
fonte
Respostas:
Você pode usar pipes nomeados ( http://linux.die.net/man/1/mkfifo ) na linha de comando
tee
e ter os comandos lendo nos pipes nomeados.Quando
command
terminar,tee
fechará os pipes nomeados, que sinalizarão um EOF (leitura de 0 bytes) em cada um dos/tmp/dataN
quais normalmente encerraria oscmdN
processos. Exemplo real:Por causa dos processos em segundo plano, o shell retornou um prompt antes da saída do programa. Todas as três instâncias
wc
terminaram normalmente.fonte
/tmp/data/{0,1,2}
. Então, novamente, em bash, você poderia usar a substituição de processo e ignorarmkfifo
inteiramenteSe bem entendi, você está procurando o equivalente a
tee file1 file2 file3
, mas ao invés de escrever os mesmos dados para três arquivosfile1
,file2
efile3
, que pretende canalizar os mesmos dados em três comandoscmd1
,cmd2
ecmd3
, isto é,deve ser equivalente a
exceto que isso
…
seria executado apenas uma vez.Existem duas maneiras de fazer isso.
Ksh93, bash e zsh suportam a substituição do processo . Essa é uma generalização de pipes que permite que o argumento de um comando seja um arquivo que, quando gravado, transmite dados como entrada para um comando (também existe a variante de entrada que, quando lida, obtém dados de saída por um comando) . Isso é,
gravuras
hello
para a saída padrão e em adição é executadacmd1
comhello
como entrada.Por exemplo, se você deseja duplicar a entrada
somecommand
e passá-la para amboscmd1
ecmd2
, pode usarSe o seu shell não suportar a substituição do processo, você poderá usar pipes nomeados. Veja a resposta da Arcege para saber como isso funciona. Os pipes nomeados são menos convenientes do que a substituição do processo, porque você deve criá-los e excluí-los, além de iniciar e sincronizar processos manualmente. Eles têm a vantagem de serem totalmente portáteis, enquanto nem todos os shells suportam substituições de processos. Eles também podem ser usados em cenários diferentes daqueles para os quais a substituição de processo é.
Sob o capô, em alguns sistemas, a substituição de processos usa pipes nomeados internamente. Na maioria dos sistemas, no entanto, ele se baseia em arquivos nomeados que representam descritores de arquivos .
fonte
pee
demoreutils
.Pelo menos no bash, você pode pular
mkfifo
usando a substituição de processo:ou adotar o exemplo de Arcege
fonte
Estou surpreso que ninguém tenha mencionado o
pee
comando do moreutils ( https://joeyh.name/code/moreutils ).fonte