Linux / Debian - Was macht 'pinkeln' in moreutils?

Antworten:

29

Folgendes kannst du mit Natursekt machen:

seq 5 -1 1 > file
cat file |pee 'sort -u > sorted' 'sort -R > unsorted'

Pipi funktioniert also mit Shell Pipes anstelle von Feilen.

bash braucht kein pinkeln, es kann Shell-Befehle als Dateien öffnen:

cat file |tee >(sort -u > sorted) >(sort -R > unsorted)
Tobu
quelle
1
Würde dies mit Dateinamen-Jockern funktionieren? Siehe zgp.org/~dmarti/tips/git-multiple-post-receive-hooks - Pee wird verwendet, stdinum Klone für jedes Skript zu multiplizieren, das das Dateinamenmuster berechnet. Kann pure bash dies tun? AFAIU würde es einen Stern in den Klammern erweitern, der so etwas wie tee >(app1 app2 app3 app4)das verursacht, was >(app1) >(app2) >(app3) >(app4)Ihre Antwort nicht zeigt
Arioch 'The
@Arioch, die Bash-Syntax funktioniert nicht mit der Hooks-Joker-Technik. Installieren Sie einfach moreutils.
Tobu
1
Verwenden Sie tee >/dev/nulldiese Option, um die Replikation von stdin nach stdout zu vermeiden
jfs
1
Der eigentliche Vorteil von Pipi über Tee ist, dass die Standardausgabe von jedem Unterprozess an die Standardausgabe selbst gesendet wird. mit tee musst du jedes prozess-stdout in eine datei umleiten, wenn du es speichern willst, aber mit pee musst du nur das stdout speichern. Das macht natürlich nur Sinn, wenn jeder Unterbefehl eine ähnlich formatierte Sache ausgibt. Wenn Sie nicht herausfinden könnten, wie oder reguläre Ausdrücke in grep Sie tun könnten cat file | pee 'grep this' 'grep that' > lines.with.this.or.that.txt... Mit tee würden Sie nur eine Kopie von fileon stdout erhalten.
Unterschreitung
Die >(command)Funktion heißt Prozessersetzung .
Vlastimil Ovčáčík
16

Es ist wahrscheinlich einfacher zu verstehen, wenn Sie teezuerst verwendet haben. Dieses nützliche alte Tool verwendet die Standardeingabe und schreibt in mehrere Dateien sowie die Standardausgabe. Folgende:

echo "Hello world" | tee one two

Erstellt zwei Dateien mit den Namen oneund two, die beide die Zeichenfolge enthalten Hello world. Es wird auch auf Ihrem Terminal gedruckt.


Führt jetzt peeeine ähnliche Funktion aus, leitet die Ausgabe jedoch nicht mehr an mehrere Dateien, sondern an mehrere sekundäre Befehle, ala Pipes, weiter. Es unterscheidet sich geringfügig davon, teedass es das ursprüngliche stdin nicht an stdout sendet, da es keinen Sinn macht, es mit der Ausgabe der sekundären Befehle zu kombinieren. Das folgende sehr einfache Beispiel:

echo "Hello world" | pee cat cat

Gibt den String Hello worldzweimal an Ihr Terminal aus. Dies liegt daran, dass jede der beiden Instanzen von catdie Standardausgabe empfängt und das catausführt, was gedruckt wird.

Dan Carley
quelle