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

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
4

Более общее решение, чем /dev/tty:

start cmd:> echo foo | tee /dev/stderr 
foo
foo
Хауке Лагинг
источник
start cmd:> твой $PS1?
mgalgs
@mgalgs Да, часть меня PS1: hauke-laging.de/software/prompt (немецкий)
Hauke ​​Laging
3

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

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

так что в этом случае ваш псевдоним может быть:

git status --short | \
    cut -b4- | tee /dev/stderr | \
    xargs gvim --remote
MolbOrg
источник
1
Я думаю, что вы имеете в виду/proc/self/fd/2
celtschk