Перенаправление bash stdout/stderr в два места?
Я уже некоторое время подслушивал меня. Можно ли перенаправить stdout
и stderr
на вывод терминала и в программу?
Я понимаю, что можно перенаправить выходы в файл и stdout
с tee
, но я хочу, чтобы он перешел к программа (мой редактор [TextMate]), а также вывод терминала... конечно это возможно (я знаю, что это возможно с zsh...)
Ответы
Ответ 1
Вы можете использовать именованный канал, который предназначен именно для описанной вами ситуации.
mkfifo some_pipe
command_that_writes_to_stdout | tee some_pipe \
& command_that_reads_from_stdin < some_pipe
rm some_pipe
Или, в Bash:
command_that_writes_to_stdout | tee >(command_that_reads_from_stdin)
Ответ 2
Можно ли перенаправить stdout и stderr как на вывод терминала, так и на программу?
Я не уверен, насколько полезно комбинировать stdout и stderr на входе в редактор, но делает что-то вроде этого, что вам нужно?
input_prog 2>&1 | tee /dev/tty | my_editor
Ответ 3
Я действительно не знаю, может ли TextMate взять файл для редактирования в качестве стандартного ввода, что кажется немного странным. Я подозреваю, что вы захотите отправить stdout/stderr в файл и отредактировать его там, в этом случае вам нужно:
progname 2>&1 | tee tempfile ; textmate tempfile
2>&1
перенаправляет stderr
(дескриптор файла 2), чтобы перейти к тому же месту, что и stdout
(дескриптор файла 1), чтобы оба из них оказались в одном потоке. Затем команда tee
записывает это значение в tempfile
, а также stdout
.
Затем, как только процесс завершится, редактор вызывается во временном файле.
Если он может принимать стандартный ввод для редактирования, используйте:
progname 2>&1 | tee /dev/tty | textmate