тоесть стандартный выход к стандартному?


17

Я хотел бы отправить стандартный вывод из одного процесса в стандартный поток другого процесса, но также и в консоль. Например, отправка 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не перенаправляется по каналу, он останется стандартным выводом текущего процесса. Однако, если вы инкапсулируете команду в сценарии, а затем перенаправите стандартный вывод этого сценария, то /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.