Xóa ^ C khi CTRL + C


25

Có cách nào để loại bỏ ^Ckhi bạn nhấn CTRL+ Ctrong shell bao gồm Red Hat Enterprise Linux 6 ("Santiago") không? Tôi được phép chỉnh sửa của riêng tôi .bash_profile.


4
thửset echo-control-characters off
Sundeep

1
Tôi đã thử nhưng nó không hoạt động
Fede Gold

Câu trả lời:


29

Chỉnh sửa (hoặc tạo) ~/.inputrctệp của bạn . Thêm một dòng nói

set echo-control-characters Off

Điều này sẽ hướng dẫn thư viện GNU Readline (mà Bash sử dụng) không xuất ra (echo) bất kỳ ký tự điều khiển nào ra màn hình. Cài đặt sẽ hoạt động trong tất cả các phiên Bash mới sau đó (và trong bất kỳ tiện ích nào khác sử dụng thư viện Readline).

Lưu ý rằng nếu hệ thống Unix của bạn đi kèm với tệp cấu hình toàn hệ thống cho thư viện Readline (thường /etc/inputrc), thì tệp cấu hình cá nhân của bạn sẽ cần bao gồm tệp đó:

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

Một cách khác là tạo một bản sao cá nhân của tệp cấu hình toàn hệ thống và sau đó sửa đổi nó.


Xin chào, tôi đã kiểm tra cái này và nó hoạt động tốt nhưng khi tôi làm gián đoạn lệnh bash đang chạy thì nó không hoạt động, ví dụ sleep 180và nhấn CTRL + C
rɑːdʒɑ

@ Ten-Coin Nó sẽ chỉ hoạt động nếu lệnh không may sử dụng thư viện Readline.
Kusalananda

1
Nếu ~/.inputrcchưa tồn tại thì chỉ cần tạo tệp có thể mất một số cài đặt hiện có. Trong trường hợp của tôi, lần đầu tiên tôi nhận thấy rằng ctrl + trái và ctrl + phải đã ngừng hoạt động. Việc khắc phục là bắt đầu ~/.inputrcvới dòng này $include /etc/inputrc. Cũng có thể chỉ cp /etc/inputrc .inputrcvà chỉnh sửa như mong muốn.
kasperd

2
@kasperd Điểm tốt! Tôi không biết rằng việc thêm tệp cấu hình cá nhân sẽ vô hiệu hóa việc đọc tệp cấu hình trên toàn hệ thống (hệ thống của tôi không có tệp này). Tôi sẽ cập nhật câu trả lời của tôi.
Kusalananda

20

Hãy thử như sau:

stty -echoctl

Đối với một lời giải thích xem bài đăng tuyệt vời và chi tiết này từ Stéphane Chazelas cũng giải thích một số sttytính năng khác .

Nếu bạn muốn thực hiện thay đổi đó vĩnh viễn (và bạn đang sử dụng bashnhư ngụ ý trong câu hỏi của bạn) thì tốt nhất bạn nên đưa vào .bashrcghi chú của bạn như jlmg ghi chú trong các nhận xét (vì vậy áp dụng cho tất cả các vỏ tương tác).


+1 Ngược lại với giải pháp đọc, điều này sẽ hoạt động tốt nhất nếu không phải tất cả mọi thứ đang chạy trong thiết bị đầu cuối.
JoL

1
Có lẽ nên đề cập rằng nó sẽ không hoạt động trên tất cả các thiết bị đầu cuối nếu được đặt vào .bash_profilevì tệp đó chỉ được phân tích cú pháp bởi shell đăng nhập. Nó nên được đưa vào .bashrcthay vào đó, vì vậy nó được đọc bởi tất cả các yêu cầu tương tác.
JoL

1
Điều này vẫn không lặp lại byte 0x03 thô, về mặt lý thuyết có thể được giải thích bởi một số thiết bị đầu cuối? Nó cũng sẽ có tác dụng phụ nếu bạn làm những việc như chạy lệnh không đọc, nhấn phím mũi tên sẽ di chuyển con trỏ trên màn hình thay vì hiển thị^[[A
Random832

1
@ Random832 +1 Bạn đúng. Tôi đoán rằng thiết lập chỉ được đặt tên xấu; nó không điều khiển tiếng vang của các ký tự điều khiển mà thay vào đó là bản dịch của chúng sang các ký tự có thể in được trước khi lặp lại. Để ngăn chặn tác dụng phụ đó, bạn cũng phải như stty -echovậy. Điều đó tất nhiên cũng sẽ ngăn chặn tiếng vang của mọi thứ khác, điều này có thể khiến câu trả lời này trở nên vô nghĩa nếu tất cả những gì bạn muốn là che giấu ^Cs.
JoL

1
@jlmg Nếu ^Ccuối cùng tôi luôn đồng ý với bạn. Nhưng ý ^Cchí sẽ được in ở bất cứ nơi nào con trỏ xuất hiện, có thể ghi đè lên một cặp ký tự ở bất cứ đâu trong lệnh. Điều đó có nghĩa là nếu bạn cần sao chép-dán các phần của lệnh đó, bạn có thể kết thúc bằng một thứ gì đó bị sai lệch. Và điều ^Cnày không dễ nhận ra khi nhìn qua thiết bị đầu cuối như nó đã có nếu nó ở cuối lệnh.
kasperd

2

Nếu bạn đang cố gắng tìm một cấu hình cho phép lặp lại bình thường (bao gồm echoctl) và chỉ im lặng tiếng vang của các ký tự tạo tín hiệu, và bạn chắc chắn rằng nó sẽ khả thi vì bạn đã thấy nó hoạt động theo cách đó trước khi ...

Bạn có thể đã nhìn thấy nó theo cách đó. Nhưng nó không còn có thể, vì cam kết này :

cam kết ec5b1157f8e819c72fc93aa6d2d5117c08cdc961

Bật INTR / QUIT / SUSP lặp lại trong kỷ luật dòng N_TTY (ví dụ: ctrl-C sẽ xuất hiện dưới dạng "^ C" nếu stty echoctl được đặt và ctrl-C được đặt là INTR).

Linux dường như là hệ điều hành giống như duy nhất (gần đây tôi đã xác minh điều này trên Solaris, BSD và Mac OS X) không hoạt động theo cách này và tôi thực sự nhớ đây là một xác nhận trực quan tốt về sự gián đoạn của chương trình trong bàn điều khiển hoặc xterm. Tôi nhớ điều này một cách ưu ái từ nhiều Unix mà tôi đã sử dụng trong nhiều năm qua. Mang điều này vào Linux cũng có vẻ là một cách tốt để làm cho nó phù hợp hơn với hành vi giống như tiêu chuẩn.

Nếu bạn nhớ cách Linux sử dụng để không lặp lại điều đó ^C, cách duy nhất để lấy lại hành vi cũ là vá kernel của bạn. Trong các phiên bản gần đây, tiếng vang của các ký tự tạo tín hiệu nằm ở các dòng 1215-1218 của trình điều khiển / tty / n_tty.c .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.