Linux / Debian - O que faz 'xixi' no moreutils?

Respostas:

29

Aqui está o que você pode fazer com o xixi:

seq 5 -1 1 > file
cat file |pee 'sort -u > sorted' 'sort -R > unsorted'

Então, o xixi trabalha com tubos de casca em vez de arquivos.

O bash não precisa de xixi, pode abrir comandos do shell como arquivos:

cat file |tee >(sort -u > sorted) >(sort -R > unsorted)
Tobu
fonte
11
Isso funcionaria com jockers de nome de arquivo? Veja zgp.org/~dmarti/tips/git-multiple-post-receive-hooks - o xixi é usado para multiplicar stdine fornecer clones para todos os scripts que definem o padrão do nome do arquivo, o bash puro pode fazer isso? AFAIU seria expandir o asterisco dentro dos colchetes causando algo como o tee >(app1 app2 app3 app4)que não é o >(app1) >(app2) >(app3) >(app4)que a sua resposta mostra
Arioch 'The
@Arioch, a sintaxe do bash não funciona com a técnica hooks-joker. Basta instalar o moreutils.
Tobu
11
Use tee >/dev/nullpara evitar replicar stdin para stdout
jfs 06/01
11
a vantagem real de fazer xixi por cima do tee é que ele envia o stdout de cada subprocesso para o stdout do próprio xixi. com tee você precisa redirecionar cada stdout de processos para um arquivo se quiser salvá-lo, mas com xixi você só precisa salvar o stdout. é claro que isso só faz sentido se cada subcomando estiver produzindo algo com formato semelhante. como se você não conseguisse descobrir como ou expressões regulares no grep você poderia fazer cat file | pee 'grep this' 'grep that' > lines.with.this.or.that.txt... usando tee você obteria uma cópia do filestdout.
underrun
O >(command)recurso é chamado de substituição de processo .
Vlastimil Ovčáčík
16

Provavelmente é mais fácil entender se você usou teeprimeiro. Essa ferramenta antiga e útil leva a entrada padrão e grava em vários arquivos, além da saída padrão. Os seguintes:

echo "Hello world" | tee one two

Criará dois arquivos, nomeados onee two, ambos contendo a sequência Hello world. Também será impresso no seu terminal.


Agora peeexecuta uma função semelhante, mas em vez de redirecionar a saída para vários arquivos, ela redireciona para vários comandos secundários, ala pipes. Difere um pouco do teefato de não enviar o stdin original para o stdout porque não faria sentido combiná-lo com a saída dos comandos secundários. O seguinte exemplo muito simples:

echo "Hello world" | pee cat cat

Irá gerar a string Hello worldpara o seu terminal duas vezes. Isso ocorre porque cada uma das duas instâncias de catrecebe a saída padrão e faz o que catfaz, que é impresso.

Dan Carley
fonte