Tại sao sử dụng dấu gạch ngang (-) để chuyển cờ tùy chọn sang tar?


35

Để tạo một file tar cho một thư mục, các tarlệnh với compress, verbosefiletùy chọn có thể được gõ như sau:

$ tar -cvf my.tar my_directory/

Nhưng nó cũng hoạt động để làm theo cách này:

 $ tar cvf my.tar my_directory/

Đó là, không có dấu gạch ngang (-) trước các tùy chọn. Tại sao bạn lại vượt qua dấu gạch ngang (-) vào danh sách tùy chọn?


Câu trả lời:


43

Có một số mẫu khác nhau cho các tùy chọn đã được sử dụng trong các ứng dụng UNIX. Một số cái cũ, như tar , sử dụng sơ đồ vị trí:

tùy chọn lệnh đối số

ví dụ như sử dụng tar

tar * Something * f "tệp hoạt động trên đường dẫn" * "của tệp để thao tác" *

Trong nỗ lực đầu tiên để tránh sự nhầm lẫn, tar và một vài chương trình khác với kiểu đối số cờ cũ cho phép phân định các cờ bằng dấu gạch ngang, nhưng hầu hết những người già của chúng ta chỉ đơn giản bỏ qua điều đó.

Một số lệnh khác có cú pháp dòng lệnh phức tạp hơn, như dd (1) sử dụng cờ, dấu bằng, tên đường dẫn, đối số và partridge trong cây lê, tất cả đều bị bỏ hoang.

Trong BSD và các phiên bản mới hơn của unix, điều này ít nhiều đã hội tụ thành các cờ một ký tự được đánh dấu '-', nhưng điều này bắt đầu đưa ra một số vấn đề:

  • những lá cờ có thể khó nhớ
  • đôi khi bạn thực sự muốn sử dụng tên với '-'
  • và đặc biệt là với các công cụ GNU, đã bắt đầu có những hạn chế do số lượng cờ có thể áp đặt. Vì vậy, các công cụ GNU đã thêm các tùy chọn dài như GNU --output.

Sau đó, Sun quyết định rằng phần bổ sung '-' là dư thừa và bắt đầu sử dụng các cờ kiểu dài với một '-'s.

Và đó là cách nó trở thành mớ hỗn độn như bây giờ.


9
"Và một partridge trong cây lê" Tốt hơn so với nỗ lực khô khan của tôi. Bạn thắng.
dmckee

1
bối cảnh lịch sử tốt đẹp.

1
Tôi nhận thấy rằng rất nhiều chương trình X (bao gồm, giả sử X, từ Xorg), sử dụng các cờ kiểu dài với một đơn -. Có phải từ Sun không?
mattdm

1
Ý nghĩa của 'partridge trong cây lê' là gì? (Tôi có thể có bất kỳ liên kết hữu ích và dễ hiểu nào không?)
plhn

1
@plhn Thành ngữ. Một bài hát mừng Giáng sinh truyền thống của Anh "Mười hai ngày Giáng sinh" liệt kê toàn bộ những món quà xa hoa, kết thúc bằng "một phần trong một cây lê". Nó cho thấy một danh sách dài xa hoa.
Charlie Martin

8

Bạn có thể cung cấp các tùy chọn tar theo cách unix tiêu chuẩn tar -c -f foo -v -B file1 file2 file3nơi bạn cần dấu gạch ngang để phân biệt giữa các tùy chọn và tham số hoặc tên tệp ở cuối dòng lệnh. Hoặc bạn có thể đặt tất cả các tùy chọn cùng nhau trong đối số đầu tiên, trong trường hợp đó, dấu gạch ngang là tùy chọn.

Sau đó ps, nơi bạn sử dụng dấu gạch ngang nếu bạn đang sử dụng các tùy chọn SysV-ish và loại bỏ chúng nếu bạn đang sử dụng các tùy chọn BSD-ish, chỉ để khiến mọi thứ trở nên khó hiểu hơn.

Và thậm chí không nói về find.


2

Dấu gạch ngang được sử dụng để phân tán giữa các tên và giá trị tham số tùy chọn. Tôi đoán đó là một quy ước tiêu chuẩn.


1
Tôi sẽ thêm best-practicethẻ vì tôi nghĩ nó có thể đi xuống đó.

1
@Milktrader, đó là một câu hỏi khó khi nói về thực tiễn tốt nhất. Thực hiện theo các quy ước tiêu chuẩn thực sự là cách tốt nhất, nhưng liệu bạn có muốn làm điều đó trong trường hợp của mình không thì không rõ ràng. Nó sẽ phụ thuộc vào kịch bản của bạn. Nếu bạn đang hack một số lệnh nhanh trong shell thì có lẽ bạn sẽ không quan tâm lắm đến nó nhưng nếu bạn đang viết thư viện thì điều quan trọng là phải tuân theo các quy ước được thiết lập tốt bởi vì bạn không kiểm soát được cách sử dụng thư viện này bởi khách hàng. Trong trường hợp này, bạn nên bao gồm tất cả các trường hợp có thể và phân biệt giữa tên và giá trị tùy chọn là quan trọng.

-1

Có tối đa bốn quy ước để sử dụng các tùy chọn dòng lệnh unix:

  1. -o -p -t (dấu gạch ngang trước mỗi tùy chọn)
  2. -opt (dấu gạch ngang trước một tập hợp các tùy chọn)
  3. opt (không có dấu gạch ngang trước một tập hợp các tùy chọn)
  4. --long-tùy chọn (dấu gạch ngang kép trước tên tùy chọn)

Ví dụ:

$ tar -x -v -z -f package.tar.gz
$ tar -xvzf package.tar.gz
$ tar xvzf package.tar.gz
$ tar --extract -verbose -gzip -file package.tar.gz

1
Là quy ước đó chỉ áp dụng cho tar? Còn ls thì sao? ls lrt sẽ không hoạt động nhưng ls -lrt / ls -l -r -t sẽ hoạt động. Tại sao như vậy?
Shashank Vyas

Bốn quy ước nên làm việc cho tất cả các lệnh.
jonasjacek

2
Không, họ không có. Hôm trước tôi đã thử rm rf <tên tệp>, nó cũng không hoạt động.
Shashank Vyas

-2

Với dấu trừ / dấu gạch đầu dòng (-), bạn cần giữ các tùy chọn theo thứ tự chính xác. Không có thứ tự trừ của tùy chọn của bạn có thể thay đổi.

Ví dụ:

# tar -xvf yourfile.tar
# tar vxf yourfile.tar

Câu trả lời này đúng một nửa, nhưng AFAIK chỉ là những lá cờ như thế fcó tranh luận về vấn đề trật tự. Xem unix.stackexchange.com/a/239120/3169
Mikel
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.