Sự khác biệt giữa một dấu gạch ngang và hai dấu gạch ngang cho các tham số dấu nhắc lệnh là gì?


65

Tôi đã tự hỏi tại sao một số chương trình yêu cầu các tham số nhắc lệnh của chúng phải có hai dấu gạch ngang phía trước trong khi một số (hầu hết) chỉ yêu cầu một dấu gạch ngang phía trước?

Ví dụ, hầu hết các chương trình trông như thế này: relaxer -dtd toc.xml toc_gr.xml toc_jp.xml

Trong khi một số chương trình trông như thế này: xmllint --valid toc.xml --noout

Lý do nào mà một số yêu cầu hai dấu gạch ngang thay vì một? Không có nghĩa là mọi người đều tuân theo một tiêu chuẩn (tức là một dấu gạch ngang sẽ làm).


10
> Không có nghĩa là mọi người đều tuân theo một tiêu chuẩn - có. Có phải tất cả các lập trình viên đều tuân thủ các tiêu chuẩn và giữ sự nhất quán? Không. Nhiều lập trình viên thậm chí không thể duy trì tính nhất quán trong các chương trình của họ :) Có thể nói, sự đồng thuận sẽ chỉ sử dụng một dấu gạch ngang cho các tùy chọn một chữ cái và hai dấu gạch ngang cho tất cả những gì thực sự là từ, ví dụ -iso với --inputhoặc -n --dry-run.
slhck

1
@slhck Heys cảm ơn vì sự giúp đỡ =) Theo quy ước đó, điều đó có nghĩa là điều đó -dtdthực sự nên có --dtd? Thực tế, điều tôi băn khoăn là dấu gạch ngang (và dấu gạch ngang kép) đang cố gắng biểu thị điều gì?
Pacerier

6
Đối với điểm thưởng: các chương trình tuân thủ các tiêu chuẩn Gnu --long-optionscũng sẽ chấp nhận bất kỳ chữ viết tắt duy nhất nào. Vì vậy, đối với một chương trình có các tùy chọn --file-in--file-out, bạn có thể sử dụng --file-o=foohoặc --file-i=foo, có thể lưu một số cách gõ --very-long-optional-parameters.
BRPocock

GNU đến cùng với ước của họ về cách sử dụng hai dấu gạch ngang cho các tùy chọn "dài", mà tôi tình cờ thích, nhưng nhiều tiện ích lớn hơn, chẳng hạn như những gói với X Window System, cũng như ImageMagick ( ví dụ như , convert, mogrify) có "dài" tùy chọn chỉ sử dụng một dấu gạch ngang duy nhất. Ví dụ : xterm -fn 6x10 -geometry 80x24+30+200. Chữ viết tắt được hỗ trợ, miễn là chúng ta khác nhau ( ví dụ , -ghoặc -geomcho -geometry). Xem X (7) để biết các ví dụ khác.
TheDudeAdides

Câu trả lời:


18

Chỉ cần làm ls --help và nhìn vào các tùy chọn; nó nên rõ ràng với bạn

Nó không có gì để làm với các tham số cả. Nhiều lựa chọn có một hình thức ngắn và một hình thức dài, và nhiều lựa chọn có một và không phải cái khác.

Và ngoài ra, liên quan đến các tham số, đơn giản là ở dạng dài khi chúng lấy tham số, có vẻ như nó luôn luôn bằng một. Nhưng rõ ràng những cái ngắn có thể lấy tham số nhiều như vậy; chỉ là họ không sử dụng một bằng.

Đây là một trích từ ls --help( man lscung cấp thông tin tương đương). Chú ý một số có một hình thức dài mà không có một hình thức ngắn ( --author, --block-size), một số có một hình thức ngắn mà không có một dạng dài ( -c, -f, -g), và một số có cả dạng dài và một hình thức ngắn ( -A/ --almost-all, -b/ --escape).

 -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 ~
 -c                         with -lt: sort by, and show, ctime (time of last
                              modification of file status information)
                              with -l: show ctime and sort by name
                              otherwise: sort by ctime
 -C                         list entries by columns
     --color[=WHEN]         control whether color is used to distinguish file
                              types.  WHEN may be `never', `always', or `auto'

4
Làm thế nào để chúng ta làm một ls --helptrên windows?
Pacerier

1
@Pacerier Không có lstrên Windows. Lệnh tương đương sẽ là dir /?. Bạn đang sử dụng phần mềm đa nền tảng vi phạm các quy ước Windows thông thường, xem câu trả lời của tôi.
Daniel Beck

@Pacerier Nó không được tích hợp sẵn, nhưng tải xuống bên thứ 3, Gnuwin32 bạn tải xuống (google gnuwin32). có một loạt các gói trong gnuwin32 mỗi gói có lệnh, tải xuống gói coreutils, có nhiều lệnh phổ biến.
barlop

Có những lựa chọn dài mà không có tùy chọn ngắn trong ls --helpđoạn trích của bạn . Xem --author--block-size.
Dan

Để trả lời câu hỏi trong nhận xét ban đầu của @ Pacerier: Cách phổ biến nhất mà các hệ thống Windows hiện đại nhận được lslệnh là thông qua GIT . Cửa sổ bash GIT hoặc cửa sổ CMD với GIT bin trong PATH sẽ có ls.
yzorg 17/2/2016

34

Không có tiêu chuẩn rộng rãi. Có một số tính nhất quán, ví dụ như trong các chương trình GNU, nhưng bạn cần kiểm tra từng tài liệu của chương trình.

Trích dẫn Wikipedia , nhấn mạnh của tôi:

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.

Thông thường, dấu gạch nối chỉ ra một đối số được xác định trước. Tôi nghĩ nó được sử dụng để phân biệt chúng với các tên tệp hoặc nhãn khác mà bạn có thể sử dụng làm đối số. Điều đó không phải luôn luôn như vậy, mặc dù (xem bên dưới).


Bạn sẽ thường tìm thấy cùng một đối số có sẵn cả tùy chọn ngắn và dài, ví dụ như trong ls .

Một số chương trình sử dụng một dấu gạch nối duy nhất cho các tùy chọn một ký tự và hai dấu gạch nối cho các tùy chọn đa ký tự, nhưng không phải tất cả (GNU findxuất hiện trong tâm trí). Một số chương trình có dấu gạch nối tùy chọn hoặc bỏ qua chúng hoàn toàn ( tarhoặc BSD psxuất hiện trong tâm trí).

Đôi khi các tùy chọn dài ( --foo) yêu cầu đối số, trong khi tùy chọn ngắn ( -f) không (hoặc ít nhất ngụ ý một đối số mặc định cụ thể).

Các tùy chọn ngắn (ví dụ cut -d ' ') có thể có các đối số, trong khi các tùy chọn dài (ví dụ ls --all) không nhất thiết phải có chúng.

Để thiết lập một hành vi cụ thể của một chương trình, đôi khi bạn cần sử dụng một tùy chọn ngắn, đối với những người khác, bạn cần sử dụng một tùy chọn dài và đối với một số bạn có một sự lựa chọn.

Trên một lưu ý liên quan, một số chương trình có thể xử lý không có khoảng trắng giữa một tùy chọn và đối số của nó , trong khi các chương trình khác thì không thể.

Như tôi đã viết lúc đầu, không có hành vi hay tiêu chuẩn chung. Thường thì bạn có thể theo dõi hành vi tương tự với cùng một thư viện được sử dụng để phân tích cú pháp đối số, nhưng có lẽ bạn không muốn đọc các nguồn để tìm hiểu điều này.

Bạn thực sự không thể suy ra cú pháp đối số của một chương trình từ một cái khác.


Nếu bạn cũng xem xét Windows, nó thậm chí còn tệ hơn: Trong khi các dòng lệnh Windows thường sử dụng /f(ít nhất là các ký tự đơn) cho các tùy chọn, với :tư cách là dấu phân cách giữa các tùy chọn và giá trị của chúng (xem ví dụ ở đây ); các tiện ích đa nền tảng được phổ biến rộng rãi (như những tiện ích bạn đề cập) và mang theo cú pháp dấu gạch nối phổ biến hơn cho các đối số, với tất cả các mâu thuẫn được đề cập ở trên.


2
Cần lưu ý rằng các thư viện tiêu chuẩn GNU cung cấp chức năng ánh xạ các tùy chọn một ký tự một, hai ký tự, nhiều ký tự, vì vậy tất cả các chương trình GNU mới và hầu hết các phần mềm miễn phí mới nói chung đều sử dụng ký hiệu này (ví dụ: f, -f foo, --file, --file foo, --file = foo, --fil = foo, --fi = foo); throwbacks như tar, ps, findvà như vậy có cú pháp dòng lệnh của họ được thiết lập bởi POSIX trước khi tiêu chuẩn này đã hoàn toàn gel hóa. Trên hệ thống Gnu / Linux, đặt cược khá an toàn là ít nhất --helpsẽ luôn luôn được hỗ trợ, cũng như man <command>hoặcinfo <command>
BRPocock

Tiêu chuẩn GNU có nói rằng bạn không nên có một hình thức ngắn mà không có hình thức dài và không nên có một hình thức dài mà không có hình thức ngắn?
barlop

+1 vì là câu trả lời đầy đủ nhất, bao gồm đề cập đến GNU findkhông tuân theo "quy ước GNU" cho các tùy chọn dài (có thể vì lý do tuân thủ POSIX, như @BRPocock đã chỉ ra). Tôi sẽ +1 lần nữa nếu tôi có thể, vì đã đề cập đến "chuyển đổi" dòng lệnh DOS / Windows, vì câu hỏi của OP bằng cách nào đó đã được gắn thẻ "windows", và quy ước đó nên được đề cập cho đầy đủ.
TheDude chấp nhận

7

Đây là một quy ước đến từ * nix. Dấu gạch nối kép đi trước các tùy chọn khi chúng được viết đầy đủ , trong khi dấu gạch nối đơn đi trước các tùy chọn khi chúng được viết ở dạng ngắn . Ví dụ ls --all --l, có thể rút ngắn thành ls -al. Như đã thấy, không phải tất cả các tùy chọn đều có các chữ cái tương đương, mặc dù các tùy chọn được sử dụng nhiều hơn thường làm.

Cho dù tùy chọn có một đối số không thực sự tạo ra sự khác biệt - nó có thể lấy chúng hoặc không lấy chúng, bất kể bạn nhập tùy chọn như thế nào.

Khi viết chúng cho một lần sử dụng, điều đó không thực sự quan trọng, nhưng khi viết các lệnh chẳng hạn trong các tệp .alias, thì thông thường sẽ sử dụng dạng đầy đủ. Hoàn toàn để dễ đọc cho người bên cạnh.


Xin cảm ơn vì sự giúp đỡ, Btw có lý do gì bạn gõ unix là * nix không?
Pacerier

2
@Pacerier - Unix là một tên thương mại. Bằng cách gõ * nix tôi thực sự đề cập đến tất cả các hệ thống unix và tương tự, cho tất cả các mục đích thực tế, đều giống nhau. Nhưng chủ yếu, đó là một thói quen ...
Rook

2
@Pacerier * nix có thể đề cập đến Linux hoặc Unix. Tôi không hoàn toàn chắc chắn về điều này một thời gian trước đây tôi đã xem xét nó, nhưng về mặt kỹ thuật, nếu tôi nhớ lại, BSD là từ gia đình Unix. Về mặt kỹ thuật Linux thì không .. và FreeBSD cũng vậy. Nhưng nói * nix sẽ bao gồm unix / bsd và bất cứ thứ gì tương tự, ví dụ như linux và freebsd.
barlop

2
+1 để đề cập đến kết hợp lệnh tốc ký. đó là lý do thực sự tại sao có hai phong cách.
Ryan_S

3

đây là những cú pháp UNIX thông thường,

một đối số chương trình có một dấu gạch nối ("-") được theo sau bằng một chữ cái khi đó là một tùy chọn đơn giản (ví dụ: -v ) và hai dấu gạch nối ("-") khi tùy chọn nhận các đối số (ví dụ: --file toc.xml hoặc --file = toc.xml )

không ảnh hưởng đến chức năng của chương trình.


3
Ngoài ra, trong nhiều trường hợp với các tùy chọn chữ cái đơn sau một dấu gạch ngang, bạn có thể nhóm các chữ cái lại với nhau. Ví dụ: "ls -al" giống như "ls -a -l". Tùy chọn dấu gạch ngang đôi không thể được kết hợp theo cách này. Tùy chọn một chữ cái là một tiêu chuẩn cũ hơn, nhưng ngày nay, nhiều lệnh sẽ có cả hai loại. Ví dụ: "ls --all" giống như "ls -a".
Randy Orrison

3
Trên thực tế, một sự điều chỉnh khác. Các tùy chọn một chữ cái một dấu gạch ngang có thể lấy một tham số, nhưng nó thường không được liên kết với một dấu bằng. Ví dụ: "tail -n 50" hiển thị 50 dòng cuối cùng của tệp, tương đương với "tail --lines = 50".
Randy Orrison

Theo quy ước này, điều đó có nghĩa là --noout(trong câu hỏi trên) thực sự nên được viết -nooutvì nó không có đối số ?
Pacerier

1
những gì được nói trong câu trả lời này về các tham số là hoàn toàn sai. Câu đầu tiên là rõ ràng. Câu cuối cùng là rõ ràng. Và đoạn văn ở giữa nên trả lời câu hỏi, là hoàn toàn sai.
barlop

@RandyOrrison khi một chữ cái tôi chưa bao giờ thấy dấu bằng .. và để giải thích về quan điểm của bạn, họ thường lấy tham số .. wget -w 10 head -n 3 cut -b 2 Và nhìn vào Ping -? !! Tải lấy tham số. Câu trả lời này thật tồi tệ
barlop

3

dấu gạch ngang đơn được thực hiện bởi getopt và là hàm tiêu chuẩn posix, dấu gạch ngang kép trong getopt_long và là một tiêu chuẩn gnu.

Theo truyền thống, một dấu gạch ngang cung cấp một tùy chọn ký tự như thế này:

-A hoặc -V vv nhưng không cần phải giới hạn ở đó. ví dụ -Wall cho gcc bật tất cả các cảnh báo của trình biên dịch cho lệnh trình biên dịch gcc.

đối số dấu gạch ngang kép có xu hướng dài dòng hơn và thường lấy tham số được cung cấp như --max-Count = NUM. Tuy nhiên, --version không bằng.

Nói chung, không có quy tắc hoặc tiêu chuẩn được xác định xung quanh cách các đối số chương trình nên được chỉ định, chỉ là một loạt các truyền thống. Tuy nhiên, nếu các hàm phân tích cú pháp dòng lệnh getopt và getopt_long được sử dụng thì các tham số thường phải tuân theo tiêu chuẩn vì các hàm thư viện thực thi một cách thực hiện nhất đị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.