Backspace, удаляя всю строку в терминале

Oct 24 2020

Я подключился по SSH к шлюзовому компьютеру, а затем оттуда по SSH на другой компьютер. Каждый раз, когда я нажимаю на Backspace, вся строка удаляется ...

Использование stty -aдает мне следующее (частичный отрывок):

Как видите, backspace ("^?") Привязан к нему erase, поэтому я ожидал, что с его помощью будет удален только один символ. Тем не менее, по какой-то причине он ведет себя как ^ U, где вся строка удаляется ... Как вы можете видеть ниже, как только я нажимаю клавишу возврата, "^?" отправляется символ, и вся строка удаляется, несмотря на то, что она сопоставлена ​​с erasenot kill...

Уже опубликовано много похожих вопросов, но ни одно из этих решений здесь не работает, поскольку stty уже сопоставляется сerase . (т.е. это )

Я использую bash.

Ответы

1 KamilMaciorowski Oct 24 2020 at 03:49

Ключ к разгадке intr = ^?. Когда вы нажимаете Backspace, оболочка получает SIGINTот терминала и очищает командную строку. Я могу легко воспроизвести проблему, запустив stty intr ^?.

Обычно это intr = ^Cозначает Ctrl+ cтриггеры SIGINT. Запустите это:

stty intr ^C

Заметки:

  • В приведенной выше команде вы можете ввести ^Cбуквально два символа: ^и C; sttyдолжен понимать.
  • Чтобы исправить Backspaceэто, достаточно установить intrвсе, кроме ^?. Например, вы можете установить для него значение «ничего» (undefined), вызвав stty intr ''. По-прежнему ^Cдолжен быть вашим первым выбором.