`tee` para comandos

15

teepode redirecionar a entrada padrão canalizada para a saída e arquivo padrão .

echo Hello, World! | tee greeting.txt

O comando acima mostraria a saudação na tela do terminal e a salvaria no conteúdo do greeting.txtarquivo, criando o arquivo se não houver nenhum com esse nome.

Também há a -aopção de teeanexar ao arquivo existente em vez de substituir.


Existe uma maneira conveniente de redirecionar a entrada canalizada para o comando e a saída padrão em vez do arquivo?

Estou tentando criar um script de invólucro para bukucopiar para seleção primária o URL do marcador especificado por seu número de índice.

# bukuc:
#!/bin/sh
url=$(buku -f 1 -p $1 | cut -f 2) # NUMBER : URL
echo $url # DISPLAY
echo $url | xsel # PRIMARY SELECTION

Aqui eu uso echo duas vezes, primeiro para exibir no terminal e depois salvar na seleção principal (área de transferência).

Eu imagino algo echo $url | teeC xselou um atalho para exibir a saída antes de passar para o próximo comando (comandos de encadeamento), o que me permitiria encadear todo o comando em uma linha sem a necessidade de salvar o resultado em uma variável da seguinte maneira:

buku -f 1 -p $1 | cut -f 2 | teeC xsel    

Também posso usá-lo urlviewpara visualizar, selecionar e abrir com o $BROWSERseguinte:

bukuc 10-20 | urlview

fonte
3
Tente tee /dev/ttyou tty0(não lembro exatamente ... Eu estou na estrada)
George Vasiliou
2
info teemenciona a substituição de processos e saída de tubo de tee para um programa ...
Xen2050

Respostas:

19

É simples em shells que suportam a substituição de processos , por exemplo, bash

$ echo foo | tee >(xsel)
foo
$ xsel -o
foo

Caso contrário, você pode usar um FIFO (embora não seja conveniente)

$ mkfifo _myfifo
$ xsel < _myfifo &
$ echo bar | tee _myfifo
bar
$ xsel -o
bar
[1] + Done                       xsel 0<_myfifo
$ 
chave de aço
fonte
Obrigado! Duas coisas que notei: 1. sh(Bourne shell) não suporta esse recurso; 2. A seta deve ficar como parte do operador único >()para substituição do processo.
11

O análogo direto de "T para comandos" é o peecomando do moreutils ( tee, mas com tubos). Seus argumentos são usados ​​como comandos para executar, não como caminhos, e eles recebem a entrada canalizada para eles em vez de gravados em arquivo. Todos os comandos recebem a entrada padrão para a qual você canalizou pee.

Usando pee, você pode obter o resultado desejado dizendo para executar ambos xsele catcom a entrada.

echo foo | pee xsel cat

Há um catprocesso extra flutuando por aí para fazer a saída, o que não é realmente um problema para o seu caso de uso, mas poderia ser menos ideal em outras ocasiões. Isso funciona com qualquer shell, diferente da substituição do processo, mas é claro que requer uma ferramenta extra (provavelmente menos comum) instalada.

Você pode dar comandos mais complexos, citando-os: pee "xsel --display :1" cat. Eles são executados sh, então você precisa ter cuidado com os metacaracteres do shell.

Michael Homer
fonte
4
Muito legal - não sabia disso #
steeldriver
2
Esse não é um bom nome.
David Richerby