
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.
Strip ANSI colors, prompts, spinners & code fences from copied logs
Sanitize copied terminal logs, AI agent CLI outputs, and shell commands. Strip ANSI color codes, $ prompts, code fences, line numbers, and spinners.
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.
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.
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.
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ầ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ủ.
Đ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ó.
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òngCtrl-A nhảy đến đầu dòngCtrl-W xóa từ cuối cùngBạ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ả.
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ứ.
Đâ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.
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.
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.
Một nhà phát triển đang xây dựng một công cụ dòng lệnh tương tác mới cho phép người dùng duyệt các tệp log. Họ đang tranh luận về cách xử lý việc chấm dứt chương trình. Cách tiếp cận nào sau đây phù hợp nhất với các quy ước terminal đã được thiết lập cho các công cụ tương tác và trải nghiệm người dùng?
Làm sạch log AI CLI, tạo biểu thức cron, giải mã JWT và tính quyền chmod offline.

Một thiết lập terminal tối giản nhưng hiệu quả: Starship prompt, zsh-autosuggestions, tô sáng cú pháp và bài học xương máu về hố thỏ dotfile.
Đọc tiếp
Lần đầu tiên terminal của tôi bị treo giữa pipeline, tôi đã mất một giờ để gỡ lỗi sai vấn đề. Đây là những gì thực sự đã xảy ra và cách khắc phục nó trong vài giây.
Đọc tiếp
Hướng dẫn từng bước để thêm các thư mục vào PATH vĩnh viễn trong Linux & macOS. Chỉnh sửa .bashrc, .zshrc, lệnh export và khắc phục lỗi không tìm thấy lệnh.
Đọc tiếp