usando tee para gerar resultados intermediários para stdout em vez de arquivos

4

Eu sei que para capturar o conteúdo de um pipeline em um estágio intermediário de processamento, usamos tee como ls /bin /usr/bin | sort | uniq | tee abc.txt | grep out , mas e se eu não quiser redirecionar o conteúdo de após uniq para abc.txt mas para a tela (através do stdout, é claro) para que, como resultado final, eu terei na tela, o conteúdo intermediário após uniq, bem como o conteúdo após grep.

    
por Aman 12.01.2015 / 18:41

6 respostas

6

às vezes / dev / tty pode ser usado para isso ...

ls /bin /usr/bin | sort | uniq | tee /dev/tty | grep out | wc
    
por 12.01.2015 / 18:46
1

Este comando funcionou para mim.

ls /bin /usr/bin | sort | uniq | tee /dev/pts/0 | grep out

Você pode verificar qual é o seu terminal usando o comando tty e substituir o tee para redirecionar a saída para esse terminal.

Referências

link

    
por 12.01.2015 / 18:46
1

Mais uma opção: usar a substituição de processos:

ls /bin /usr/bin | sort | uniq | tee abc.txt >(grep out)

Ou, de outra forma:

ls /bin /usr/bin | sort | uniq | tee abc.txt >(cat) | grep out
    
por 13.01.2015 / 01:11
0
mkfifo myfifo
cat myfifo& ls /bin /usr/bin | sort | uniq | tee myfifo | grep out

mkfifo cria um arquivo especial FIFO (first in, first out), a.k.a., um pipe nomeado. Inicie um cat assíncrono para ler o fifo e, em seguida, execute o pipeline, tee do resultado intermediário para o fifo.

Isso produzirá uma mensagem [1]+ Done cat myfifo no final. Você pode suprimir isso com esse truque de mágica:

(cat myfifo&); ls /bin /usr/bin | sort | uniq | tee myfifo | grep out

Por um longo prazo, solução robusta, você pode querer criar um fifo permanente (por exemplo, $HOME/myfifo ) em vez de criar um novo a cada vez. Mas isso falhará se você estiver executando várias instâncias disso simultaneamente. Alternativamente,

  • Gere um nome exclusivo (por exemplo, com mktemp ).
  • Crie o fifo em um diretório com garantia de gravação (por exemplo, /tmp ).
  • Remove o fifo no final do comando.
por 13.01.2015 / 00:54
0

No caso em que isso está sendo executado a partir de um terminal, você pode

  • inicie um multiplexador de terminal como tmux ou screen
  • dividir seu terminal - no tmux Ctrl B "
  • na primeira janela touch abc.txt then tail -f abc.txt
  • mude para a segunda janela e execute seu comando. Você verá o arquivo criado pela atualização do tee.
por 13.01.2015 / 02:08
0
ls /bin /usr/bin | sort | uniq | tee /dev/fd/2 | grep out | wc

Em um sistema Linux, você pode usar os links /dev/fd/[num] como pipes nomeados em muitos casos. Isso irá duplicar o stdout para o stderr, que, tipicamente, é o seu terminal screen , mas não precisa ser.

    
por 13.01.2015 / 05:00