Перенаправить stderr на второй терминал / tty
Я пробовал такие вещи, как rse
дифференцировать потоки стандартного вывода и стандартных ошибок от программы; но мне бы очень хотелось, чтобы вариант просматривал их в отдельных терминалах, не перенаправляя их в файл и не отслеживая его или что-то в этом роде (предположим, что любой из потоков может печатать коды управления терминалами ANSI.)
Есть ли способ открыть стандартную ошибку существующего процесса в новом терминале или что-то в этом роде?
2 ответа
Откройте два терминала. Во втором, выясните его tty устройство, запустив tty
команда. Это напечатает что-то вроде /dev/pts/8
,
Во-первых, запустите ваше приложение, перенаправив сюда его stderr, например myapp 2>/dev/pts/8
,
Я использую это так часто для отладки, что я устанавливаю заголовок терминала, содержащий номер tty, так что мне даже не нужно запускать tty
команда. Я делаю это в командной строке, комбинируя escape-последовательность, которая меняет заголовок с bash \l
(это строчная буква L) для номера строки tty, т.е. PS1=$'\\[\e]0;\l\a\\] ...'
Я часто выполняю cat
во втором терминале перед запуском реального приложения, на случай, если я случайно наберу что-то там, это безвредно, и чтобы курсор переместился на первый столбец. Это не обязательно, хотя.
Моим первым инстинктом было "нет", но потом я придумал это уродство:
sh -c 'echo stdout; echo stderr >&2' 2> >(
errs=$(cat)
xterm -e "bash -c '
cat <<\"END\"
$errs
END
read -p DONE
'"
)
Стандартная ошибка перенаправляется на подстановку процесса, где содержимое собирается и затем передается в сценарий, выполненный в xterm.
Я горжусь тем, что придумала это, но в основном смущена.