CTRL + 4 (và CTRL + \) làm gì trong bash?


22

Tôi chỉ tình cờ phát hiện ra rằng CTRL+ 4 đóng các chương trình đọc stdinđầu vào từ dòng lệnh.

Đây là giao diện khi tôi nhập CTRL+ 4hoặc CTRL+ / vào chương trình đọcstdin

$ cat
wefwef
wefwef
^\Quit
$ bc
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'. 
^\Quit
$

Tôi được ^\Quithiển thị và sau đó chương trình đóng cửa. Sự khác biệt của điều này so với việc sử dụng ^Choặc là ^Dgì? Không gì ^\Quitlàm gì?

Chỉnh sửa : Phát hiện ra rằng CTRL+ \làm điều tương tự.

Câu trả lời:


37

Ctrl + 4 gửi ^ \

Thiết bị đầu cuối gửi ký tự (hoặc chính xác hơn là byte), không phải khóa. Khi một phím đại diện cho một ký tự có thể in được nhấn, thiết bị đầu cuối sẽ gửi ký tự đó đến ứng dụng. Hầu hết các phím chức năng được mã hóa dưới dạng các chuỗi thoát: chuỗi các ký tự bắt đầu bằng số ký tự 27. Một số phím có dạng Ctrl+ charactervà một vài phím chức năng, được gửi dưới dạng ký tự điều khiển - trong bộ ký tự ASCII , tất cả các máy tính hiện đại sử dụng làm cơ sở (Unicode, ISO Latin- n, v.v. là tất cả các supersets của ASCII), 33 ký tự là các ký tự điều khiển: ký tự số 0 đến 31 và 127. Các ký tự điều khiển không thể in được, nhưng dự định có hiệu lực trong các ứng dụng; ví dụ ký tự 10, là Control-J (thường được viết ^ J), là một ký tự dòng mới, vì vậy khi một thiết bị đầu cuối hiển thị ký tự đó, nó sẽ di chuyển con trỏ đến dòng tiếp theo, thay vì hiển thị glyph. Bản thân ký tự thoát là ký tự điều khiển, ^ [(giá trị 27).

Không có đủ ký tự điều khiển để bao gồm tất cả Ctrl+ charactermóc khóa. Chỉ các chữ cái và các ký tự @[\]^_?có một ký tự điều khiển tương ứng. Khi bạn nhấn Ctrl+ 4hoặc Ctrl+ $(mà tôi đoán là Ctrl+ Shift+ 4), thiết bị đầu cuối phải chọn thứ gì đó để gửi. Tùy thuộc vào thiết bị đầu cuối và cấu hình của nó, có một số khả năng phổ biến:

  • Thiết bị đầu cuối bỏ qua công cụ Ctrlsửa đổi và gửi ký tự 4hoặc $.
  • Thiết bị đầu cuối gửi một chuỗi thoát mã hóa chính xác khóa và sửa đổi đã được nhấn.
  • Thiết bị đầu cuối gửi một số nhân vật điều khiển khác.

Nhiều thiết bị đầu cuối gửi ký tự điều khiển cho một số phím trong hàng chữ số:

  • Ctrl+ 2→ ^ @
  • Ctrl+ 3→ ^ [
  • Ctrl+ 4→ ^ \
  • Ctrl+ 5→ ^]
  • Ctrl+ 6→ ^^
  • Ctrl+ 7→ ^ _
  • Ctrl+ 8→ ^?

Tôi không biết hội nghị đặc biệt này phát sinh ở đâu.

Ctrl+ |gửi cùng một ký tự vì đó là Ctrl+ Shift+ \và thiết bị đầu cuối sẽ gửi ^ \ cho dù phím shift có được nhấn hay không.

^ \ thoát

Bản thân thiết bị đầu cuối (chính xác hơn là hỗ trợ thiết bị đầu cuối chung trong kernel) diễn giải một vài ký tự điều khiển đặc biệt. Giải thích này có thể được cấu hình để ánh xạ các ký tự khác nhau hoặc tắt bởi các ứng dụng muốn tự xử lý các ký tự. Một cách giải thích nổi tiếng như vậy là ^ M, ký tự được gửi bởi Returnkhóa, sẽ gửi dòng hiện tại đến ứng dụng, nếu thiết bị đầu cuối ở chế độ nấu , trong đó các ứng dụng nhận dòng đầu vào theo dòng.

Một vài ký tự gửi tín hiệu đến ứng dụng ở phía trước. ^ C gửi tín hiệu ngắt (SIGINT), thông thường sẽ báo cho ứng dụng dừng những gì nó đang làm và đọc lệnh tiếp theo của người dùng. Các ứng dụng không tương tác thường thoát. ^ \ gửi tín hiệu thoát (SIGQUIT), thông thường sẽ cho ứng dụng thoát ra càng sớm càng tốt mà không lưu bất cứ thứ gì; nhiều ứng dụng không ghi đè hành vi mặc định, đó là giết ứng dụng ngay lập tức¹. Vì vậy, khi bạn nhấn Ctrl+ 4(hoặc bất cứ thứ gì gửi ký tự ^ \) cathoặc bc, không cái nào ghi đè hành vi mặc định, ứng dụng sẽ bị hủy.

Thiết bị đầu cuối tự in ^\một phần của thông báo: đó là mô tả trực quan về ký tự mà bạn đã nhập và thiết bị đầu cuối ở chế độ nấu và bật tiếng vang (các ký tự được hiển thị bởi thiết bị đầu cuối ngay khi bạn nhập chúng, trái ngược với chế độ không tiếng vang trong đó các ký tự chỉ được gửi đến ứng dụng, có thể chọn hoặc không hiển thị chúng). Phần Quitxuất phát từ bash: nó thông báo rằng quá trình con của nó đã chết do tín hiệu bỏ và đó là cách để bạn biết.

Shell xử lý tất cả các tín hiệu phổ biến, do đó, nếu bạn nhập ^ \ trong một shell, bạn không giết phiên của mình, bạn chỉ cần nhận được một dấu nhắc mới, giống như ^ C.

Bạn có thể chơi với các thiết lập đầu cuối bằng sttylệnh.

¹ Và theo truyền thống tạo ra một bãi chứa lõi , nhưng nhiều hệ thống vô hiệu hóa theo mặc định rằng hiện nay.


SIGINT giết chết nhóm quy trình tiền cảnh và SIGQUIT giết chết nó với một bãi chứa lõi. Cả hai tín hiệu có thể được xử lý. Tôi không chắc ý của bạn là gì khi đọc lệnh tiếp theo . Các hệ thống không vô hiệu hóa các bãi chứa lõi khác ngoài việc đặt giới hạn coredumpsize ban đầu thành 0 (không phải là cứng, bạn thường tự do nâng nó lên).
Stéphane Chazelas

@ StéphaneChazelas Trong một chương trình thực hiện các tương tác của người dùng, ngữ nghĩa thông thường của SIGINT là hủy lệnh người dùng hiện tại và cho phép người dùng tương tác với chương trình, tức là quay lại vòng lặp lệnh chính. Mặt khác, tôi không nhớ đã xem một chương trình mà SIGQUIT không thoát (chặn các lỗi trong trình xử lý tín hiệu). Thật vậy, cách nhiều hệ thống vô hiệu hóa các kết xuất lõi theo mặc định là đặt giới hạn mềm kích thước kết xuất lõi thành 0, để người dùng tự do thay đổi cài đặt mặc định này nếu muốn.
Gilles 'SO- ngừng trở nên xấu xa'

Đó là ngoại lệ. SIGINT giết chết nhiệm vụ hiện đang chạy. Chỉ có một vài ứng dụng sẽ mở rộng điều đó để giết nhiệm vụ "tiền cảnh" của chính họ. Bạn phải nghĩ về lesshoặc vim. Lưu ý rằng cmd | less, CTRL-Cthường giết cmd(trong khi lessnó được xử lý để hủy hành động hiện tại (như tìm kiếm)) (tiếp theo)
Stéphane Chazelas

Tôi thấy từ ngữ của câu trả lời của bạn khó hiểu về vấn đề đó. Thực tế là SIGQUIT thường không được xử lý là nó không được sử dụng theo cùng một cách. Bạn nhấn CTRL-C để hủy bỏ những gì bạn đang làm. Bạn chỉ thỉnh thoảng sử dụng `CTRL- \` để gỡ lỗi để tạo kết xuất lõi. Nói chung không có lý do tại sao một ứng dụng muốn cản trở bạn làm điều đó.
Stéphane Chazelas

@ StéphaneChazelas Không chỉ ít hơn và vim, hầu hết các ứng dụng dựa trên thiết bị đầu cuối đọc lệnh của người dùng đến đó. Ví dụ REPL (bash, dash, ksh, zsh, python, irb, fsharpi, Mathicala, khắc). Nó hầu như không phổ biến. Đối tượng nhận xét đầu tiên của bạn để vẽ SIGINT và SIGQUIT quá khác biệt và các đối tượng nhận xét mới nhất của bạn để vẽ SIGINT và SIGQUIT quá giống nhau, khiến tôi bối rối như những gì bạn đang lái xe.
Gilles 'SO- ngừng trở nên xấu xa'

7

Ngoài câu trả lời của Gilles, hãy để tôi thêm, rằng bạn luôn có thể nhập các ký tự không in được trong bash bằng Ctrl-v+ key( Ctrl-v+ Ctrl+4trong trường hợp này) và kiểm tra mã ký tự bằng

$ printf '^\' | od -An -tu    # input ^\ as C-v C-4
28

bạn nhận được mã thập phân của ký tự, như bạn có thể kiểm tra man asciitương ứng với dấu phân cách tệp (FS) .


Vậy ctrl + v làm gì? Tôi đã quen với việc đó là "dán clipboard".
JDługosz

2
@ JDługosz: Ctrl-V nói với thiết bị đầu cuối không giải thích ký tự sau. Một sự thật đáng tiếc là các tổ hợp phím GUI đã chiếm các ký tự điều khiển đó, gây ra sự nhầm lẫn không cần thiết. Trước đây, Linux đã sử dụng Alt- [Key] cho các phím GUI (ví dụ Alt-C / Alt / V để sao chép / dán), nhưng sau đó mọi người rõ ràng nghĩ làm giống như Windows là quan trọng hơn; Trong khi đó, người dùng Mac vẫn không gặp vấn đề gì khi sử dụng phím Command thay vì phím Ctrl cho các thao tác đó.
celtschk

Lệnh (ngắn hơn) là : printf '%d\n' '"^\'?
Isaac
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.