СогласноДокументация GNU, есть персонажVREPRINT
, или rprnt
, который должен повторно печатать буфер ввода редактора строк оболочки. Это может быть полезно, если что-то вроде фонового процесса записало в PTY, пока вы печатаете другую команду, и есть вывод, перемежающийся с вашим вводом. Однако я попробовал использовать его на самом деле, и, похоже, это не дало никакого эффекта. Я сделал следующее:
- Запустите
sh
сеанс на последнемalpine
образе из Dockerhub. - Используйте
stty
для привязкиrprnt
персонажа к^N
. - Введите некоторые данные
- Из отдельной сессии напишите PTY первой сессии.
- Попробуйте нажать ctrl-N, чтобы перепечатать мой ввод.
Я ожидал, что он обновит мой ввод и удалит вывод, который был записан. Однако эффекта не было. Вывод все еще загромождает мой редактор строк. Я проверил это icanon
и iexten
настроил на этот PTY.
решение1
Я предполагаю, что ваша оболочка — это bash
или какая-то другая оболочка с полнофункциональными возможностями редактирования строк.
Эти оболочки, ожидая ввода команды, устанавливают режим tty на raw, а не на canonical, поэтому данная настройка rprnt
к ним не применяется.
Инструмент командной строки stty
не сообщает об этом, поскольку эти оболочки переключают настройки туда и обратно на время редактирования строки, а не запуска запрошенной внешней программы (например, stty
самой себя). Вы можете подтвердить это, запустив stty -a < /dev/pts/[this-terminal's-number]
другой терминал, пока этот находится в подсказке.
Выберите программу, которая делаетнетиметь полноценные возможности редактирования строк, такие как cat
, dash
или подобные. Вы обнаружите, что выдача stty rprnt ^N
авансом и нажатие ^N
действительно перепечатывает заданную строку. По крайней мере, я проверил, и это работает для меня.
Для оболочек с мощными возможностями редактирования строк вам придется обратиться к документации данной оболочки (или, если это bash
библиотека readline
), чтобы узнать, как повторно вывести приглашение или как настроить его горячую клавишу.