Usuń ^ C, gdy CTRL + C


25

Czy jest jakiś sposób na usunięcie ^Cpo wciśnięciu CTRL+ Cw powłoce w Red Hat Enterprise Linux 6 („Santiago”)? Mam pozwolenie na edycję własnych .bash_profile.


4
spróbujset echo-control-characters off
Sundeep,

1
Próbowałem, ale to nie zadziałało
Fede Gold

Odpowiedzi:


29

Edytuj (lub utwórz) swój ~/.inputrcplik. Dodaj wiersz z napisem

set echo-control-characters Off

Poinstruuje to bibliotekę GNU Readline (której używa Bash), aby nie wyświetlała (echa) żadnych znaków kontrolnych na ekranie. Ustawienie będzie aktywne później we wszystkich nowych sesjach Bash (oraz w każdym innym narzędziu, które korzysta z biblioteki Readline).

Zauważ, że jeśli twój system uniksowy zawiera ogólnosystemowy plik konfiguracyjny dla biblioteki Readline (zwykle /etc/inputrc), wtedy twój osobisty plik konfiguracyjny będzie musiał zawierać ten plik:

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

Inną alternatywą jest utworzenie osobistej kopii ogólnosystemowego pliku konfiguracyjnego, a następnie zmodyfikowanie go.


Cześć, przetestowałem to i działa dobrze, ale kiedy przerywam uruchomioną komendę bash, to nie działało, na przykład sleep 180i
nacisnąłem

@ Ten-Coin Działa to tylko wtedy, gdy polecenie używa niestety biblioteki Readline.
Kusalananda

1
Jeśli jeszcze ~/.inputrcnie istnieje, po prostu utworzenie pliku może spowodować utratę niektórych istniejących ustawień. W moim przypadku najpierw zauważyłem, że ctrl + lewy i ctrl + prawy przestały działać. Rozwiązaniem było rozpoczęcie mojej ~/.inputrcod tej linii $include /etc/inputrc. Możliwe jest również justowanie cp /etc/inputrc .inputrci edycja według potrzeb.
kasperd

2
@kasperd Dobra uwaga! Nie wiedziałem, że dodanie osobistego pliku konfiguracyjnego spowoduje wyłączenie odczytu pliku konfiguracyjnego dla całego systemu (mój system go nie ma). Zaktualizuję swoją odpowiedź.
Kusalananda

20

Spróbuj wykonać następujące czynności:

stty -echoctl

Wyjaśnienie można znaleźć w tym świetnym i szczegółowym poście od Stéphane Chazelas, w którym wyjaśniono również inne sttyfunkcje .

Jeśli chcesz, aby ta zmiana była trwała (i używasz bashzgodnie .bashrcz sugestią zawartą w pytaniu), najlepiej wprowadzić ją zgodnie z uwagami jlmg w komentarzach (dotyczy to wszystkich interaktywnych powłok).


+1 W przeciwieństwie do rozwiązania readline, powinno to działać w przypadku większości, jeśli nie wszystkich rzeczy działających w terminalu.
JoL

1
Prawdopodobnie należy wspomnieć, że nie będzie działać na wszystkich terminalach, jeśli zostanie wstawiony, .bash_profileponieważ plik ten jest analizowany tylko przez powłoki logowania. Powinien zostać wstawiony .bashrc, aby był czytany przez wszystkie interaktywne wywołania.
JoL

1
Czy nie będzie to nadal odzwierciedlać surowego bajtu 0x03, który teoretycznie może być interpretowany przez niektóre terminale? Będzie to miało również skutki uboczne, jeśli wykonasz takie czynności, jak uruchomienie polecenia nie do odczytu, naciśnięcie klawisza strzałki spowoduje przesunięcie kursora na ekranie zamiast pokazywania^[[A
Random832

1
@ Random832 +1 Masz rację. Myślę, że to ustawienie jest po prostu źle nazwane; nie kontroluje echa znaków kontrolnych, ale ich tłumaczenie na znaki drukowalne przed powtórzeniem echa. Aby zapobiec temu efektowi ubocznemu, musiałbyś stty -echorównież. To oczywiście zapobiegnie odbiciu się echa wszystkiego innego, co prawdopodobnie sprawi, że ta odpowiedź nie zadziała, jeśli wszystko, czego chciałeś, to ukryć ^Cliterę.
JoL

1
@jlmg Gdyby ^Czawsze było na końcu, mógłbym się z tobą zgodzić. Ale ^Czostanie wydrukowany tam, gdzie był kursor, co może zastąpić parę znaków w dowolnym miejscu polecenia. Oznacza to, że jeśli musisz skopiować i wkleić części tego polecenia, możesz skończyć z czymś zniekształconym. I ^Cnie jest tak łatwo rozpoznawalny, gdy patrzy się na terminal, jak byłby, gdyby był na końcu polecenia.
kasperd

2

Jeśli próbujesz znaleźć konfigurację, która pozwoli na normalne echo (w tym echoctl) i po prostu wyciszy echo znaków generujących sygnał, i jesteś pewien, że powinno to być możliwe, ponieważ widziałeś, jak działa to w ten sposób przed ...

Prawdopodobnie tak to widziałeś. Ale nie jest to już możliwe z powodu tego zatwierdzenia :

zatwierdzić ec5b1157f8e819c72fc93aa6d2d5117c08cdc961

Włącz echo INTR / QUIT / SUSP w dyscyplinie linii N_TTY (np. Ctrl-C pojawi się jako „^ C”, jeśli ustawione jest stty echoctl, a ctrl-C jako INTR).

Linux wydaje się być jedynym systemem uniksopodobnym (ostatnio sprawdziłem to na Solarisie, BSD i Mac OS X), który nie zachowuje się w ten sposób, i naprawdę brakuje mi tego jako dobrego wizualnego potwierdzenia przerwania programu w konsoli lub xterm. Pamiętam to czule z wielu uniksów, z których korzystałem przez lata. Przeniesienie tego do Linuksa również wydaje się dobrym sposobem na uczynienie go jeszcze bardziej zgodnym ze standardowym zachowaniem podobnym do Uniksa.

Jeśli pamiętasz z czułością, jak Linux tego nie powtarzał ^C, jedynym sposobem na przywrócenie starego zachowania jest łatanie jądra. W najnowszych wersjach echo znaków generujących sygnał znajduje się w wierszach 1215-1218 sterowników / tty / n_tty.c .

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.