Là CTRL + C không chính xác để sử dụng để trở về dòng lệnh?


27

Khi tôi đang sử dụng tail -fvà tôi muốn trở lại vỏ, tôi luôn sử dụng CTRL+C. Hoặc khi tôi đang gõ một lệnh và cảm thấy muốn hủy bỏ nó và bắt đầu lại, tôi chỉ đơn giản là CTRL+Cquay lại dấu nhắc dòng lệnh trống. Đây có được coi là thực hành xấu? Đôi khi tôi cảm thấy có thể có một cách tốt hơn để tách khỏi một cái gì đó, nhưng thực sự không có ý tưởng.


6
Để hủy lệnh shell được nhập một phần, bạn có thể sử dụng Control-U hoặc Delete (tùy thuộc vào cài đặt tty và các ràng buộc chính của bạn), nhưng không có gì sai khi sử dụng Control-C.
Keith Thompson

@KeithThndry cảm ơn vì Ctrl + U, tôi không biết về điều đó :-)
Patrick

Đối với bản ghi, Cu không thực sự hủy lệnh đã nhập, nó chuyển nó sang bộ đệm dán (tương tự như chức năng "cắt" của một số chương trình).
Chris Xuống

Câu trả lời:


36

Ctrl+ Cgửi SIGINT cho chương trình. Điều này cho biết chương trình mà bạn muốn làm gián đoạn (và kết thúc) quá trình đó. Hầu hết các chương trình nắm bắt chính xác điều này và thoát sạch. Vì vậy, vâng, đây là một cách "chính xác" để kết thúc hầu hết các chương trình.

Có các phím tắt khác để gửi tín hiệu khác đến các chương trình, nhưng đây là cách phổ biến nhất.


9
Ngoài ra còn có Ctrl + D cho các chương trình đang đọc đầu vào từ người dùng. Ctrl + D đóng STDIN vào chương trình. Để thoát khỏi vỏ một cách duyên dáng, điều này cũng có sẵn (chính xác giống như gõ thoát).
Patrick

2
@Patrick Ctrl + D thực sự gửi một chỉ báo Kết thúc tệp cho luồng. Tùy thuộc vào chương trình để đáp ứng một cách thích hợp (thường đóng luồng tệp).
Chris S

đó là những gì đóng STDIN làm. Bạn không thể lấy EOF mà không đóng đường ống / luồng.
Patrick

9
Sai về ba tội danh, Patrick. Đầu tiên: Control + D không có ý nghĩa này đối với đường ống. Thứ hai: nhân vật đặc biệt EOF không đóng bất cứ thứ gì. Nó gây ra trả về một lần byte bằng 0 (giả sử rằng bộ đệm dòng trống) từ read()lệnh gọi hệ thống hiện tại . Các read()s tiếp theo không bị ảnh hưởng. Thứ ba: Không có điều nào trong số này áp dụng cho các chương trình đưa kỷ luật dòng vào chế độ không chính tắc, như hầu hết các chương trình shell từ vài thập kỷ trước và thực sự là bất kỳ chương trình nào sử dụng thư viện như GNU readline.
JdeBP

13

Phương pháp này là tốt, thực sự.


11

Để hủy bỏ một lệnh dài trong khi gõ, đôi khi tôi nhảy đến đầu dòng và chèn một dấu hiệu nhận xét, trước khi nhấn enter:

Home#Enter

Pos1#Return

Điều này rất hữu ích, nếu tôi gõ một lệnh sao chép với một đường dẫn dài, ví dụ, và trong khi quan sát, trước tiên tôi cần tạo thư mục, nhưng muốn lặp lại lệnh sau đó. Sau đó, tôi chỉ cần lấy nó từ lịch sử, xóa hàm băm và nhập nó.

Trong Bash, bạn có thể sử dụng phím tắt

Alt+#

để nhận xét lệnh của bạn, như được chỉ ra trong các nhận xét (Cảm ơn, @Zorawar).


6
Bạn cũng có thể sử dụng Ctrl-Amà không cần lấy ngón tay ra khỏi hàng nhà.
Dietrich Epp

1
Ctrl-E đi đến cuối cùng.
Dave

@Dave: Điều đó đúng, nhưng bạn không cần phải di chuyển đến cuối để nhấn enter, để xác nhận lệnh của bạn. Dòng lệnh không phải là trình soạn thảo, trong đó điều này có thể chèn một dòng mới.
người dùng không xác định

2
Trong bash bạn có thể đạt được điều tương tự bằng cách chỉ cần nhấn Alt-#: nó sẽ đưa bình luận vào và chạy lệnh (vì vậy hãy đưa nó vào lịch sử của bạn).
Zorawar

8

Nói chung, sử dụng Ctrl+ Clà tốt khi chương trình cung cấp cho bạn không có cách tương tác để chấm dứt (theo thiết kế, hoặc, thường xuyên hơn, vì nó đã bị đóng băng hoặc trở nên không sử dụng được). Hãy nhớ rằng, khi ở chế độ tương tác, tổ hợp phím bạn thực sự muốn có thể là Ctrl+ D, sẽ gửi một EOF, báo hiệu kết thúc đầu vào.


1

Nếu sử dụng Bash, người ta cũng có thể sử dụng Ctrl- Zvà gõ bgđể "đặt công việc hiện tại ở chế độ nền".


0

Như @Patrick đã nói trong phần bình luận về câu trả lời được chấp nhận,

Ngoài ra còn có Ctrl+Dcác chương trình đọc đầu vào từ người dùng. Ctrl+Dđóng STDIN vào chương trình.

Điều này giúp tôi khi Ctrl+Ckhông hoạt động để lấy lại dòng lệnh sau khi sử dụng>>

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.