Bezpośrednie wyjście do potoku i standardowego wyjścia


14

Zastanawiałem się, czy istnieje sposób na przesłanie wyniku polecenia i skierowanie go do standardowego wyjścia. Na przykład fortunedrukuje plik cookie fortuny, a także kopiuje go do schowka:

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

Nie mam pod ręką mojego OSX, a co z tym fortune | tee $(tty) | pbcopy?
Archemar

Odpowiedzi:


9

Twoje założenie:

fortune | tee >(?stdout?) | pbcopy

nie będzie działać, ponieważ dane fortunewyjściowe zostaną zapisane dwa razy na standardowe wyjście, więc podwoisz wynik do pbcopy.

W OSX (i obsłudze innych systemów /dev/std{out,err,in}) możesz to sprawdzić:

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

wypisuje 2dwa razy zamiast 1i 2.

Musisz użyć innych deskryptorów plików, na przykład standardowego błędu poprzez /dev/stderr:

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

lub użyj, ttyaby uzyskać podłączony pseudo terminal:

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

Dzięki opcji zshi multiosnie potrzebujesz teewcale:

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

tee $(tty)Albo, wiesz,tee /dev/tty
Kenster

świetne wyjaśnienie, najlepsza odpowiedź SO dookoła.
Merlin

11

teezawsze zapisuje na standardowe wyjście. Jeśli chcesz wysłać dane do polecenia oprócz terminala, do którego już idzie standardowe wyjście, po prostu użyj zastępowania procesu tym poleceniem. (Zauważ, że pomimo rozpoczęcia >podstawienie procesu nie przekierowuje standardowego wyjścia, teepolecenie traktuje to jako parametr).

fortune | tee >(pbcopy)

To dobrze, również dobre rozwiązanie.
Merlin

0

cuonglm powiedział wszystko.

Spróbuj:

fortune | tee "$(tty)" | pbcopy

ttypowinien rozwiązywać do rzeczywistego pseudo terminala (podobnego /dev/pts/99) w sesji interaktywnej (tj. w terminalu) lub brak tty wsadowo, w i demona.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.