•9 min read

Các quy tắc bất thành văn của chương trình Terminal

Các quy tắc bất thành văn của chương trình Terminal

Tôi đã dành vô số giờ trong terminal, và có một điều kỳ lạ cứ lặp đi lặp lại. Mặc dù không có lệnh trung tâm nào hướng dẫn các nhà phát triển cách xây dựng công cụ CLI, nhưng tất cả chúng đều nói cùng một ngôn ngữ. q thoát. Ctrl-C hủy. Màu sắc biến mất khi bạn chuyển đầu ra sang nơi khác.

Đây không phải là ngẫu nhiên. Đây là sự tiến hóa.

Sự nhất quán này đến từ các tiêu chuẩn POSIX, các quy ước Unix cũ và quán tính thuần túy. Khi đủ công cụ đồng ý về một điều gì đó, sự bất đồng sẽ trở thành vấn đề trải nghiệm người dùng. Dưới đây là những mẫu mà tôi đã nhận thấy, những mẫu khiến dòng lệnh trở nên trực quan ngay cả khi bạn đang sử dụng một thứ hoàn toàn mới.

Audio Briefing
0:00 / 0:00
Part of a Series

Loạt Bài Thành Thạo Linux & Terminal Hiện Đại

Part 4 of 4

Mô Tả, Không Quy Định

Những quy tắc này dựa trên quan sát thực tế, không phải tài liệu. Các nỗ lực hiện đại như CLI Guidelines cố gắng chính thức hóa những gì các nhà phát triển đã biết một cách trực giác.

Các Quy Tắc Bất Thành Văn

Quy Tắc 1: Thoát bằng Ctrl-C (Không Tương Tác)

Nếu một chương trình không tương tác, việc nhấn Ctrl-C sẽ chấm dứt nó ngay lập tức thông qua tín hiệu SIGINT. Hãy nghĩ đến ping 127.0.0.1 hoặc curl https://example.com. Bạn nhấn Ctrl-C, chương trình chết, bạn nhận lại dấu nhắc.

Các chương trình tương tác xử lý việc này khác. Các shell, trình soạn thảo văn bản như vim và các công cụ tương tự bắt tín hiệu và sử dụng nó cho mục đích khác. Trong vim, Ctrl-C hủy bỏ bất cứ thứ gì bạn đang gõ. Nó không thoát vì thoát có nghĩa là mất công việc chưa lưu. Đó là một lựa chọn có chủ ý, không phải lỗi.

Quy Tắc 2: 'q' Thoát TUIs

Các giao diện người dùng dựa trên văn bản như less, top, htop, man và vim đều phản hồi phím q để thoát. Hãy thử xem. Mở less /etc/passwd, gõ q, bạn sẽ trở lại shell của mình. Tương tự với top. Tương tự với htop.

Tại sao q mà không phải Ctrl-Q? Có lẽ là thói quen cổ xưa. q nằm ở hàng phím trái, nhanh và dễ nhớ. Quy ước này mạnh đến mức phá vỡ nó giống như một sự xúc phạm cá nhân.

Quy Tắc 3: Ctrl-D Thoát REPLs

Các vòng lặp Read-Eval-Print (REPL) hoạt động khác. Khi bạn đang ở trong Python, REPL của Node hoặc IRB (shell tương tác của Ruby), hãy thử nhấn Ctrl-D trên một dòng trống. REPL sẽ đóng. Tại sao?

Ctrl-D gửi một dấu hiệu EOF, một ký tự End of File. REPLs diễn giải điều này là "người dùng đã hoàn tất việc nhập liệu" và tắt một cách sạch sẽ. Đó là sự chấm dứt duyên dáng, không phải một sự kết thúc bạo lực như Ctrl-C.

Hãy thử nó trong một terminal thực. Gõ python3, đợi dấu nhắc >>> , nhấn Enter, sau đó Ctrl-D. Biến mất. Đó là quy ước.

Hướng Dẫn về Màu Sắc và Hiển Thị

Quy Tắc 4: Giữ 16 Màu

Hầu hết các chương trình terminal hoạt động tốt chỉ sử dụng 16 màu. Đó là những màu mà mọi chủ đề terminal đều hỗ trợ. Chế độ màu thực (24-bit, 16 triệu màu) và 256 màu tồn tại, nhưng chúng có thể xung đột với các lược đồ màu và cài đặt trợ năng của người dùng. Khi nghi ngờ, hãy giữ nguyên tắc bảo thủ.

Quy Tắc 6: Tắt Màu trong Pipes

Điều này đã từng làm tôi bối rối và tôi không bao giờ quên nó. Khi stdout là một terminal, hãy in đầu ra có màu. Khi stdout là một pipe hoặc file, hãy loại bỏ các mã màu. Nếu không, các nhà phát triển chạy yourcommand | grep something và thấy những thứ rác rưởi như \033[31mError\033[0m trong nhật ký của họ.

Phát hiện điều này bằng !isatty(stdout). Mọi ngôn ngữ đều có một cái tương đương: Python có sys.stdout.isatty(), Node có process.stdout.isatty(). Hãy sử dụng nó.

Các Phím Tắt và Quy Ước Nhập Liệu

Quy Tắc 5: Hỗ Trợ Sơ Bộ Các Phím Tắt Readline

Người dùng mang theo những kỳ vọng từ bash. Những điều này nên hoạt động hầu hết:

  • Ctrl-E nhảy đến cuối dòng
  • Ctrl-A nhảy đến đầu dòng
  • Ctrl-W xóa từ cuối cùng

Bạn có cần tương thích hoàn toàn với readline không? Có lẽ là không. Nhưng người dùng sẽ thử Ctrl-A trong công cụ của bạn và mong đợi nó hoạt động. Khi nó không hoạt động, họ sẽ nhận ra.

"Từ cuối cùng" là gì? Đối với hầu hết các chương trình, nó được phân tách bằng dấu cách. Ctrl-W trong bash xóa mọi thứ trở lại dấu cách cuối cùng. Hành vi đó đến từ chế độ cooked trong trình điều khiển terminal của hệ điều hành, vì vậy đó là điều người dùng mong đợi.

Quy Tắc 7: Dấu Gạch Ngang Có Nghĩa là Stdin hoặc Stdout

Điều này làm tôi ngạc nhiên khi lần đầu tiên tôi nhận thấy nó. Nhiều công cụ CLI chấp nhận một dấu gạch ngang duy nhất làm đối số đặc biệt có nghĩa là "đọc từ stdin" hoặc "ghi vào stdout."

Một số ví dụ: cat - đọc từ stdin tar cf - /path |-gzip > file.tar.gz truyền archive đến stdout diff file1 - so sánh file1 với stdin

Đó là một quy ước, không phải là một yêu cầu. Nhưng khi bạn thấy nó, bạn sẽ hiểu ý tác giả.

Quy Tắc 8: Các Thay Thế Hiện Đại Tuân Theo Các Quy Tắc Cũ

Bạn có nhận thấy các bản viết lại Rust hiện đại như bat (cho cat), rg (cho grep), và fd (cho find) tuân thủ nghiêm ngặt các quy tắc bất thành văn này không? Chúng thêm tô sáng cú pháp và tốc độ, nhưng chúng vẫn bỏ màu khi được pipe, vẫn thoát bằng Ctrl-C, và vẫn chấp nhận - cho stdin. Chúng thành công bởi vì chúng tôn trọng những bóng ma của POSIX trong quá khứ.

Advertisement

Tại Sao Điều Này Quan Trọng?

Đây là vấn đề. Những mẫu này không phải là quy tắc mà ai đó đã viết ra và thực thi. Chúng là những quy tắc tự phát. Khi đủ công cụ làm điều gì đó theo một cách, người dùng sẽ học theo cách đó. Các công cụ mới kế thừa cùng một hành vi vì việc chống lại nó sẽ tạo ra ma sát.

Tôi nhớ lần đầu tiên tôi sử dụng một công cụ không phản hồi q để thoát. Đó là một TUI tùy chỉnh để quản lý các container Docker. Tôi nhấn q. Không có gì. Tôi nhấn Ctrl-C. Không có gì. Tôi phải giết nó bằng Ctrl-Z và kill -9. Nó cảm thấy bị hỏng, mặc dù nó có thể hoạt động "đúng cách."

Đó là điểm mấu chốt. Trong terminal, quy ước CHÍNH LÀ sự đúng đắn. Nếu công cụ của bạn chống lại kỳ vọng của người dùng, nó sai, bất kể tài liệu của bạn nói gì.

Dự án CLI Guidelines cố gắng chính thức hóa một số điều này. Nó đáng để đọc. Nhưng thành thật mà nói, cách nhanh nhất để học các quy ước này không phải là đọc. Đó là sử dụng terminal hàng ngày. Các mẫu sẽ thấm vào qua bộ nhớ cơ bắp.

Học Bằng Cách Thực Hành

Cài đặt một công cụ mới? Dành hai phút nhấn q, Ctrl-C, Ctrl-D, và cuộn bằng phím cách. Hầu hết thời gian, bạn sẽ khám phá các quy ước mà không cần chạm vào hướng dẫn sử dụng.

Một Mẫu Đáng Chú Ý

Lần tới khi bạn khám phá một công cụ CLI mới, hãy thử điều này. Quan sát cách nó xử lý các ngắt. Lưu ý xem đầu ra có màu có biến mất khi bạn chuyển nó đi đâu đó không. Quan sát điều gì xảy ra khi bạn nhấn Ctrl-A trong một trường nhập liệu.

Bạn sẽ bắt đầu thấy các mẫu ở khắp mọi nơi. Bởi vì chúng không phải là ngẫu nhiên. Chúng là những quyết định tích lũy qua nhiều thập kỷ, hội tụ về một sự hiểu biết chung về cách terminal nên hoạt động.

Và sự kỳ lạ mà tôi đã đề cập lúc đầu? "Sự hài hòa kỳ lạ" của các lệnh không liên quan hoạt động nhất quán? Nó không hề kỳ lạ chút nào khi bạn nhận ra nó đến từ cùng một nguồn gốc như ngôn ngữ. Quy ước. Lặp lại. Thời gian.

Các công cụ của bạn đang nói cùng một phương ngữ bởi vì tất cả chúng ta đều học nó từ nhau.

Các Bài Viết Liên Quan Về Terminal

Bạn Cũng Có Thể Thích

Share this article:

Stay Updated

Get the latest posts delivered straight to your inbox.

Free Developer Utilities

Free In-Browser Developer Tools

Clean AI CLI logs, build cron expressions, decode JWTs, and calculate chmod permissions offline.

Explore Tools
Advertisement