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)
użytkownik14492
źródło
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
Cuonglm
źródło
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)
Gilles „SO- przestań być zły”
źródło
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.

Archemar
źródło