Direkte Ausgabe an Pipe und Standard


14

Ich habe mich gefragt, ob es eine Möglichkeit gibt, die Ausgabe eines Befehls an die Standardausgabe weiterzuleiten. Druckt beispielsweise fortuneeinen Glückskeks und kopiert ihn auch in die Zwischenablage:

$ fortune | tee >(?stdout?) | pbcopy 
"...Unix, MS-DOS, and Windows NT (also known as the Good, the Bad, and
the Ugly)."
(By Matt Welsh)

Ich habe mein OSX nicht zur Hand, was ist mit fortune | tee $(tty) | pbcopy?
Archemar

Antworten:


9

Ihre Annahme:

fortune | tee >(?stdout?) | pbcopy

funktioniert nicht, da die fortuneAusgabe zweimal auf Standard ausgegeben wird, sodass Sie die Ausgabe auf verdoppeln pbcopy.

In OSX (und anderen Systemunterstützungen /dev/std{out,err,in}) können Sie Folgendes überprüfen:

$ echo 1 | tee /dev/stdout | sed 's/1/2/'
2
2

2zweimal anstelle von 1und ausgeben 2.

Sie müssen andere Dateideskriptoren verwenden, Beispiel Standardfehler durch /dev/stderr:

$ echo 1 | tee /dev/stderr | sed 's/1/2/'
1
2

oder verwenden Sie tty, um das angeschlossene Pseudo-Terminal zu erhalten:

$ echo 1 | tee "$(tty)" | sed 's/1/2/'
1
2

Mit zshund multiosOptionssatz brauchen Sie überhaupt nicht tee:

$ echo 1 >/dev/stderr | sed 's/1/2/'
1
2

tee $(tty)Oder, weißt du,tee /dev/tty
Kenster

tolle Erklärung, Top SO Antwort rundum.
Merlin

10

teeschreibt immer in die Standardausgabe. Wenn Sie die Daten zusätzlich zu dem Terminal, an dem die Standardausgabe bereits ausgeführt wird, an einen Befehl senden möchten, verwenden Sie einfach die Prozessersetzung mit diesem Befehl. (Beachten Sie, dass die >Prozessersetzung trotz des Beginns nicht die Standardausgabe umleitet, sondern vom teeBefehl als Parameter angesehen wird.)

fortune | tee >(pbcopy)

Das ist gut, auch eine gute Lösung.
Merlin

0

Cuonglm hat alles gesagt.

Probiere es einfach:

fortune | tee "$(tty)" | pbcopy

ttysollte /dev/pts/99in einer interaktiven Sitzung (dh im Terminal) in ein tatsächliches Pseudo-Terminal (wie ) aufgelöst werden, oder nicht in Batch, at und Daemon.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.