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)

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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.