Tại sao trình tự cụ thể của các tùy chọn quan trọng đối với lệnh tar?


7

Tôi đã thử dùng tarlệnh để thực hiện lưu trữ với .tarphần mở rộng.

xin vui lòng xem một loạt các lệnh sau đây tôi đã thử:

$ ls
abc.jpg  hello.jpg  xjf.jpg
$ tar -cfv test.tar *.jpg
tar: test.tar: Cannot stat: No such file or directory
tar: Exiting with failure status due to previous errors
$ ls
abc.jpg  hello.jpg  v  xjf.jpg
$ rm v
$ ls
abc.jpg  hello.jpg  xjf.jpg
$ tar -cvf test.tar *.jpg
abc.jpg
hello.jpg
xjf.jpg
$ ls
abc.jpg  hello.jpg  test.tar  xjf.jpg

Tại sao nó cho phản ứng khác nhau với chuỗi tùy chọn khác nhau? tức là -cfvvs cvf.
từ những gì tôi đã học được trong bash scripting, chuỗi tùy chọn đó không thành vấn đề.


Lưu ý rằng điều đó chỉ đúng với một số tartriển khai (ví dụ không phải là triển khai trong Solaris).
Stéphane Chazelas 3/03/2015

2
Nói chung, thứ tự của các tùy chọn quan trọng đối với các lệnh, đặc biệt nếu một số tùy chọn lấy giá trị. GNU làm mờ điều này đến một mức độ nào đó trừ khi bạn có POSIXLY_CORRECT được đặt trong môi trường bằng cách sắp xếp lại các tùy chọn trước các tùy chọn không. Nói chung, mặc dù, các tùy chọn đi trước không phải là tùy chọn và vấn đề đặt hàng. Thứ tự không phải lúc nào cũng quan trọng, nhưng nó thường (hoặc chỉ là "đôi khi"?).
Jonathan Leffler

@JonathanLeffler - nói chung đôi khi.
mikeerv 3/03/2015

Câu trả lời:


11

Như @jcbermu đã nói, đối với hầu hết các chương trình và trong hầu hết các trường hợp, thứ tự các cờ dòng lệnh không quan trọng. Tuy nhiên, một số cờ mong đợi một giá trị. Cụ thể, -fcờ của tar là:

  -f, --file ARCHIVE
       use archive file or device ARCHIVE

Vì vậy, tarhy vọng sẽ -fcó một giá trị và giá trị đó sẽ là tên của tarfile mà nó tạo ra. Ví dụ: để thêm tất cả .jpgcác tệp vào kho lưu trữ được gọi foo.tar, bạn sẽ chạy

tar -f foo.tar *jpg

Những gì bạn đang chạy là

tar -cfv test.tar *.jpg

tarhiểu rằng "tạo ( -c) một kho lưu trữ được gọi là v( -fv), chứa các tệp test.tarvà bất kỳ kết thúc nào trong .jpg.

Khi bạn chạy tar -cvf test.tar *.jpgmặt khác, nó sẽ test.tarlà tên của kho lưu trữ và *jpglà danh sách các tập tin.


1
Chỉ cần chính xác: -cthực sự là viết tắt của create, không compress. Câu trả lời tốt đẹp, dù sao.
Erathiel

1
Trên thực tế, GNU tarxử lý các đối số dòng lệnh của nó như một tập lệnh - và vì vậy, thứ tự xuất hiện của chúng nói chung là rất quan trọng. Nếu chúng được xử lý ngẫu nhiên, nó sẽ biến những thứ như --checkpointtập lệnh hoặc lưu trữ đa biến thành một việc vặt, và thậm chí cả những thứ đơn giản như: set file[1234]; for f do shift; set -- "$@" "-C$PWD/dir${f#file}" -x "$f"; done; tar -c . | tar "$@"sẽ không hoạt động.
mikeerv

Chỉnh sửa của bạn tốt hơn, nhưng vẫn không đánh dấu, tôi nghĩ: Thứ tự của các tùy chọn khác nhau không liên quan đến nhau, trừ khi các tùy chọn được ghi lại là loại trừ lẫn nhau và một tùy chọn như vậy được ghi lại để ghi đè bất kỳ tùy chọn không tương thích nào trước nó. Nếu một tùy chọn có đối số tùy chọn được lặp lại, các kết hợp tùy chọn và đối số tùy chọn sẽ được diễn giải theo thứ tự được chỉ định trên dòng lệnh. Về cơ bản, ngay khi một tùy chọn có thể ảnh hưởng đến hoạt động của một lựa chọn khác, thứ tự sẽ có vấn đề. Các ví dụ phổ biến bao gồm các -[if]tùy chọn mvvà / hoặc rm.
mikeerv 3/03/2015

Và, tất nhiên, thứ tự mà --cờ xuất hiện trên một dòng lệnh so với những người khác có lẽ luôn luôn là vấn đề lớn.
mikeerv 3/03/2015

@mikeerv vì lợi ích của thiên đường, hãy đọc những gì tôi nói: " đối với hầu hết các chương trình và trong hầu hết các trường hợp , thứ tự các cờ dòng lệnh không quan trọng".
terdon

9

Thứ tự không quan trọng miễn là tùy chọn không cần giá trị. Trong trường hợp của bạn -f cần chỉ định một tên tệp.

Trong trường hợp đầu tiên ( tar -cfv ), lệnh tin rằng tên tệp đầu ra là v vì nằm sau -f .


1
Và bạn nhận được thông báo lỗi bạn làm vì nó đang cố thêm test.tarvào kho lưu trữ.
Đánh dấu

@ Mark ... test.tar, mà không tồn tại được nêu ra tại thời điểm lệnh được gõ vì thế thông điệp « Không có tập tin hoặc thư mục như vậy ». Chỉ là giáo viên ;-).

5

Trong khi những người khác đã chỉ ra rằng nó đối xử với nó như vậy -c -f v, tôi cảm thấy tôi nên lưu ý rằng điều này chỉ được thực hiện vì dấu gạch ngang đã được sử dụng và hành vi này không áp dụng cho tất cả các phiên bản tar. Trong chế độ kế thừa (không có dấu gạch ngang), tar xử lý đặc biệt đối số đầu tiên và một "f" hoặc "b" trong đó sẽ tiêu thụ các từ đầy đủ tiếp theo sau các tùy chọn (vì vậy tar cfb file.tar 20hoặc tar cbf 20 file.tar). Đối với GNU tar, bạn có thể tìm thêm chi tiết trong tài liệu Texinfo đầy đủ bằng cách chạy info tar styles.

Nói chung, bạn không nên dựa vào một trong hai hành vi và luôn chỉ định f là tùy chọn cuối cùng và đặt khoảng trắng giữa nó và tên tệp. ( -bchỉ quan trọng trong một số tình huống khi ghi vào ổ đĩa vật lý, vì vậy nó có thể bị bỏ qua cho cuộc thảo luận này.)


Lưu ý rằng điều tương tự áp dụng cho sh(và có thể các công cụ pre-getopt khác). sh -cf noglob 'echo test'hoạt động như sh -f -c 'echo test'trong vỏ Bourne và các dẫn xuất (và sh -ocC noglob 'echo test'giống như sh -o noblob -C -c 'echo test'trong hầu hết các dẫn xuất Bourne). Cũng lưu ý rằng trong một số truyền thống tar, thực hiện, tar -cfvlà giống như tar -cvf.
Stéphane Chazelas
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.