Прямой вывод на трубу и стандартный вывод

14

Мне было интересно, есть ли способ передать вывод команды и направить его на стандартный вывод. Так, например, fortuneпечатает печенье с предсказанием, а также копирует его в буфер обмена:

$ fortune | tee >(?stdout?) | pbcopy 
"...Unix, MS-DOS, and Windows NT (also known as the Good, the Bad, and
the Ugly)."
(By Matt Welsh)
user14492
источник
У меня нет OSX под рукой, а что fortune | tee $(tty) | pbcopy?
Archemar

Ответы:

9

Ваше предположение:

fortune | tee >(?stdout?) | pbcopy

не будет работать, потому что fortuneвывод будет записан в стандартный формат дважды, поэтому вы удвоите вывод до pbcopy.

В OSX (и других системах поддержки /dev/std{out,err,in}) вы можете проверить это:

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

выведите 2дважды вместо 1и 2.

Вы должны использовать другие файловые дескрипторы, например стандартную ошибку через /dev/stderr:

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

или используйте ttyдля получения подключенного псевдотерминала:

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

С zshи multiosопцией, вам не нужно teeвообще:

$ echo 1 >/dev/stderr | sed 's/1/2/'
1
2
cuonglm
источник
tee $(tty)Или, знаете ли,tee /dev/tty
Kenster
отличное объяснение, топ так ответь всем вокруг.
Мерлин
11

teeвсегда пишет в свой стандартный вывод. Если вы хотите отправить данные команде в дополнение к терминалу, на котором уже идет стандартный вывод, просто используйте подстановку процесса с этой командой. (Обратите внимание, что, несмотря на начало >, подстановка процесса не перенаправляет стандартный вывод, teeкоманда видит его как параметр.)

fortune | tee >(pbcopy)
Жиль "ТАК - прекрати быть злым"
источник
Это хорошо, тоже хорошее решение.
Мерлин
0

cuonglm сказал все это.

Просто попробуй:

fortune | tee "$(tty)" | pbcopy

ttyдолжен разрешить фактический псевдотерминал (например /dev/pts/99) в интерактивном сеансе (т. е. в терминале) или не указывать tty в пакете, at и daemon.

Archemar
источник