`tee` für befehle

15

teekann die weitergeleitete Standardeingabe in die Standardausgabe und -datei umleiten .

echo Hello, World! | tee greeting.txt

Der obige Befehl zeigt die Begrüßung auf dem Terminalbildschirm an und speichert sie im Inhalt der greeting.txtDatei, wobei die Datei erstellt wird, wenn keine mit diesem Namen vorhanden ist.

Es gibt auch einen -aSchalter teezum Anhängen an die vorhandene Datei, anstatt sie zu überschreiben.


Gibt es eine bequeme Möglichkeit, die weitergeleitete Eingabe an den Befehl und die Standardausgabe anstatt an die Datei umzuleiten ?

Ich versuche, ein Wrapper-Skript zu erstellen, um bukudie URL des durch die Indexnummer angegebenen Lesezeichens in die primäre Auswahl zu kopieren.

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

Hier benutze ich echo zwei mal, zuerst zum Anzeigen auf dem Terminal, und dann zum Speichern in der primären Auswahl (Zwischenablage).

Ich stelle mir etwas von echo $url | teeC xseloder eine Verknüpfung vor, um die Ausgabe anzuzeigen, bevor ich zum nächsten Befehl übergebe (Befehle verketten). Auf diese Weise kann ich den gesamten Befehl in einer Zeile verketten, ohne das Ergebnis wie folgt in einer Variablen speichern zu müssen :

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

Ich kann es auch verwenden urlview, um $BROWSERFolgendes anzuzeigen, auszuwählen und zu öffnen :

bukuc 10-20 | urlview

quelle
3
Versuchen Sie tee /dev/ttyoder tty0(nicht genau erinnern ... ich bin auf der Straße)
George Vasiliou
2
info teeErwähnt Prozessersetzung und Ausgabe des Pipe-Tees an ein Programm ...
Xen2050

Antworten:

19

Es ist unkompliziert in Shells, die die Prozessersetzung unterstützen , z. B. Bash

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

Andernfalls könnten Sie ein FIFO verwenden (obwohl es nicht bequem ist)

$ mkfifo _myfifo
$ xsel < _myfifo &
$ echo bar | tee _myfifo
bar
$ xsel -o
bar
[1] + Done                       xsel 0<_myfifo
$ 
Stahlfahrer
quelle
Vielen Dank! Zwei Dinge, die ich bemerkt habe: 1. sh(Bourne-Shell) unterstützt diese Funktion nicht; 2. Der Pfeil muss als Teil des einzelnen Operators >()für die Prozessersetzung bleiben .
11

Das direkte Analogon von "tee for commands" ist der peeBefehl von moreutils ( teeaber mit Pipes). Die Argumente werden als auszuführende Befehle und nicht als Pfade verwendet und die Eingabe wird an sie weitergeleitet, anstatt in eine Datei geschrieben zu werden. Alle Befehle erhalten die Standardeingabe, an die Sie weitergeleitet peehaben.

Mit peekönnen Sie das gewünschte Ergebnis erzielen, indem Sie angeben, dass es sowohl mit xselals auch catmit der Eingabe ausgeführt werden soll.

echo foo | pee xsel cat

Es gibt dort einen zusätzlichen catProzess, der die Ausgabe ausführt, was für Ihren Anwendungsfall kein Problem darstellt, aber zu anderen Zeiten weniger ideal sein könnte. Dies funktioniert mit jeder Shell, im Gegensatz zur Prozessersetzung, aber es ist natürlich ein zusätzliches (wahrscheinlich weniger verbreitetes) Tool erforderlich.

Sie können komplexere Befehle geben sie mit einem Zitat: pee "xsel --display :1" cat. Sie werden mit ausgeführt sh, sodass Sie vorsichtig mit Shell-Metazeichen sein müssen.

Michael Homer
quelle
4
Sehr cool - wusste nichts davon
steeldriver 18.06.17
2
Das ist ... kein guter Name.
David Richerby