Hapus ^ C saat CTRL + C

25

Apakah ada cara untuk menghapus ^Cketika Anda menekan CTRL+ Cdi shell termasuk dengan Red Hat Enterprise Linux 6 ("Santiago")? Saya memiliki izin untuk mengedit sendiri .bash_profile.

Fede Gold
sumber
4
cobaset echo-control-characters off
Sundeep
1
Saya mencoba tetapi tidak berhasil
Fede Gold

Jawaban:

29

Edit (atau buat) ~/.inputrcfile Anda . Tambahkan kalimat yang mengatakan

set echo-control-characters Off

Ini akan menginstruksikan perpustakaan GNU Readline (yang digunakan Bash) untuk tidak menampilkan (gema) karakter kontrol apa pun ke layar. Pengaturan akan aktif di semua sesi Bash baru sesudahnya (dan pada utilitas lain yang menggunakan pustaka Readline).

Perhatikan bahwa jika sistem Unix Anda dilengkapi dengan file konfigurasi seluruh sistem untuk pustaka Readline (biasanya /etc/inputrc), maka file konfigurasi pribadi Anda harus menyertakan file itu:

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

Alternatif lain adalah membuat salinan pribadi dari file konfigurasi sistem lalu mengubahnya.

Kusalananda
sumber
Hai, saya menguji ini dan itu berfungsi dengan baik tetapi ketika saya mengganggu perintah bash berjalan itu tidak berhasil, misalnya sleep 180dan tekan CTRL + C
r Cdʒɑ
@ Ten-Coin Ini hanya akan berfungsi jika perintah menggunakan pustaka Readline sayangnya.
Kusalananda
1
Jika ~/.inputrcbelum ada maka cukup membuat file mungkin kehilangan beberapa pengaturan yang ada. Dalam kasus saya, saya pertama kali memperhatikan bahwa ctrl + kiri dan ctrl + kanan telah berhenti bekerja. Cara mengatasinya adalah memulai saya ~/.inputrcdengan baris ini $include /etc/inputrc. Dimungkinkan juga untuk cp /etc/inputrc .inputrcmengedit dan mengedit sesuai keinginan.
kasperd
2
@kasperd Poin bagus! Saya tidak sadar bahwa menambahkan file konfigurasi pribadi akan menonaktifkan pembacaan file konfigurasi sistem (sistem saya tidak memilikinya). Saya akan memperbarui jawaban saya.
Kusalananda
20

Coba yang berikut ini:

stty -echoctl

Untuk penjelasan, lihat posting hebat dan terperinci ini dari Stéphane Chazelas yang juga menjelaskan beberapa sttyfitur lainnya .

Jika Anda ingin menjadikan perubahan itu permanen (dan Anda menggunakan bashsebagaimana tersirat dalam pertanyaan Anda) maka yang terbaik adalah memasukkannya ke Anda .bashrcsebagaimana dicatat oleh jlmg di komentar (jadi itu berlaku untuk semua shell interaktif).

phk
sumber
+1 Berbeda dengan solusi readline, ini seharusnya bekerja paling baik jika tidak semua hal berjalan di terminal.
JoL
1
Orang mungkin harus menyebutkan bahwa itu tidak akan berfungsi pada semua terminal jika dimasukkan .bash_profilesebagai file yang hanya diuraikan oleh shell login. Itu harus dimasukkan .bashrcsebagai gantinya, jadi itu dibaca oleh semua doa interaktif.
JoL
1
Bukankah ini masih mengulangi byte 0x03 mentah, yang secara teoritis dapat ditafsirkan oleh beberapa terminal? Ini juga akan memiliki efek samping jika Anda melakukan hal-hal seperti menjalankan perintah non-readline, menekan tombol panah akan memindahkan kursor pada layar daripada menunjukkan^[[A
Random832
1
@ Random832 +1 Anda benar. Saya kira pengaturan itu hanya diberi nama buruk; itu tidak mengontrol gema karakter kontrol melainkan terjemahannya ke karakter yang dapat dicetak sebelum menggema. Untuk mencegah efek samping itu, Anda harus melakukannya stty -echojuga. Itu tentu saja akan mencegah gema dari semua yang lain juga, yang mungkin membuat jawaban ini tidak-pergi jika semua yang Anda inginkan adalah menyembunyikan huruf ^Cs.
JoL
1
@ jlmg Jika ^Cselalu di akhir saya mungkin setuju dengan Anda. Tetapi ^Cakan dicetak di mana pun kursor berada, yang dapat menimpa sepasang karakter di mana saja dalam perintah. Itu berarti jika Anda perlu menyalin-tempel bagian dari perintah itu, Anda mungkin berakhir dengan sesuatu yang rusak. Dan ^Citu tidak mudah dikenali ketika melihat ke terminal seperti seharusnya jika itu di akhir perintah.
kasperd
2

Jika Anda mencoba menemukan konfigurasi yang memungkinkan gema normal (termasuk echoctl) dan hanya membungkam gema karakter penghasil sinyal, dan Anda yakin itu mungkin terjadi karena Anda pernah melihatnya berfungsi seperti itu sebelumnya ...

Anda mungkin melihatnya seperti itu. Tapi itu tidak mungkin lagi, karena komitmen ini :

komit ec5b1157f8e819c72fc93aa6d2d5117c08cdc961

Nyalakan INTR / QUIT / SUSP yang bergema di garis disiplin N_TTY (mis. Ctrl-C akan muncul sebagai "^ C" jika stty echoctl diatur dan ctrl-C ditetapkan sebagai INTR).

Linux tampaknya menjadi satu-satunya OS yang mirip unix (baru-baru ini saya telah memverifikasi ini pada Solaris, BSD, dan Mac OS X) yang tidak berperilaku seperti ini, dan saya sangat merindukan ini sebagai konfirmasi visual yang baik dari gangguan suatu program di konsol atau xterm. Saya ingat ini sayang dari banyak Unix yang saya gunakan selama bertahun-tahun juga. Membawa ini ke Linux juga sepertinya cara yang baik untuk membuatnya lebih sesuai dengan perilaku standar unix-like.

Jika Anda ingat bagaimana Linux dulu tidak menggemakannya ^C, satu-satunya cara untuk mengembalikan perilaku lama adalah dengan menambal kernel Anda. Dalam versi terbaru, gema karakter penghasil sinyal ada di baris 1215-1218 driver / tty / n_tty.c .


sumber