T-Stück stdout zu stderr?

17

Ich möchte stdout von einem Prozess an den stdin eines anderen Prozesses senden, aber auch an die Konsole. Senden Sie beispielsweise stdout an stdout + stderr.

Zum Beispiel habe ich git editfolgende Alias:

git status --short | cut -b4- | xargs gvim --remote

Ich möchte, dass die Liste der Dateinamen an den Bildschirm sowie an gesendet wird xargs.

Gibt es ein teeähnliches Dienstprogramm, das dies erledigt? Damit ich etwas machen kann wie:

git status --short | \
    cut -b4- | almost-but-not-quite-entirely-unlike-tee | \
    xargs gvim --remote
Roger Lipscombe
quelle

Antworten:

14

tee kann mit auf die aktuelle Konsole dupliziert werden tee /dev/tty

git status --short | cut -b4- | tee /dev/tty | xargs gvim --remote

Alternativ können Sie /dev/stdoutoder verwenden /dev/stderr, diese können jedoch umgeleitet werden, wenn sich Ihr Befehl in einem Skript befindet. Beachten Sie, dass dies /dev/ttyimmer die Konsole ist (und möglicherweise nicht in einer nicht interaktiven Shell vorhanden ist). Das ist falsch, lies die Kommentare.

Vincent Robert
quelle
1
Tatsächlich in der Pipeline zeigen Sie /dev/stdout werden umgeleitet. Das heißt, wenn Sie tee /dev/stdoutden Effekt verwenden, wird alles xargszweimal gesendet , und nichts wird an das Terminal gesendet .
Celtschk
/dev/stdoutwird nicht von einer Pipe umgeleitet, sondern behält die aktuelle Prozessstandardausgabe bei. Wenn Sie den Befehl jedoch in ein Skript einkapseln und dann die Standardausgabe dieses Skripts /dev/stdoutumleiten , wird die Umleitung ausgeführt. In einer interaktiven Konsole tee /dev/ttyund tee /dev/stdouthat den gleichen Effekt, auch wenn Pipes verwendet werden.
Vincent Robert
Wenn du mir nicht glaubst, starte deine Shell und tippe echo foo | tee /dev/stdout | tr f bund echo foo | tee /dev/tty | tr f b. Hier ist ein Hinweis für Sie: Es ist, teewas /dev/stdoutals Dateiname interpretiert .
Celtschk
2
Sie haben recht, ich weiß nicht, wie ich das verpasst habe. Ich habe einige Tests in meiner eigenen Shell mit tty und stdout gemacht und irgendwie habe ich das verpasst. Vielen Dank für die Klarstellung, ich habe die falsche Aussage entfernt.
Vincent Robert
Nun, da stderr nicht von der Pipe betroffen ist, hätten Sie das nicht entfernen müssen (natürlich bleibt die Einschränkung der Skriptumleitung bestehen, aber für ein Skript wäre die Umleitbarkeit im Allgemeinen eine gewünschte Eigenschaft).
Celtschk
4

Eine allgemeinere Lösung als /dev/tty:

start cmd:> echo foo | tee /dev/stderr 
foo
foo
Hauke ​​Laging
quelle
start cmd:> ist dein $PS1?
mgalgs
@mgalgs Ein Teil von mir PS1, ja: hauke-laging.de/software/prompt (deutsch)
Hauke ​​Laging
3

Sie können den Befehl tee verwenden, indem Sie ihn einfach mit der Datei STDERR füttern. Beispiel:

tee /dev/stderr
tee /proc/self/fd/2

In diesem Fall könnte Ihr Alias ​​sein:

git status --short | \
    cut -b4- | tee /dev/stderr | \
    xargs gvim --remote
MolbOrg
quelle
1
Ich denke du meinst/proc/self/fd/2
Celtschk