`tee` per i comandi


15

teepuò reindirizzare l'input standard convogliato nell'output e nel file standard .

echo Hello, World! | tee greeting.txt

Il comando sopra mostrerebbe il saluto sullo schermo del terminale e lo salverebbe nel contenuto del greeting.txtfile, creando il file se non ce n'è nessuno con quel nome.

C'è anche un -ainterruttore per teeaggiungere al file esistente invece di sovrascrivere.


Esiste un modo conveniente per reindirizzare l'input reindirizzato al comando e all'output standard anziché al file?

Sto cercando di creare uno script wrapper per bukucopiare nella selezione principale l'URL del segnalibro specificato dal suo numero indice.

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

Qui lo uso echo due volte, prima per la visualizzazione sul terminale e poi per il salvataggio nella selezione principale (appunti).

Immagino qualcosa echo $url | teeC xselo una scorciatoia per visualizzare l'output prima di passare al comando successivo (comandi concatenati), cosa mi permetterebbe di concatenare l'intero comando in una riga senza la necessità di salvare il risultato in una variabile come segue:

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

Posso anche usarlo con urlviewper visualizzare, selezionare e aprire con il $BROWSERseguente:

bukuc 10-20 | urlview

3
Prova tee /dev/ttyo tty0(non ricordare esattamente ... sono sulla strada)
George Vasiliou,

2
info teemenziona la sostituzione del processo e l'output di pipe tee in un programma ...
Xen2050

Risposte:


19

È semplice nelle shell che supportano la sostituzione dei processi , ad esempio bash

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

Altrimenti, potresti usare un FIFO (anche se manca di praticità)

$ mkfifo _myfifo
$ xsel < _myfifo &
$ echo bar | tee _myfifo
bar
$ xsel -o
bar
[1] + Done                       xsel 0<_myfifo
$ 

Grazie! Due cose che ho notato: 1. sh(Bourne shell) non supporta quella funzione; 2. La freccia deve rimanere attaccata come parte del singolo operatore >()per la sostituzione del processo.

11

L'analogo diretto di "tee for comandi" è il peecomando di moreutils ( tee, ma con pipe). I suoi argomenti vengono utilizzati come comandi da eseguire, non come percorsi e ottengono l'input reindirizzato su di essi anziché scritti su file. A tutti i comandi viene fornito l'input standard a cui è stato eseguito il piping peecome proprio.

Usando pee, puoi ottenere il risultato desiderato dicendogli di eseguire entrambi xsele catcon l'input.

echo foo | pee xsel cat

C'è un catprocesso extra che fluttua lì intorno per fare l'output, il che non è un problema per il tuo caso d'uso ma potrebbe essere meno ideale altre volte. Funziona con qualsiasi shell, a differenza della sostituzione di processo, ma ovviamente richiede uno strumento extra (probabilmente meno comune) installato.

Si può dare più comandi complessi da loro citando: pee "xsel --display :1" cat. Sono gestiti con sh, quindi devi stare attento ai metacaratteri della shell.


4
Molto bello - non lo sapevo
Steeldriver il

2
Questo è ... non un buon nome.
David Richerby
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.