tee stdout to stderr?


17

Я хотів би надіслати stdout з одного процесу до stdin іншого процесу, але також і на консоль. Наприклад, надсилання stdout в stdout + stderr.

Наприклад, я git editпсевдонімився до наступного:

git status --short | cut -b4- | xargs gvim --remote

Я хотів би, щоб список імен файлів був надісланий на екран, а також на xargs.

Отже, чи є така teeутиліта, яка зробить це? Так що я можу зробити щось на кшталт:

git status --short | \
    cut -b4- | almost-but-not-quite-entirely-unlike-tee | \
    xargs gvim --remote

Відповіді:


14

tee може дублювати поточну консоль, використовуючи tee /dev/tty

git status --short | cut -b4- | tee /dev/tty | xargs gvim --remote

В іншому випадку ви можете використовувати /dev/stdoutабо, /dev/stderrале вони можуть бути перенаправлені, якщо ваша команда знаходиться в сценарії. Зверніть увагу, що /dev/ttyконсоль завжди буде (і може не існувати в неінтерактивній оболонці). Це неправильно, читайте коментарі.


1
Дійсно, в конвеєрі, який ви показуєте /dev/stdout , переспрямовано. Тобто, якщо ви використовували tee /dev/stdoutефект, було б те, що все надсилається xargsдвічі, і нічого не йде до терміналу.
— celtschk

/dev/stdoutне перенаправлена ​​трубою, вона залишиться на поточному стандартному виході. Однак якщо ви інкапсулюєте команду в скрипт, а потім переспрямовуєте stdout цього сценарію, тоді /dev/stdoutбуде переспрямовано. В інтерактивній консолі tee /dev/ttyі tee /dev/stdoutмає той же ефект, навіть при використанні труб.
— Вінсент Роберт

Якщо ви мені не вірите, почніть свою оболонку та введіть echo foo | tee /dev/stdout | tr f bі echo foo | tee /dev/tty | tr f b. Ось вам підказка: саме teeця інтерпретація /dev/stdoutназивається файлом.
— celtschk

2
Ви маєте рацію, я не знаю, як я це пропустив. Я робив кілька тестів у власній оболонці з tty та stdout, і я якось це пропустив. Дякую за уточнення, я видалив неправильну заяву.
— Вінсент Роберт

Ну, враховуючи, що на stderr не впливає труба, вам би не потрібно було її видаляти (звичайно, залишається застереження про переадресацію сценарію, але для сценарію перенаправлення, як правило, є бажаною властивістю).
— celtschk


3

Ви можете використовувати команду tee , просто подайте її з файлом STDERR, наприклад:

tee /dev/stderr
tee /proc/self/fd/2

тож у такому випадку ваш псевдонім може бути:

git status --short | \
    cut -b4- | tee /dev/stderr | \
    xargs gvim --remote

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