Trên các hệ thống POSIX (ví dụ Linux, MacOSX), ít nhất là đối với các chương trình có thể bắt đầu trong thiết bị đầu cuối shell (ví dụ: hầu hết trong số chúng), tôi khuyên bạn nên sử dụng các quy ước mã hóa GNU (cũng liệt kê các tên đối số phổ biến) và xem xét các hướng dẫn về tiện ích POSIX , ngay cả đối với phần mềm độc quyền:
luôn luôn xử lý --version
và--help
(thậm chí /bin/true
chấp nhận chúng !!). Tôi nguyền rủa các tác giả của phần mềm không hiểu --help
, tôi ghét họ (vì đó prog --help
là lệnh đầu tiên tôi đang thử trên một chương trình mới)! Thường --help
có thể được viết tắt là-h
Có --help
thông báo liệt kê tất cả các tùy chọn (trừ khi bạn có quá nhiều trong số chúng ... trong trường hợp đó liệt kê các tùy chọn phổ biến nhất và tham chiếu rõ ràng đến một số man
trang hoặc một số URL) và các giá trị mặc định của các tùy chọn, và có lẽ quan trọng (và cụ thể theo chương trình ) biến môi trường. Hiển thị các danh sách tùy chọn về lỗi đối số tùy chọn.
chấp nhận -a
đối số ngắn (đơn thư) và có một số tương đương --long-argument
, vì vậy -a2
--long-argument=2
, --long-argument 2
; tất nhiên bạn có thể có (cho các tùy chọn hiếm khi được sử dụng) một số --only-long-argument
tên; đối với các đối số phương thức mà không có tùy chọn bổ sung -cf
thường được xử lý như -c -f
, v.v. vì vậy -argument:value
đề xuất của bạn là lạ và tôi không khuyên bạn nên làm điều đó.
sử dụng GLIBC getopt_long hoặc tốt hơn (ví dụ: argp_parse , trong Arg
mô-đun OCaml , ...)
thường sử dụng -
cho đầu vào hoặc đầu ra tiêu chuẩn (nếu bạn không thể làm điều đó, xử lý /dev/stdin
& /dev/stdout
thậm chí trên một số hệ điều hành không có chúng)
bắt chước hành vi của các chương trình tương tự bằng cách sử dụng lại hầu hết các quy ước tùy chọn của chúng; đặc biệt -n
cho chạy khô (à la make
), -h
để được giúp đỡ, -v
cho sự dài dòng, v.v ...
sử dụng --
như dấu phân cách giữa các tùy chọn & tệp hoặc các đối số khác
nếu chương trình của bạn sử dụng isatty
để kiểm tra hơn stdin là thiết bị đầu cuối (và hoạt động "tương tác" trong trường hợp đó), hãy cung cấp tùy chọn để buộc chế độ không tương tác, tương tự nếu chương trình của bạn có giao diện GUI (và kiểm tra getenv("DISPLAY")
trên máy tính để bàn X11) nhưng cũng có thể được sử dụng trong lô hoặc dòng lệnh.
Một số chương trình (ví dụ gcc
) chấp nhận danh sách đối số gián tiếp, @somefile.txt
có nghĩa là đọc các đối số chương trình từ somefile.txt
; điều này có thể hữu ích khi chương trình của bạn có thể chấp nhận rất nhiều đối số (nhiều hơn so với kernel của bạn ARG_MAX
)
BTW, bạn thậm chí có thể thêm một số tiện ích tự động hoàn thành cho chương trình của mình và các shell thông thường (như bash
hoặc zsh
)
Một số lệnh Unix cũ (ví dụ dd
, hoặc thậm chí sed
) có các đối số lệnh lạ để tương thích lịch sử. Tôi khuyên bạn không nên theo thói quen xấu của họ (trừ khi bạn đang thực hiện một số biến thể tốt hơn của họ).
Nếu phần mềm của bạn là một loạt các chương trình dòng lệnh có liên quan, lấy cảm hứng từ git (mà bạn chắc chắn sử dụng như một công cụ phát triển), mà chấp nhận git help
và git --help
và có nhiều git
subcommand
vàgit
subcommand
--help
Trong những trường hợp hiếm hoi, bạn cũng có thể sử dụng argv[0]
(bằng cách sử dụng liên kết tượng trưng trên chương trình của mình), ví dụ như bash
được gọi là rbash
có hành vi khác ( vỏ bị hạn chế ). Nhưng tôi thường không khuyên bạn nên làm điều đó; nó có thể có ý nghĩa nếu chương trình của bạn có thể được sử dụng như một trình thông dịch kịch bản bằng cách sử dụng shebang tức là #!
trên dòng đầu tiên được thực hiện bởi execve (2) . Nếu bạn làm những thủ thuật như vậy, hãy chắc chắn ghi lại chúng, kể cả trong --help
tin nhắn.
Hãy nhớ rằng trên POSIX các vỏ được globbing đối số ( trước khi chạy chương trình của bạn!), Do đó tránh đòi hỏi nhân vật (như *
hay $
hay ~
) trong các tùy chọn mà sẽ cần phải được vỏ thoát.
Trong một số trường hợp, bạn có thể nhúng trình thông dịch như GNU guile hoặc Lua vào phần mềm của bạn (tránh phát minh ngôn ngữ kịch bản hoàn chỉnh Turing của riêng bạn nếu bạn không phải là chuyên gia về ngôn ngữ lập trình). Điều này có hậu quả sâu sắc đối với việc thiết kế phần mềm của bạn (vì vậy nên nghĩ đến sớm!). Sau đó, bạn có thể dễ dàng chuyển một số tập lệnh hoặc một số biểu thức cho trình thông dịch đó. Nếu bạn thực hiện phương pháp thú vị đó, hãy cẩn thận thiết kế phần mềm và phần mềm được giải thích; bạn có thể có một số người dùng kỳ lạ mã hóa các tập lệnh lớn cho việc của bạn.
Trong các trường hợp khác, bạn có thể muốn cho phép người dùng nâng cao của mình tải plugin của họ vào phần mềm của bạn (sử dụng các kỹ thuật tải động à la dlopen
& dlsym
). Một lần nữa, đây là một quyết định thiết kế rất quan trọng (vì vậy hãy xác định và ghi lại giao diện plugin một cách cẩn thận) và bạn sẽ cần xác định một quy ước để chuyển các tùy chọn chương trình cho các plugin này.
Nếu phần mềm của bạn là một thứ phức tạp, hãy làm cho nó chấp nhận một số tệp cấu hình (ngoài hoặc thay thế các đối số chương trình) và có thể có một số cách để kiểm tra (hoặc chỉ phân tích) các tệp cấu hình này mà không chạy tất cả mã. Ví dụ, một tác nhân chuyển thư (như Exim hoặc Postfix) khá phức tạp và rất hữu ích khi có thể "làm khô" nó (ví dụ: quan sát cách xử lý một số địa chỉ email đã cho mà không thực sự gửi email).
Lưu ý rằng đó /option
là một điều Windows hoặc VMS. Nó sẽ là điên rồ trên các hệ thống POSIX (vì hệ thống phân cấp tệp sử dụng /
như một bộ tách thư mục và vì shell thực hiện việc tạo khối). Tất cả câu trả lời của tôi chủ yếu dành cho Linux (và POSIX).
PS Nếu có thể, hãy biến chương trình của bạn thành một phần mềm miễn phí , bạn sẽ nhận được những cải tiến từ một số người dùng và nhà phát triển (và thêm tùy chọn chương trình mới thường là một trong những điều dễ nhất để thêm vào phần mềm miễn phí hiện có). Ngoài ra, câu hỏi của bạn phụ thuộc rất nhiều vào đối tượng dự định : trò chơi dành cho thanh thiếu niên hoặc trình duyệt dành cho bà có lẽ không cần cùng loại và số lượng tùy chọn so với trình biên dịch hoặc trình kiểm tra mạng cho sysadins của trung tâm dữ liệu hoặc phần mềm CAD cho bộ vi xử lý kiến trúc sư hoặc cho các nhà thiết kế cầu. Một kỹ sư quen thuộc với lập trình & viết kịch bản có thể thích nhiều tùy chọn có thể điều chỉnh hơn so với bà của bạn và có thể muốn chạy ứng dụng của bạn mà không cần X11 (có thể trong một crontab
công việc).
ls -ltr
để kết hợp các tùy chọn-l
,-t
và-r
. Các chương trình kiểu GNU cũng thường cho phép các tùy chọn dựa trên từ có dấu gạch nối kép như--reverse
thay vì-r
. Có những quy ước phổ biến khác như-h
thể hiện sự giúp đỡ,--
để báo hiệu sự kết thúc của các tùy chọn, chỉ định-
làm tên tệp để cho phép đọc từ stdin, v.v.