Làm thế nào để báo hiệu kết thúc đầu vào stdin


82
  1. Trong Bash, tôi đã học được rằng tín hiệu kết thúc có thể được thay đổi bằng tài liệu ở đây. Nhưng theo mặc định, làm thế nào tôi có thể báo hiệu kết thúc đầu vào stdin?
  2. Tôi tình cờ thấy rằng với cat và chardet, đầu vào stdin của chúng có thể được báo hiệu là đã hoàn thành bởi Ctrl + d. Nhưng tôi dường như nhớ rằng Ctrl + d và Ctrl + c tương tự như kết thúc thực thi lệnh đang chạy. Vậy tôi có sai không?

Câu trả lời:


114

Ctrl+D, khi được gõ ở đầu một dòng trên thiết bị đầu cuối, biểu thị sự kết thúc của đầu vào. Đây không phải là một tín hiệu theo nghĩa unix: khi một ứng dụng đang đọc từ thiết bị đầu cuối và người dùng nhấn Ctrl+D, ứng dụng được thông báo rằng đã kết thúc tập tin (giống như khi nó đang đọc từ một tập tin và đã vượt qua byte cuối cùng).

Ctrl+Ckhông gửi tín hiệu, SIGINT . Theo mặc định SIGINT (tín hiệu ngắt) giết chết ứng dụng nền trước, nhưng ứng dụng có thể bắt tín hiệu và phản ứng theo một cách khác (ví dụ, chính vỏ bắt tín hiệu và hủy bỏ dòng bạn đã bắt đầu nhập, nhưng nó không ' Khi thoát ra, nó hiển thị một dấu nhắc mới và chờ một dòng lệnh mới).

Bạn có thể thay đổi các ký tự được liên kết với tệp cuối và SIGINT bằng sttylệnh, ví dụ: stty eof asẽ tạo aký tự cuối tệp và stty intr ^-sẽ vô hiệu hóa ký tự SIGINT. Điều này hiếm khi hữu ích.


Cảm ơn! Có Ctrl+Dnghĩa là Ctrl và viết hoa D hoặc nó không quan trọng?
Tim

5
@Tim: đó là chữ thường mà bạn muốn ... quy ước viết lệnh bàn phím bằng chữ hoa xuất hiện vì các nhãn trên bàn phím luôn ở dạng chữ hoa và điều được mô tả là TỪ KHÓA không phải là mã ký tự thực tế mà chương trình nhìn thấy. Có điều này đôi khi khó hiểu.
Caleb

@Caleb: Cảm ơn! Làm thế nào để xác định rằng chìa khóa là vốn? Hoặc có bao giờ trường hợp như vậy?
Tim

@Tim Trên một thiết bị đầu cuối, các tổ hợp phím Ctrl+Shift+DCtrl+Dgửi cùng một ký tự (ký tự số 4, thường được gọi Ctrl+D).
Gilles

2
@Tim Thiết bị đầu cuối nhận được Ctrl + D. Nó không gửi một nhân vật cho chương trình. Điều gì xảy ra là khi chương trình đọc từ thiết bị đầu cuối, thiết bị đầu cuối nói với nó, đây là phần cuối của tập tin, giống như khi chương trình cố đọc sau khi kết thúc tệp đĩa. Vỏ không liên quan gì cả.
Gilles

23

Điểm thứ hai của bạn gộp hai thứ hoàn toàn khác nhau lại với nhau.

  • Ctrl + C gửi tín hiệu tiêu diệt đến quá trình đang chạy.
  • Ctrl + D gửi một ký tự kết thúc truyền .

Bạn đang tìm kiếm cái sau.


7
Có khả năng gây nhầm lẫn ở đây: từ góc độ ứng dụng, không có bất kỳ ký tự thực tế nào được gửi cho ^ D. Điều đó có nghĩa là ứng dụng không nhận được ký tự đó từ tòa nhà read(2).
ulidtko
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.