Kiểu tùy chọn dòng lệnh - POSIX hay gì?


16

Ở đâu đó tôi đã thấy một cơn thịnh nộ chống lại java / javac bị cáo buộc sử dụng kết hợp phong cách Windows và Unix như

java -classpath ... -ea ... Something

IMHO, nó không phải là hỗn hợp, nó cũng giống như findhoạt động, phải không? AFAIK, theo POSIX, cú pháp phải giống như

java --classpath ... --ea ... Something

-abcdefcó nghĩa là chỉ định 6 tùy chọn ngắn cùng một lúc. Tôi tự hỏi phiên bản nào dẫn đến nói chung để ít gõ và ít lỗi hơn.

Tôi đang viết một tiện ích nhỏ bằng Java và trong mọi trường hợp tôi sẽ sử dụng kiểu Windows /a /bvì tôi quan tâm chủ yếu đến Unix. Nên chọn phong cách nào?


1
POSIX 1003.1-2003, Định nghĩa cơ sở, Chương 12, Phần 2 đưa ra các hướng dẫn sau về cú pháp dòng lệnh tiện ích: "Mỗi tên tùy chọn phải là một ký tự chữ và số (phân loại ký tự alnum) từ bộ ký tự di động." và "Tất cả các tùy chọn phải được bắt đầu bằng ký tự dấu phân cách '-'."
Greg A. Woods

Câu trả lời:


21

Bạn có thể tìm thấy các quy ước đối số POSIX trong chương Các quy ước tiện ích . Kiểu POSIX bao gồm các tùy chọn với một dấu gạch ngang duy nhất theo sau là một chữ cái duy nhất cho biết tùy chọn, với giá trị đối số được phân tách khỏi tùy chọn bằng khoảng trắng.

Có các ngoại lệ cho các quy tắc - findví dụ - nhưng những điều này là do các tiền lệ Unix lịch sử.

X Windows (X11) sử dụng findcác tùy chọn tên dài, giống như dấu gạch ngang.

Các tùy chọn tên dài gạch ngang được tiên phong bởi GNU (sau một đường vòng sử dụng +làm tiền tố).

Xem câu hỏi StackOverflow này để thảo luận về nhiều hệ thống xử lý đối số dòng lệnh đã biết - có rất nhiều. ( Vì đây được viết ra, các cường quốc-mà-được quyết định các câu hỏi SO 367.309 là không thích hợp cho SO. Tôi đã chuyển câu trả lời cho một câu hỏi khác, cú pháp chung của một lệnh Unix shell là gì? . )

Bạn có thể mở rộng danh sách các kỹ thuật để trình bày git(và một số hệ thống khác) nơi bạn có được cấu trúc như:

  • basecommand[ tùy chọn toàn cầu ] subcommand[ tùy chọn lệnh phụ ] [tên ...]

Có thể có nhiều lệnh phụ, mỗi lệnh có từ vựng tùy chọn riêng.

Tất nhiên, Windows sử dụng (được sử dụng) dấu gạch chéo ' /' để chỉ các tùy chọn thay vì dấu gạch ngang ' -'.

JCL (đối với z / OS và OS / 360 và các hệ thống trung gian) có xu hướng sử dụng các tham số vị trí được phân tách bằng dấu phẩy và thường được coi là không thân thiện với người dùng hoặc giao diện tốt.


1
+1 Đối với các liên kết đẹp và đề cập git.
maaartinus

Tôi thích tất cả các câu trả lời, chấp nhận câu trả lời này vì các liên kết.
maaartinus

Câu hỏi stackoverflow dường như đã bị xóa (hoặc có thể di chuyển) ... có ai biết nó đã đi đâu không? Tôi tò mò muốn đọc nó.
mizipzor

1
@mizipzor: Xem cập nhật cho vị trí hiện tại của thông tin. Xem thêm Tùy chọn ngắn / dài với đối số tùy chọn - đây có phải là một loại quy ước không?
Jonathan Leffler

"Tất nhiên, Windows sử dụng (được sử dụng) dấu gạch chéo '/' để chỉ ra các tùy chọn thay vì dấu gạch ngang '-'." Phần lớn các công cụ dòng lệnh của Windows hiện hỗ trợ cả hai và PowerShell chỉ sử dụng dấu gạch ngang.
jpmc26

15

EDIT: Người ta đã chỉ ra rằng phong cách này là một GNU-ism và các Unix không dựa trên GNU có xu hướng sử dụng cú pháp một dấu gạch ngang (đặc biệt là các biến thể OS X và BSD).

Mặc dù có trạng thái GNU-ism, nhiều chương trình kiểu Unix mới viết sử dụng kiểu này:

  • --long-option cho tên tùy chọn dài,
  • -s cho các tùy chọn ngắn (một ký tự),
  • -abc cho nhiều tùy chọn ngắn mà không có đối số (một ký tự cho mỗi tùy chọn).
  • Tùy chọn với các đối số:
    • --long arghoặc --long=argcho các tùy chọn dài,
    • -s arg, -sargHoặc (tùy chọn) -s=argcho các tùy chọn ngắn. Điều này có thể được kết hợp với các tùy chọn ngắn khác, miễn là chỉ có cái cuối cùng có một đối số.
  • Tùy chọn "ngữ nghĩa" tương tự có thể có một số bí danh, phổ biến nhất là một cái ngắn (nhanh hơn để gõ) và một cái dài (dễ nhớ hơn).

Bất kỳ ai đã sử dụng shell Linux trong bất kỳ khoảng thời gian nào cũng nên làm quen với kiểu 1 này , vì vậy nó có nguyên tắc ít gây bất ngờ nhất về phía nó. Cho phép nhóm nhiều tùy chọn ngắn mà không mơ hồ với các tùy chọn dài cũng tốt.

1 Ví dụ, một số chương trình sử dụng phong cách này (trên máy tính Linux của tôi): ls, grep, man, sed, bash, vv ( EDIT: đây là những hình như GNU-ISMS tuy nhiên, BSD và OS X máy không sử dụng phong cách này)

Có một số thư viện có thể đảm nhiệm việc phân tích cú pháp này cho bạn (nổi tiếng nhất là triển khai getopt của GNU ), chỉ cần bạn chỉ định các tùy chọn dài và ngắn tồn tại, cho dù chúng có tranh luận hay không và phải làm gì khi tùy chọn được tìm thấy. (Và tất nhiên, phải làm gì cho các đối số vị trí, tức là những đối số không bắt đầu -và không phải là đối số cho các tùy chọn trước đó)

findlà một chương trình rất cũ (hoặc có thể nhiều khả năng: một phiên bản viết lại của một chương trình rất cũ) không thể dễ dàng thay đổi để sử dụng cú pháp dòng lệnh mới. Quá nhiều tập lệnh sẽ bị hỏng và quá nhiều người dùng đã sử dụng cú pháp cũ sẽ phàn nàn. javaccó khả năng bị ảnh hưởng bởi gccvà bạn bè, cũng theo một cú pháp cũ vì lý do lịch sử.


+1 - Ngoài ra, khi bạn có hàng trăm tùy chọn, bạn chỉ cần sáng tạo (ví dụ: khi viết trình biên dịch)
Tim Post

1
Bạn cho ấn tượng rằng tất cả các Unices đều sử dụng các tiện ích GNU (ví dụ: dash-dash args) và điều đó là sai. Mac OS X không hỗ trợ cho họ và áp dụng tương tự cho BSD miễn phí.
Martin Wickman

8
  • Đối số với dash-dash ( --long-arg) là một quy ước GNU (xem triển khai getopt của họ ).
  • Các lệnh POSIX không bao giờ sử dụng đối số dấu gạch ngang kép. Điều này áp dụng cho hầu hết các biến thể của Unix (Mac OS X, BSD) ngoại trừ Linux sử dụng GNU theo mặc định.

Đối với dự án Java của bạn, bạn có thể muốn kiểm tra GNU getopt cho Java hoặc Apache CLI . Họ ủng hộ cả hai công ước.

Tùy chọn thứ ba là sử dụng các đối số Java VM và để bộ thực thi phân tích chúng cho bạn:

 $ java -Dcolor=blue

Và sau đó, trong mã:

 System.getProperty("color");

Cá nhân, tôi sử dụng -Dthành ngữ và gói câu thần chú Java trong tập lệnh shell xử lý phân tích cú pháp dòng lệnh bao gồm kiểm tra đường dẫn lớp, v.v. Điều này cũng giúp người dùng bản địa chạy chương trình Java của bạn dễ dàng hơn.


1

Nó phụ thuộc. Cá nhân tôi thích phong cách POSIX, nhưng trong trường hợp của bạn, tôi có lẽ sẽ nhắm đến sự nhất quán với môi trường mà công cụ của bạn sẽ được sử dụng. Điều này có nghĩa là sử dụng quy ước Java cho các JAR (trừ khi bạn dự định có một tập lệnh bao bọc sẽ làm cho nó trông giống như một lệnh Unix điển hình).

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.