tar và các chữ cái quan trọng của nó: nó là một lỗi hoặc tính năng?


18

Tôi tự hỏi để hỏi sự khác biệt của hai lệnh này (tức là chỉ thứ tự các tùy chọn của chúng là khác nhau):

  1. tar -zxvf foo.tar.gz
  2. tar -zfxv foo.tar.gz

Người đầu tiên chạy hoàn hảo nhưng người thứ hai nói:

tar: You must specify one of the `-Acdtrux' or `--test-label'  options
Try `tar --help' or `tar --usage' for more information.

Và tar với --test-label-zfxvnói:

tar (child): xv: Cannot open: No such file or directory
tar (child): Error is not recoverable: exiting now
tar: Child returned status 2
tar: Error is not recoverable: exiting now

Sau đó, tôi đã xem hướng dẫn sử dụng tar và nhận ra rằng tất cả các ví dụ có sử dụng công tắc -fcuối cùng !!

AFAICT không cần hạn chế này, hoặc là có?! bởi vì trong quan điểm của tôi chuyển đổi nên được đặt hàng miễn phí.


2
@schily "hiệu chỉnh" của bạn đối với các dòng lệnh che khuất lệnh mà anh ta thực sự đã gõ. Dấu gạch đầu dòng thay đổi hành vi của GNU tar để sử dụng trình phân tích cú pháp đối số khác. Không sử dụng dấu gạch ngang (và do đó là trình phân tích cú pháp đối số truyền thống), lệnh thứ hai sẽ hoạt động.
Random832

Bản in delta từ hệ thống web nói với tôi rằng bạn hoặc ai đó trước khi thêm -, vì vậy tôi đã xóa nó một lần nữa để phù hợp với những gì hệ thống nói với tôi là từ OP. Nhưng nếu bạn đúng gtar option parsing, bạn đã phát hiện ra một lý do khác cho việc không sử dụng gtar.
schily

1
-fmong đợi tên tệp để theo dõi. Trong phiên bản thứ hai của bạn, bạn đã chỉ định -fxv, trong đó - đối với tar - có nghĩa là tên tệp là "xv".
Rolf

1
Bắt buộc XKCD .
Pavel

Câu trả lời:


11

Nhìn vào thông báo lỗi của bạn, rõ ràng là bạn không sử dụng tarmà là gtar.

Nói chung, điều này có thể giúp hiểu những điều:

  • tarthông thường luôn cần một đối số tập tin. Nếu nó bị thiếu, nó sẽ đọc / ghi từ / đến thiết bị băng thực mặc định của hệ thống. starđã thay đổi điều này vào năm 1982 để sử dụng stdin / stdout theo mặc định và một số triển khai tar khác (ví dụ gtar) đã theo dõi ví dụ này gần đây.

  • tarkhông thực hiện hàng đầu -cho các tùy chọn được gọi key letterstrong trường hợp lệnh tar. Một số triển khai sau đó được thêm -dưới dạng một chữ cái không khóa để thuận tiện cho người dùng nhưng bạn không thể dựa vào điều này.

  • Cách tarphân tích cú pháp đối số của nó (cụ thể là đối số tệp lưu trữ) rất rủi ro. Tôi đã thấy nhiều tài liệu lưu trữ tar đã phá hủy một trong các tệp nên có trong kho lưu trữ vì đối số tệp có liên quan được lấy dưới dạng tệp lưu trữ tar. starvì lý do này (nếu được gọi là nguyên bản star) không cho phép "f" được nối với các tùy chọn khác. Nếu starđược gọi, tarnó thực hiện tương thích dòng lệnh với tar, nhưng vẫn xử lý đối số cho ký tự khóa "f" khác nhau: đối số chỉ được phép nếu tham chiếu đến tệp thiết bị thực hoặc khi (ở chế độ ghi) tệp chưa tồn tại .

Tôi khuyên bạn nên tránh dòng lệnh tar gốc rủi ro và sử dụng cú pháp dòng lệnh hiện đại an toàn hơn mà bạn có star.

Do cú pháp dòng lệnh có vấn đề của tar, đã có cái gọi là tar warsvào đầu những năm 1990. Kết quả là, chương trình pax(tiếng Latin nghĩa là "hòa bình" trong các cuộc chiến tar) đã được tạo ra và tiêu chuẩn hóa. paxtuy nhiên không được phổ biến vì cú pháp của nó ít rủi ro hơn nhưng cũng ít trực quan hơn cú pháp tar. Một vấn đề khác có thể gpaxlà ít nhiều không rõ ràng.


3
Các cuộc chiến tar đã kết thúc. guntar đã thắng.
Joshua

2
Nếu bạn đã đúng, tại sao tất cả các triển khai tar sao chép các tính năng từ star?
schily

1
BTW: các cuộc chiến tar đã là một trận chiến giữa tarcpio.
schily

2
OK, vì vậy có vẻ như star-f"$file"cũng là (ngoài ind) một vấn đề với tên tập tin bắt đầu với =. Vì vậy, người ta cần phải viết nó -f="$file"hoặc -f "$file". Tôi không chắc chắn tôi sẽ gọi tùy chọn sao của bạn phân tích cú pháp an toàn hơn hoặc hiện đại .
Stéphane Chazelas

3
-longtùy chọn dài kiểu không tương thích với -xyztùy chọn ngắn ngưng tụ hoặc -xarg. Đó là lý do tại sao các tùy chọn dài kiểu X11 yêu cầu các tùy chọn ngắn phải tách biệt ( -x -ykhông phải -xy) và các đối số tùy chọn phải nằm trên các đối số riêng biệt ( xterm -n fookhông phải xterm -nfoo). Và đó là lý do tại sao có thêm một dấu gạch ngang trong các tùy chọn dài GNU, để loại bỏ sự nhầm lẫn có thể có với các tùy chọn ngắn và tại sao các tùy chọn dài theo kiểu GNU là một thiết kế tốt hơn. Bạn chỉ có thể -foocùng tồn tại -x -y -xynếu bạn rất cẩn thận để tránh sự chồng chéo.
Stéphane Chazelas

55

Thứ tự của các thiết bị chuyển mạch là miễn phí, nhưng -fcó một đối số bắt buộc là tệp tarsẽ đọc / ghi.

Bạn có thể làm

tar -zf foo.tar.gz -xv

và điều đó sẽ làm việc, và có yêu cầu của bạn về một thứ tự chuyển mạch không cụ thể.

Đây là cách tất cả các lệnh có các tùy chọn có đối số hoạt động.


5
Tar không hoạt động như các lệnh khác vì nó sử dụng trình phân tích cú pháp dòng lệnh cũ hơn nhiều - tương tự được sử dụng trong lệnh "ar" và lệnh "ps" cũ (tiền POSIX).
schily

1
Cảm ơn bạn vì điều này, câu trả lời được chọn, trong khi kỹ lưỡng, không thực sự cho phép tôi xem vấn đề cụ thể là gì. Nhìn lại, có vẻ như rõ ràng từ thông báo lỗi cho biết tar đã cố đọc tệp 'xv'
Josh Rumbut

1
Tôi tin rằng bạn cũng có thể khai báo nó -f=./myfile, nghĩa là, f lấy một giá trị, nó không phải là cờ, là đầu vào.
ThorSummoner

14

Theo truyền thống, lựa chọn tar nhiều hay ít "order-free" (thứ tự của các fblựa chọn làm vấn đề nếu cả hai được chỉ định). Tuy nhiên, việc sử dụng dấu gạch đầu dòng khiến GNU tar phân tích các tùy chọn theo cách được coi là phù hợp hơn với các lệnh khác, trong đó việc chỉ định một tùy chọn yêu cầu một đối số (chẳng hạn như tên tệp cho f) sẽ ngay lập tức tiêu thụ phần còn lại của "từ", nếu có, như là đối số (theo truyền thống, tar sử dụng từ tiếp theo làm tên tệp / kích thước khối khi fhoặc bđược chỉ định). Trong trường hợp của bạn, nó lấy "xv" làm tên tệp.

Hành vi này không thể được dựa vào tính di động, mặc dù. Để có tính di động tối đa, bạn nên tránh sử dụng dấu gạch ngang, luôn đặt fcuối cùng và luôn đặt khoảng trắng giữa fvà tên tệp. Tuy nhiên, đây là một sự đơn giản hóa bị phá vỡ nếu bạn cần btùy chọn hoặc nói chung bất kỳ tùy chọn nào (chẳng hạn như C) ngoài fyêu cầu đối số.

Điều này được ghi lại trong phần Hướng dẫn sử dụng Tar "Ba kiểu tùy chọn" . Một số triển khai khác (ví dụ FreeBSD) đề cập đến các tùy chọn kiểu cũ là "từ tùy chọn đi kèm". Và tất nhiên, một số triển khai chỉ có thể hỗ trợ loại tùy chọn này và có thể hoặc không thể bỏ qua dấu gạch ngang nếu được bao gồm. Đây là hình thức gọi duy nhất được chỉ định trong Thông số kỹ thuật Unix đơn và do đó được đảm bảo hoạt động trên hầu hết các hệ thống.


2
Lưu ý rằng một số triển khai hỗ trợ các tùy chọn khác với các đối số (như Ctrong BSD hoặc GNU tar. Schily tar hỗ trợ nó dưới dạng -C nhưng không phải là C, tất cả đều hỗ trợ dưới dạng -C).
Stéphane Chazelas

0

Trong tar, - trong các thiết bị chuyển mạch đã không còn được sử dụng từ nhiều năm trước và không còn cần thiết nữa. Tar thực sự được sử dụng để nói với bạn rằng nhưng không còn nữa.

ie:
tar zxvf foo.tar.gz
tar zfxv foo.tar.gz

Both of these work fine without the -.
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.