2013-05-22 14 views
6

Ich möchte manchmal den Inhalt einer Pipe in der Mitte ausgeben (nicht wir alle?).wierdness mit tee: kann jemand erklären?

ich tun es in der Regel wie folgt aus (ja, ich weiß, es gibt andere, wahrscheinlich besser, Wege):

terminal=$(tty) 
echo hello world |tee $terminal|awk '{print $2, $1}' 

die Ausgänge

hello world 
world hello 

Welche fein und in jeder Hinsicht schön.

Außer, dass ich wirklich gerne tun würde, ohne die $ Terminal-Variable zu erstellen. Einfach, sagen Sie, ersetzen Sie einfach "tee $terminal" durch "tee $(tty)" in der Leitung, und keine Notwendigkeit für eine Variable? Recht?

Falsch.

echo hello world |tee $(tty)|awk '{print $2, $1}' 

Ausgänge

world hello 

Mit anderen Worten, hat meine Ausgabe von der Mitte des Rohres geschluckt worden.

Jetzt akzeptiere ich, dass dies definitiv ein Problem der ersten Welt ist, aber es ärgert mich und ich würde gerne wissen, warum die zweite Lösung nicht funktioniert.

Jeder?

+0

+1 für „erstes Weltproblem“ und eine gute Frage. – tripleee

Antwort

7

Wenn Ihr System unterstützt wird, können Sie den aktuellen Terminal Zugriff direkt mit /dev/tty:

echo hello world | tee /dev/tty | awk '{print $2, $1}' 

(Die Datei in Linux und Mac OS X verfügbar ist, auf jeden Fall.)

Die tty Der Befehl gibt den Namen der Datei zurück, die mit der Standardeingabe verbunden ist, die nicht unbedingt ein Terminal sein muss. In Ihrer Pipe ist es die "Datei", die der Standardausgabe des vorhergehenden Befehls zugeordnet ist.

+0

Getestet und funktioniert auf raspbian, netbsd, CentOS; also sollte es für die meisten Zwecke gut sein. – demure

+0

Ah.yes. Das macht vollkommen Sinn. Ich hätte das wissen müssen. (O // O). (Laut Wikipedia ist das ein Emoticon für peinlich). Vielen Dank. – hardcode57

+0

Ha! Hätte ich ein kurzes "ls" gemacht, wäre ich dann eingetreten: – hardcode57

1

Sie können auch tee mit Prozess Substitution verwenden, wenn auf Ihrem System unterstützt:

echo hello world | tee >(awk '{print $2, $1}') 

Die Linie manchmal zu spät kommen, so können Sie ; sleep .01 am Ende hinzufügen müssen, wenn nötig.

Oder Sie können den Standardfehler für die Berichterstattung verwenden:

echo hello world | tee >(cat >&2) | awk '{print $2, $1}'