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.
- Ký
'-'
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ư
-print
vs -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 getopt
và vẫn còn nguyên trạng. Nhưng đã getopt
giú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 getopt
là 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 start
và 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
: tar
và ps
khô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_long
theo 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)
-
đượ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 (-).