Dấu gạch ngang đơn `-` cho các tùy chọn ký tự đơn, nhưng dấu gạch ngang kép` --` cho các từ?


51

Trường hợp quy ước sử dụng dấu gạch ngang đơn cho chữ cái và dấu gạch ngang kép cho các từ đến từ đâu và tại sao tiếp tục được sử dụng?

Ví dụ: nếu tôi nhập ls --help, bạn thấy:

  -a, --all                  do not ignore entries starting with .
  -A, --almost-all           do not list implied . and ..
      --author               with -l, print the author of each file
  -b, --escape               print octal escapes for nongraphic characters
      --block-size=SIZE      use SIZE-byte blocks
  -B, --ignore-backups       do not list implied entries ending with ~
...

Tôi đã cố gắng googling - and -- conventionngay cả với trích dẫn với rất ít thành công.


6
Chỉ cần kén chọn ở đây, nhưng nhân vật -được gọi là kỹ thuật gạch nối . Chúng tôi sử dụng từ "dash" để chỉ em dash (-) trong hầu hết các trường hợp và đôi khi là en dash (-), nhưng cả hai đều không phải là dấu gạch nối (-).
chharvey

4
Nó thực sự làm tôi khó chịu khi các chương trình nổi tiếng không tuân theo quy ước, mặc dù:java -version
Kimberly W

4
@Jamil Vâng. Tôi đã kết thúc ở đây tự hỏi tại sao nó lạifind . -delete
Krzysztof Wende

Ý tưởng của việc này là để bạn có thể viết những thứ như -abkích hoạt cả hai ab. Nếu không có dấu gạch ngang đôi, -helpsẽ kích hoạt h, e, l, và pcác tùy chọn.
Aaron Franke

Câu trả lời:


61

Trong Nghệ thuật lập trình Unix Eric Steven Raymond mô tả cách thức thực hành này phát triển:

Trong truyền thống Unix ban đầu, các tùy chọn dòng lệnh là các chữ cái đứng trước một dấu gạch nối đơn ... Phong cách Unix ban đầu được phát triển trên các loại điện thoại ASR-33 chậm khiến cho sự căng thẳng trở thành một ưu điểm; do đó, các tùy chọn chữ cái đơn. Giữ phím shift yêu cầu nỗ lực thực tế; do đó, ưu tiên cho trường hợp thấp hơn và việc sử dụng từ - - (chứ không phải là logic + + có lẽ hợp lý hơn để kích hoạt các tùy chọn.

Kiểu GNU sử dụng các từ khóa tùy chọn (thay vì các chữ cái từ khóa) có trước hai dấu gạch nối. Nó đã phát triển nhiều năm sau đó khi một số tiện ích GNU khá phức tạp bắt đầu hết các phím tùy chọn một chữ cái ( đây là một bản vá cho triệu chứng, không phải là cách chữa trị căn bệnh tiềm ẩn ). Nó vẫn phổ biến vì các tùy chọn GNU dễ đọc hơn so với súp bảng chữ cái của các kiểu cũ. 1

[1] http://www.faqs.org/docs/artu/ch10s05.html


Lưu ý rằng getopt () được xuất bản lần đầu tiên vào năm 1985, nhưng UNOS (bản sao UNIX lâu đời nhất) đã xuất bản getargs () vào năm 1982 (nó được viết vào năm 1980) và getargs () hỗ trợ các tùy chọn ngắn và các tùy chọn dài gạch ngang (kiểu Multics). UNOS sử dụng ồ ạt các tùy chọn dài gạch ngang và UNOS được viết bởi các cựu nhân viên AT & T. Vào năm 1988, GNU đã đưa ra các tùy chọn dài dash đôi mặc dù UNOS đã xác minh rằng các tùy chọn dài dash đơn hoạt động rất tốt.
schily

28

Một lý do để tiếp tục sử dụng các tùy chọn chữ cái là bởi vì họ có thể được kết hợp với nhau: ls -ltrlà một rất nhiều dễ dàng hơn để gõ hơn ls --sort=time --reverse --format=long. Có một số lần khi cả hai đều tốt để sử dụng. Đối với việc tìm kiếm chủ đề này, hãy thử "quy ước tùy chọn dòng lệnh unix".


1
+1 Cảm ơn điều này thực sự có ích với logic đằng sau việc thực hiện.
Larry

Vì UNIX ls không hiểu ls --sort=time --reverse --format=longnên cũng không nên đề cập đến phương pháp không chuẩn này.
schily

6

Các trích dẫn từ Raymond bởi @jasonwryan có một số thông tin hữu ích, nhưng bắt đầu ở giữa của câu chuyện:

  • Hãy nhớ rằng Unix bắt đầu như một phiên bản Multics phạm vi thu nhỏ và trong suốt lịch sử của nó, các tính năng trong Unix thường là bắt chước hoặc điều chỉnh các tính năng được nhìn thấy và sử dụng trên các hệ thống khác.
  • '-'tự tùy chọn đã được sử dụng trong Multics. Bitsavers có một hướng dẫn cho các lệnh người dùng của nó .
  • Các hệ thống khác sử dụng các ký tự khác nhau, một số được cho là có hiệu quả gõ phím cao hơn (như '/'được sử dụng cho TOPS và VMS) và một số ít hơn (như '('được sử dụng trong VM / SP CMS).
  • Nhiều tùy chọn là nhiều ký tự, ví dụ: các từ khóa được phân tách bằng dấu gạch dưới.
  • Các tùy chọn Multics dài hơn thường có dạng viết tắt ngắn hơn, chẳng hạn như -printvs -pr(trang 3-8).
  • Các tùy chọn Unix là ký tự đơn, và sau vài năm, getoptđã được giới thiệu. Bởi vì nó không phải là một phần của Unix ban đầu, có những tiện ích không được sử dụng getoptvà vẫn còn nguyên trạng. Nhưng đã getoptgiúp làm cho các chương trình phù hợp.

Mặt khác, các tùy chọn Unix sử dụng getoptlà ký tự đơn. Các hệ thống khác, đặc biệt là tất cả các hệ thống lớn hơn, đã sử dụng từ khóa. Một số (không phải tất cả) cho phép các từ khóa đó được viết tắt , nghĩa là, không phải tất cả các ký tự được cung cấp miễn là tùy chọn không rõ ràng. Có những cạm bẫy trong bài kiểm tra đó cho sự mơ hồ. Ví dụ:

  • Đầu năm 1985, tôi đang thực hiện một chương trình phải chuyển đến PrimOS . Các nhà phát triển của Prime đã cạnh tranh với một số công ty khác bằng cách cung cấp một ngôn ngữ lệnh (đã cố gắng) bắt chước từng ngôn ngữ khác, cung cấp các lệnh được sử dụng phổ biến nhất từ ​​mỗi công ty. Tất nhiên, họ hỗ trợ viết tắt (cũng như VMS). Sau khi đọc trợ giúp trực tuyến, tôi gõ sta, suy nghĩ để có được status. Đó là chữ viết tắt startvà không có gì để bắt đầu , trình thông dịch lệnh đã đăng xuất cho tôi.
  • Bộ công cụ X (được sử dụng bởi xterm ) cho phép các tùy chọn viết tắt. Để sử dụng điều này một cách hiệu quả trong xterm, nó phải xử lý trước các tham số lệnh để thích -v(cho phiên bản) hơn -vb(chuông trực quan). Bộ công cụ X không có cách trực tiếp để chỉ định tùy chọn ưa thích khi có sự không rõ ràng.

Do tiềm năng mơ hồ này, một số nhà phát triển thích không cho phép viết tắt. Lynx , ví dụ, sử dụng các tùy chọn đa ký tự mà không cho phép viết tắt.

Không phải tất cả các chương trình được sử dụng getopt: tarpskhông. Cũng không rcs(hoặc sccs), như bạn có thể thấy bằng cách lưu ý dấu gạch ngang là tùy chọn và giá trị tùy chọn là tùy chọn.

Tính tất cả những điều này, các nhà phát triển GNU đã điều chỉnh các tùy chọn từ khóa được sử dụng trong các hệ thống khác bằng cách mở rộng getoptđể cung cấp một phiên bản dài của mỗi tùy chọn ngắn. Ví dụ, textutils 1.0 changelog nói

Tue May  8 03:41:42 1990  David J. MacKenzie  (djm at abyss)

        * tac.c: Use regular expressions as the record boundaries.
        Give better error messages.
        Reformat code and make it more readable.
        (main): Use getopt_long to parse options.

Sự thay đổi trong fileutils là trước đó:

Tue Oct 31 02:03:32 1989  David J. MacKenzie  (djm at spiff)

        * ls.c (decode_switches): Add long options, using getopt_long
        instead of getopt.

và ai đó có thể tìm thấy một vẫn còn sớm hơn, nhưng có vẻ như tiêu đề tệp hiển thị ngày sớm nhất:

/* Getopt for GNU.
   Copyright (C) 1987, 1989 Free Software Foundation, Inc.

đó là (ví dụ) đồng thời với X Toolkit (1987). Hầu hết các tiện ích Unix mà bạn đã quen thuộc (ví dụ như ls, ps) sử dụng các tùy chọn ký tự duy nhất hiện có mà đòi hỏi thăm định kỳ để hướng dẫn. Khi giới thiệu getopt_long, các nhà phát triển GNU đã không làm điều này bằng cách thêm các tùy chọn mới trước tiên ; họ bắt đầu bằng cách lập bảng các tùy chọn hiện có và cung cấp tùy chọn dài phù hợp.

Bởi vì họ đã thêm vào một tiết mục hiện có, nên (một lần nữa) vấn đề xung đột với các lựa chọn hiện có. Để tránh điều này, họ đã thay đổi cú pháp, sử dụng hai dấu gạch ngang trước các tùy chọn dài.

Các chương trình này tiếp tục sử dụng getopt_longtheo cách này vì những lý do thông thường:

  • kịch bản phụ thuộc vào các tùy chọn; Các nhà phát triển không lo lắng để phá vỡ các kịch bản
  • có một tiêu chuẩn mã hóa bằng văn bản (có thể có hiệu lực)
  • không ai nghĩ ra được một bộ công cụ cạnh tranh nào không tương thích rõ rệt (cả nhà phát triển BSD và GNU đều sao chép tên tùy chọn từ nhau)

3

Trong giao diện dòng lệnh wikipedia , nó được báo cáo:

Trong các hệ thống tương tự Unix, dấu trừ gạch ngang ASCII thường được sử dụng để chỉ định các tùy chọn. Các nhân vật thường được theo sau bởi một hoặc nhiều chữ cái. Một đối số là một dấu gạch nối đơn trừ đi mà không có bất kỳ chữ cái nào thường chỉ định rằng một chương trình sẽ xử lý dữ liệu đến từ đầu vào tiêu chuẩn hoặc gửi dữ liệu đến đầu ra tiêu chuẩn. Hai ký tự trừ dấu gạch nối (-) được sử dụng trên một số chương trình để chỉ định "tùy chọn dài" trong đó sử dụng tên tùy chọn mô tả nhiều hơn. Đây là một tính năng phổ biến của phần mềm GNU.


Điều này không trả lời câu hỏi hội nghị đến từ đâu và tại sao nó tiếp tục được sử dụng.
chharvey

1

Tôi đoán là các tùy chọn mô tả nhiều hơn được mong muốn và cũng với các tùy chọn dài hơn, bạn sẽ không phải lo lắng về việc hết các tùy chọn ký tự.

Khi bạn quyết định bạn muốn các tùy chọn dài thì bạn sẽ gặp sự cố, ít nhất là nếu bạn có kế hoạch hỗ trợ cả tùy chọn dài và ngắn. Tôi không tích cực, nhưng tôi tin rằng câu trả lời của arcege giữ chìa khóa là tại sao - và -. Một thói quen xử lý chung, ví dụ. getopt_long (), sẽ cần biết liệu một đối số dòng lệnh có thể chứa nhiều tùy chọn hay không, vd. -ltr. Do đó, một quy trình xử lý sẽ cần có khả năng phân biệt giữa hai. Nếu tôi đọc một dấu gạch ngang đơn, -, thì phần còn lại của đối số dòng lệnh có thể khớp với nhiều tùy chọn. Nếu tôi đọc một dấu gạch ngang kép, -, thì phần còn lại của đối số dòng lệnh phải khớp với một tùy chọn duy nhất.

Gần đây tôi mới sử dụng getopt_long () và tôi bắt đầu thích các tùy chọn dài vì chúng dễ nhớ hơn và tự ghi lại. Nếu tôi có hai lệnh sau:

./aggregator -f 15

./aggregator --flush-time 15

Tôi muốn nói rằng cái thứ hai sử dụng tùy chọn dài là tự giải thích nhiều hơn.


0

Có lẽ có một vài lý do mà hai phương pháp được sử dụng. Một, tất nhiên, là truyền thống. Lập trình viên và người dùng là con người, và con người mong đợi mọi thứ sẽ hoạt động theo một cách nhất định. Nếu không có lý do để thay đổi (và thực sự, đối với một dòng lệnh, không có nhiều lý do để thay đổi), thì không.

Điều đó đang được nói, tôi biết rằng có những công cụ sử dụng dấu gạch nối đơn cho một tùy chọn dài hoặc thậm chí loại bỏ hoàn toàn các dấu gạch nối. Những công cụ này ban đầu có thể khó khăn và có xu hướng nổi lên như mụn cóc trong một hệ thống thống nhất khác.

Khi tôi tìm hiểu sự khác biệt giữa hai (và trước khi nó trở thành bản chất thứ hai), tôi sẽ luôn nhớ rằng dấu gạch nối "ngắn" khớp với các tùy chọn "ngắn", trong khi dấu gạch nối "dài" (hoặc gấp đôi) khớp với "dài" tùy chọn. Tôi không biết lý do đó có được sử dụng trong việc phát triển kiểu gạch nối kép hay không, nhưng đó là một khả nă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.