tar cvf hay tar -cvf?


24

Tôi đã học cách sử dụng tar mà không có '-' cho các tùy chọn, tar cvfz dir.tar.gz Directory/nhưng gần đây tôi đã đi qua tar -czvfcú pháp hơi khác nhau (tôi nghĩ rằng 'f' phải là tùy chọn cuối cùng trong trường hợp này).

Cả hai đều hoạt động trên linux và Mac OS. Có một cú pháp được đề xuất, với ou mà không có '-', đó là di động hơn theo các hương vị unix?



Lý do tại sao -fphải là tùy chọn cuối cùng là vì nó cần một đối số và đối số đó có thể được đưa ra chạm vào tùy chọn. tar -cvfz dir.tar.gz Directorycó nghĩa là tạo một kho lưu trữ có tên zchứa các tệp dir.tar.gzDirectory.
JoL

Câu trả lời:


27

tarlà một trong những lệnh cổ từ thời mà cú pháp tùy chọn chưa được chuẩn hóa. Bởi vì tất cả các yêu cầu hữu ích yêu tarcầu chỉ định một thao tác trước khi cung cấp bất kỳ tên tệp nào, hầu hết các tartriển khai đều diễn giải đối số đầu tiên của chúng dưới dạng một tùy chọn ngay cả khi nó không bắt đầu bằng a -. Hầu hết các triển khai hiện nay chấp nhận a -; ngoại lệ duy nhất mà tôi biết là Minix .

Các phiên bản cũ hơn của POSIX và Unix đơn bao gồm một tarlệnh không có -trước bộ chỉ định hoạt động. Unix v2 đơn có cả trình lưu trữ truyền thống cpiotar, nhưng rất ít cờ có thể được tiêu chuẩn hóa do các triển khai hiện có quá khác nhau, vì vậy các tiêu chuẩn đã đưa ra một lệnh mới pax, là trình lưu trữ tiêu chuẩn duy nhất trong Single Unix v3 . Nếu bạn muốn tuân thủ tiêu chuẩn, hãy sử dụng pax, nhưng hãy cẩn thận rằng nhiều bản phân phối Linux không bao gồm nó trong bản cài đặt cơ sở của chúng và không có paxtrong Minix . Nếu bạn muốn tính di động trong thực tế, sử dụng tar cf filename.tar.



1
Cũng lưu ý rằng nếu một bản phân phối Linux có chứa pax, nó thường đi kèm với việc triển khai pax được biết đến tồi tệ nhất (GNU pax) nên tránh vì có nhiều lỗi.
schily

Ngoài ra, pslệnh có hành vi tương tự, bạn có thể bỏ qua -các tùy chọn.
perror

1
@perror Điều đó sai. Nhiều phiên bản pskhông cho phép bạn bỏ qua -. Phiên bản Linux có các tùy chọn có và không có -, nhưng hầu hết đều có ý nghĩa khác nhau (khả năng tương thích BSD và System V).
Gilles 'SO- ngừng trở nên xấu xa'

1
Đúng là, hầu hết thời gian, tôi chỉ sử dụng ps aux... Vì vậy, tôi có thể (một phần) sai. Lấy làm tiếc.
perror

13

Tôi có thể là một con khủng long, nhưng tôi nghĩ rằng thói quen sử dụng "cvf" thay vì "-cvf" có lẽ dễ mang theo hơn. Tôi tưởng tượng hầu hết các bản phân phối Linux đều sử dụng GNU tar và tôi đoán rằng * BSD cũng vậy, nhưng bạn sẽ tìm thấy các Unix độc quyền vẫn sử dụng tar SysV cũ, vốn thường yêu cầu bạn không sử dụng '-' trong các tùy chọn .

Tôi không sử dụng "-cvf" (hoặc "-xf" hoặc bất cứ điều gì) và tôi không gặp khó khăn gì ngay cả với Arch linux.

Và cũng giống như một ghi chú bên lề, tôi nghĩ bạn có thể sử dụng các tùy chọn lệnh "jar" tiêu chuẩn Mặt trời có hoặc không có '-'.


Tôi đồng ý với câu trả lời của bạn, ngay cả khi trang thông tin của tar (rất rõ ràng về ba kiểu tùy chọn chỉ định) cho biết các tùy chọn cũ chỉ được giữ để tương thích và có một loạt các tùy chọn KHÔNG có sự tương ứng cũ.
David Costa

1
Bạn đã sai: tar trên AT & T UNIX được viết là không có - nhưng nó chấp nhận - và bỏ qua nó. Cách di động duy nhất để gọi tar là gọi nó mà không có - và nếu bạn từng tìm thấy một triển khai "tar" không chấp nhận mọi thứ mà không có - thì đây không phải là tar.
schily

3

Đã có một vài chương trình trên UNIX không tuân theo tiêu chuẩn tùy chọn hiện tại.

Một là dd, nhưng dd được lấy từ chương trình máy tính lớn của IBM DDR(Disk Dump and Restore).

Một là arvà kia là tar. Từ thông tin của tôi, tar muốn tương tự như ar.

Tất cả các triển khai tar hoạt động mà không có - và không có triển khai hữu ích nào yêu cầu -. Vì vậy, nếu bạn muốn viết các tập lệnh di động, hãy kiểm tra tiêu chuẩn SUSv2 và chỉ sử dụng một dòng lệnh tương thích với SUSv2.

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.