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.
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ź.
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 :
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 .
set echo-control-characters off
Odpowiedzi:
Edytuj (lub utwórz) swój
~/.inputrc
plik. Dodaj wiersz z napisemPoinstruuje 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:Inną alternatywą jest utworzenie osobistej kopii ogólnosystemowego pliku konfiguracyjnego, a następnie zmodyfikowanie go.
źródło
sleep 180
i~/.inputrc
nie 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~/.inputrc
od tej linii$include /etc/inputrc
. Możliwe jest również justowaniecp /etc/inputrc .inputrc
i edycja według potrzeb.Spróbuj wykonać następujące czynności:
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
stty
funkcje .Jeśli chcesz, aby ta zmiana była trwała (i używasz
bash
zgodnie.bashrc
z sugestią zawartą w pytaniu), najlepiej wprowadzić ją zgodnie z uwagami jlmg w komentarzach (dotyczy to wszystkich interaktywnych powłok).źródło
.bash_profile
ponieważ plik ten jest analizowany tylko przez powłoki logowania. Powinien zostać wstawiony.bashrc
, aby był czytany przez wszystkie interaktywne wywołania.^[[A
stty -echo
ró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ć^C
literę.^C
zawsze było na końcu, mógłbym się z tobą zgodzić. Ale^C
zostanie 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^C
nie jest tak łatwo rozpoznawalny, gdy patrzy się na terminal, jak byłby, gdyby był na końcu polecenia.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 :
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 .źródło