Sự khác biệt giữa các dấu gạch ngang đơn và cờ đôi trên các lệnh shell là gì?


70

Tôi mới làm việc trong trình bao và việc sử dụng các lệnh này có vẻ tùy ý. Có một lý do nào một lá cờ có một dấu gạch ngang và một cái khác có thể có một dấu gạch ngang kép?


Nó được cho là chịu sự chi phối của tiêu chuẩn POSIX: iam.ubc.ca/guides/javatut99/essential/attribut/_poseix.html
cjc

Liên kết đó hiện là 404 @cjc :( Một liên kết có thể đáng tin cậy hơn có thể là en.wikipedia.org/wiki/POSIX
Bernhard Hofmann

Liên kết tốt hơn: en.wikipedia.org/wiki/ đá
Craig Fisher

Câu trả lời:


110

Một dấu gạch nối đơn có thể được theo sau bởi nhiều cờ ký tự đơn. Một dấu gạch nối kép có tiền tố là một tùy chọn đa vi khuẩn.

Xem xét ví dụ này:

tar -czf

Trong ví dụ này, -czfchỉ rõ ba lá cờ đơn ký tự: c, z, và f.

Bây giờ hãy xem xét một ví dụ khác:

tar --exclude

Trong trường hợp này, --excludechỉ định một tùy chọn đa vi khuẩn có tên exclude. Dấu nối đôi disambiguates các đối số dòng lệnh, đảm bảo rằng tardiễn giải nó như excludechứ không phải là một sự kết hợp của e, x, c, l, u, d, và e.


1
@kylex, không, vì không có tùy chọn dài có tên chỉ là "c" và - có nghĩa là một tùy chọn dài, không phải là một tùy chọn ký tự duy nhất theo sau.
psusi

13
Đôi khi các lệnh thậm chí dài có thể được gạch đơn. Ví dụ: 'cdrecord' sử dụng tất cả các lệnh đơn nét (-eject -dao ...). Tất cả phụ thuộc vào chương trình, nhưng hầu hết (!) Trong số họ sử dụng - cho các lệnh đơn và - cho nhiều ký tự (dài)
mulaz

8
@mulaz, vâng, cdrecord thực hiện khá nhiều điều ngớ ngẩn.
psusi

10
cũng lưu ý - được sử dụng riêng thường biểu thị sự kết thúc của các tùy chọn. xem tại đây để biết thêm thông tin: unix.stackexchange.com/questions/11376/ trên
Sirex

3
@killjoy, vì dù thông qua sự thiếu hiểu biết hay lựa chọn, các tác giả của những chương trình đó đều không tuân theo quy ước tất nhiên. Giống như cdrecordđã đề cập nhiều năm trước trong các ý kiến ​​trên.
psusi

17

Tất cả phụ thuộc vào chương trình. Thông thường "-" được sử dụng cho các tùy chọn 'ngắn' (một chữ cái, -h) và "-" được sử dụng cho các tùy chọn "dài" (er) (- trợ giúp).

Các tùy chọn ngắn thường có thể được kết hợp (vì vậy "-h -a" giống như "-ha")

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ố chỉ trừ một dấu gạch nối đơn 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.

nguồn


2
Vậy tại sao lại là java -version và antversion, sau đó?
killjoy

7

Đó thực sự là một quy ước. Tuy nhiên, nó có thể hỗ trợ các trình phân tích cú pháp biết hiệu quả hơn về các tùy chọn được truyền cho chương trình. Ngoài ra, có những tiện ích gọn gàng có thể giúp phân tích các lệnh này, chẳng hạn như getopt(3)hoặc không chuẩn getopt_long(3)để giúp phân tích các đối số của chương trình.

Thật tuyệt, vì chúng ta có thể có nhiều lựa chọn ngắn kết hợp, như những câu trả lời khác nói, như thế tar -xzf myfile.tar.gz.

Nếu có một đối số "lisa" cho ls, có lẽ sẽ có một ý nghĩa khác để gõ ls -lisahơn ls --lisa. Các cựu là l, i, s, và acác thông số, chứ không phải từ.

Trong thực tế, bạn có thể viết ls -l -i -s -a, có nghĩa chính xác như ls -lisa, nhưng điều đó phụ thuộc vào chương trình.

Cũng có những chương trình không tuân theo quy ước này. Đáng chú ý nhất là cho tầm nhìn của tôi, ddgcc.


3

tùy chọn ngắn với dấu gạch ngang đơn và tùy chọn dài với dấu gạch ngang kép

các tùy chọn ngắn có thể được kết hợp thành một đối số duy nhất;

for example: ls -lrt #instead of ls -l -r -t

Nếu chúng ta cho phép các tùy chọn dài với dấu gạch ngang đơn, nó sẽ gây ra sự mơ hồ. Để giải quyết điều này, chúng tôi sử dụng dấu gạch ngang kép cho các tùy chọn dài.

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.