Перенаправить 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.

Я горжусь тем, что придумала это, но в основном смущена.

Другие вопросы по тегам