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.