tar dan huruf kuncinya: apakah itu bug atau fitur?

18

Saya bertanya-tanya untuk menanyakan perbedaan dari kedua perintah ini (yaitu hanya urutan pilihan mereka yang berbeda):

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

Yang pertama berjalan dengan sempurna tetapi yang kedua berkata:

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

Dan tar dengan --test-labeldan -zfxvberkata:

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

Kemudian saya melihat manual tar dan menyadari bahwa semua contoh ada yang menggunakan saklar -fpada akhirnya !!

AFAICT tidak perlu untuk pembatasan ini, atau ada ?! karena dalam pandangan saya switch harus dipesan secara gratis.

khikho
sumber
2
@sungguh-sungguh "koreksi" Anda ke baris perintah mengaburkan perintah apa yang sebenarnya diketiknya. Dasbor terkemuka mengubah perilaku tar GNU untuk menggunakan parser argumen yang berbeda. Menggunakan no dash (dan dengan demikian parser argumen tradisional), perintah kedua akan berhasil.
Random832
Cetakan delta dari sistem web memberi tahu saya bahwa Anda atau seseorang sebelum menambahkan -, jadi saya menghapusnya lagi agar sesuai dengan apa yang dikatakan sistem dari OP. Tetapi jika Anda benar gtar option parsing, Anda menemukan alasan lain untuk tidak menggunakan gtar.
schily
1
-fmengharapkan nama file untuk diikuti. Di versi kedua Anda, Anda tentukan -fxv, yang - untuk tar - berarti nama file adalah "xv".
Rolf
1
XKCD wajib .
Pavel

Jawaban:

11

Melihat pesan kesalahan Anda, jelas bahwa Anda tidak menggunakannya tarmelainkan gtar.

Secara umum ini dapat membantu untuk memahami hal-hal:

  • tarbiasanya selalu membutuhkan argumen file. Jika tidak ada, itu akan membaca / menulis dari / ke perangkat tape nyata standar sistem. starmengubah ini pada tahun 1982 untuk menggunakan stdin / stdout secara default dan beberapa implementasi tar lainnya (misalnya gtar) mengikuti contoh ini baru-baru ini.

  • tartidak mengimplementasikan -opsi-opsi terkemuka untuk yang dipanggil key lettersdalam kasus perintah tar. Beberapa implementasi kemudian ditambahkan -sebagai huruf no-op key untuk kenyamanan pengguna tetapi Anda tidak dapat mengandalkan ini.

  • Cara tarmem-parsing argumennya (khususnya argumen file arsip) sangat berisiko. Saya telah melihat banyak arsip tar yang menghancurkan salah satu file yang seharusnya ada dalam arsip karena argumen file terkait diambil sebagai file arsip tar. staruntuk alasan ini (jika dipanggil secara as as star) tidak memungkinkan "f" digabungkan dengan opsi lain. Jika stardipanggil tarmengimplementasikan kompatibilitas baris perintah dengan tar, tetapi masih menangani argumen untuk huruf kunci "f" secara berbeda: argumen hanya diizinkan jika merujuk ke file perangkat nyata atau ketika (dalam mode tulis) file tersebut belum ada .

Saya merekomendasikan untuk menghindari baris perintah tar asli yang berisiko dan lebih baik menggunakan sintaks baris perintah modern yang lebih aman yang Anda dapatkan star.

Karena sintaks baris perintah bermasalah tar, ada yang disebut tar warspada awal 1990-an. Akibatnya, program pax(Bahasa Latin untuk "perdamaian" dalam perang tar) dibuat dan distandarisasi. paxnamun tidak mendapatkan popularitas karena sintaksisnya kurang berisiko tetapi juga kurang intuitif daripada sintaksis tar. Masalah lain mungkin yang gpaxkurang lebih tidak terawat.

schily
sumber
3
Perang tar sudah berakhir. guntar menang.
Joshua
2
Jika Anda benar, mengapa semua implementasi tar menyalin fitur star?
schily
1
BTW: perang tar telah menjadi pertempuran antara tardan cpio.
schily
2
OK, jadi sepertinya star's -f"$file"juga (selain ind) masalah dengan nama file dimulai dengan =. Jadi orang perlu menulisnya baik -f="$file"atau -f "$file". Saya tidak yakin saya akan menyebut opsi bintang Anda lebih aman atau modern .
Stéphane Chazelas
3
-longopsi gaya lama tidak kompatibel dengan -xyzopsi pendek kental atau -xarg. Itu sebabnya opsi panjang gaya X11 memerlukan opsi pendek untuk menjadi terpisah ( -x -y, bukan -xy) dan argumen opsi berada pada argumen terpisah ( xterm -n foo, bukan xterm -nfoo). Dan itulah mengapa ada tanda hubung ekstra dalam opsi panjang GNU, untuk menghapus kemungkinan kebingungan dengan opsi pendek, dan mengapa opsi panjang gaya GNU adalah desain yang lebih baik. Anda dapat -foohidup berdampingan -x -y -xyhanya jika Anda sangat berhati-hati untuk menghindari tumpang tindih.
Stéphane Chazelas
55

Urutan sakelar gratis, tetapi -fmemiliki argumen wajib yang merupakan file yang tarakan membaca / menulis.

Anda bisa melakukannya

tar -zf foo.tar.gz -xv

dan itu akan bekerja, dan memiliki kebutuhan Anda untuk urutan sakelar yang tidak spesifik.

Ini adalah cara semua perintah yang memiliki opsi yang berfungsi argumen.

Wurtel
sumber
5
Tar tidak bekerja seperti perintah lain karena menggunakan parser baris perintah yang jauh lebih tua - sama dengan yang digunakan dalam perintah "ar" dan perintah "ps" yang lama (pra-POSIX).
schily
1
Terima kasih untuk ini, jawaban yang dipilih, sementara teliti, tidak benar-benar memungkinkan saya untuk melihat apa masalahnya secara spesifik. Dalam retrospeksi, tampak jelas dari pesan kesalahan yang menyatakan tar mencoba membaca file 'xv'
Josh Rumbut
1
Saya percaya Anda juga dapat mendeklarasikannya sebagai -f=./myfile, yaitu, f mengambil nilai, itu bukan bendera, itu input.
ThorSummoner
14

Secara tradisional, pilihan tar yang lebih atau kurang "agar bebas" (urutan fdan bpilihan melakukan peduli jika keduanya ditentukan). Namun, menggunakan tanda hubung terkemuka, menyebabkan GNU tar mengurai opsi dengan cara yang dianggap lebih konsisten dengan perintah lain, di mana menentukan opsi yang memerlukan argumen (seperti nama file untuk f) akan segera mengkonsumsi sisa kata "kata", jika ada, sebagai argumen (secara tradisional, tar menggunakan kata berikutnya sebagai nama file / ukuran blok saat fatau bditentukan). Dalam kasus Anda, butuh "xv" sebagai nama file.

Perilaku ini tidak dapat diandalkan untuk portabilitas. Untuk portabilitas maksimum, Anda harus menghindari penggunaan tanda hubung, selalu taruh yang fterakhir, dan selalu beri spasi di antara fdan nama file. Namun, ini adalah penyederhanaan yang rusak jika Anda memerlukan bopsi atau secara umum opsi apa pun (seperti C) selain fyang memerlukan argumen.

Ini didokumentasikan di bagian Manual Tar "The Three Option Styles" . Beberapa implementasi lain (misalnya FreeBSD) merujuk ke opsi gaya lama sebagai "kata opsi yang dibundel". Dan tentu saja, beberapa implementasi hanya dapat mendukung jenis opsi ini, dan mungkin atau mungkin tidak mengabaikan tanda hubung jika disertakan. Ini adalah satu-satunya bentuk permohonan yang ditentukan dalam Spesifikasi Unix Tunggal dan karenanya dijamin dapat bekerja di hampir semua sistem.

Random832
sumber
2
Perhatikan bahwa beberapa implementasi mendukung opsi lain dengan argumen (seperti Cdalam BSD atau GNU tar. Schily tar mendukungnya sebagai -C tetapi tidak sebagai C, semua mendukungnya sebagai -C).
Stéphane Chazelas
0

Secara umum, - di sakelar telah usang bertahun-tahun yang lalu dan tidak lagi diperlukan. Tar sebenarnya digunakan untuk memberi tahu Anda itu tetapi tidak lagi.

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

Both of these work fine without the -.
Paul
sumber