'tee' para comandos

13

tee pode redirecionar a entrada padrão canalizada para o arquivo de saída padrão e .

echo Hello, World! | tee greeting.txt

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

Há também a opção -a para tee anexar ao arquivo existente em vez de sobrescrever.

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

Estou tentando criar um script de wrapper para buku para copiar para a seleção principal a URL do marcador especificado por sua 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, em seguida, salvar na seleção principal (área de transferência).

Eu imagino algo de echo $url | teeC xsel ou 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 < strong> variable como segue:

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

Também posso usá-lo com urlview para visualizar, selecionar e abrir com $BROWSER da seguinte forma:

bukuc 10-20 | urlview
    
por w17t 17.06.2017 / 20:56

2 respostas

18

É simples em shells que suportam substituição de processos , por ex. bash

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

Caso contrário, você poderia usar um FIFO (embora não tenha conveniência)

$ mkfifo _myfifo
$ xsel < _myfifo &
$ echo bar | tee _myfifo
bar
$ xsel -o
bar
[1] + Done                       xsel 0<_myfifo
$ 
    
por 17.06.2017 / 21:12
9

O análogo direto de "tee for commands" é o comando pee de moreutils ( tee , mas com tubos). Seus argumentos são usados como comandos para serem executados, não como caminhos, e recebem a entrada canalizada para eles, em vez de serem gravados no arquivo. Todos os comandos recebem a entrada padrão que você canalizou para pee como seus próprios.

Usando pee , você pode obter o resultado desejado, solicitando que execute xsel e cat com a entrada.

echo foo | pee xsel cat

Existe um processo cat extra flutuando por aí para fazer a saída, o que não é realmente um problema para o seu caso de uso, mas pode ser menos ideal outras vezes. Isso funciona com qualquer shell, ao contrário 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 com sh , então você precisa ter cuidado com metacaracteres de shell.

    
por 18.06.2017 / 01:11