Прямий вихід на трубу і прокладку


14

Мені було цікаво, чи є спосіб передати висновок команди і направити її на stdout. Так, наприклад, fortuneдрукується файл cookie, а також копіюється в буфер обміну:

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

У мене немає під рукою OSX, а що fortune | tee $(tty) | pbcopy?
Архемар

Відповіді:


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

tee $(tty)Або, знаєте,tee /dev/tty
Кенстер

чудове пояснення, топ ТАК відповіді на все навколо.
Мерлін

11

teeзавжди пише на свій стандартний вихід. Якщо ви хочете відправити дані команді на додаток до терміналу, куди вже йде стандартний висновок, просто використовуйте підстановку процесу на цю команду. (Зверніть увагу, що незважаючи на початок з >, підміна процесу не перенаправляє стандартний вихід, teeкоманда розглядає його як параметр.)

fortune | tee >(pbcopy)

Це добре, також хороше рішення.
Мерлін

0

cuonglm все це сказав.

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

fortune | tee "$(tty)" | pbcopy

ttyмає відповідати фактичному псевдотерміналу (як /dev/pts/99) в інтерактивному сеансі (тобто в терміналі), або не мати Tty в пакетній, в і демон.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.