Удалить ^ C, когда CTRL + C

25

Есть ли способ удалить, ^Cкогда вы нажмете CTRL+ Cв оболочке, включенной с Red Hat Enterprise Linux 6 («Сантьяго»)? У меня есть разрешение на редактирование своего .bash_profile.

Феде Голд
источник
4
попробуйset echo-control-characters off
Sundeep
1
Я пытался, но это не сработало
Fede Gold

Ответы:

29

Отредактируйте (или создайте) свой ~/.inputrcфайл. Добавьте строку, говоря

set echo-control-characters Off

Это даст указание библиотеке GNU Readline (которую использует Bash) не выводить (отображать) какие-либо управляющие символы на экран. Этот параметр будет активен во всех новых сеансах Bash после этого (и в любой другой утилите, которая использует библиотеку Readline).

Обратите внимание, что если ваша система Unix поставляется с общесистемным файлом конфигурации для библиотеки Readline (обычно /etc/inputrc), то ваш личный файл конфигурации должен будет включать этот файл:

$include /etc/inputrc
set echo-control-characters Off

Другая альтернатива - сделать личную копию общесистемного файла конфигурации, а затем изменить его.

Кусалананда
источник
Привет, я проверил это, и он работает нормально, но когда я прерываю работающую команду bash, она не работает, например, sleep 180и
нажимаю
@ Ten-Coin Это будет работать, только если команда, к сожалению, использует библиотеку Readline.
Кусалананда
1
Если он ~/.inputrcеще не существует, простое создание файла может привести к потере некоторых существующих настроек. В моем случае я впервые заметил, что ctrl + left и ctrl + right перестали работать. Исправление было начать ~/.inputrcс этой строки $include /etc/inputrc. Также можно просто cp /etc/inputrc .inputrcи отредактировать по желанию.
kasperd
2
@kasperd Хорошая мысль! Я не знал, что добавление личного файла конфигурации приведет к отключению чтения общесистемного файла конфигурации (в моей системе его нет). Я обновлю свой ответ.
Кусалананда
20

Попробуйте следующее:

stty -echoctl

Для объяснения см. Этот великий и подробный пост от Стефана Шазеля, который также объясняет некоторые другие sttyособенности .

Если вы хотите, чтобы это изменение было постоянным (и вы используете, bashкак подразумевается в вашем вопросе), то лучше добавить его, .bashrcкак отмечено в комментариях jlmg (так, что оно применимо ко всем интерактивным оболочкам).

PHK
источник
+1 В отличие от решения readline, это должно работать для большинства, если не для всех вещей, работающих в терминале.
JoL
1
Вероятно, следует упомянуть, что он не будет работать на всех терминалах, если его вставить, .bash_profileпоскольку этот файл анализируется только оболочками входа в систему. .bashrcВместо этого его следует ввести , чтобы он читался всеми интерактивными вызовами.
JoL
1
Не по-прежнему ли это повторяет необработанный байт 0x03, который теоретически может быть интерпретирован некоторыми терминалами? Это также будет иметь побочные эффекты, если вы будете выполнять такие вещи, как выполнение команды без ^[[A
чтения строки
1
@ Random832 +1 Ты прав. Я предполагаю, что установка просто плохо названа; он не контролирует отображение управляющих символов, а скорее перевод их в печатные символы перед отображением. Чтобы предотвратить этот побочный эффект, вам бы stty -echoтоже пришлось . Это, конечно же, предотвратит повторение всего остального, что, вероятно, делает этот ответ бездействующим, если все, что вы хотели - это скрыть ^Cs.
JoL
1
@jlmg Если бы ^Cвсегда было в конце, я мог бы согласиться с тобой. Но ^Cон будет напечатан там, где когда-либо находился курсор, который может перезаписать пару символов в любом месте команды. Это означает, что если вам нужно скопировать и вставить части этой команды, у вас может получиться что-то искаженное. И ^Cпри просмотре терминала не так легко распознать, как если бы он был в конце команды.
kasperd
2

Если вы пытаетесь найти конфигурацию, которая позволит нормально отображать эхо (в том числе echoctl) и просто отключить эхо-сигналы генерирующих сигнал символов, и вы уверены, что это должно быть возможно, потому что вы видели, как это работало раньше ...

Вы, наверное, видели это таким образом. Но это больше невозможно из-за этого коммита :

commit ec5b1157f8e819c72fc93aa6d2d5117c08cdc961

Включите эхо-запрос INTR / QUIT / SUSP в дисциплине строки N_TTY (например, ctrl-C будет отображаться как «^ C», если установлен stty echoctl, а ctrl-C установлен как INTR).

Linux, похоже, является единственной Unix-подобной ОС (недавно я проверял это на Solaris, BSD и Mac OS X), которая не ведет себя таким образом, и я действительно пропускаю это как хорошее визуальное подтверждение прерывания программы в консоли или xterm. Я помню это с любовью из многих Unix, которые я использовал на протяжении многих лет. Внедрение этого в Linux также кажется хорошим способом сделать его еще более совместимым со стандартным Unix-подобным поведением.

Если вы с любовью вспоминаете, как Linux не повторял это ^C, единственный способ вернуть старое поведение - это исправить ваше ядро. В последних версиях отображение символов, генерирующих сигналы, находится в строках 1215-1218 файла drivers / tty / n_tty.c .


источник