Saya bertanya-tanya untuk menanyakan perbedaan dari kedua perintah ini (yaitu hanya urutan pilihan mereka yang berbeda):
tar -zxvf foo.tar.gz
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-label
dan -zfxv
berkata:
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 -f
pada akhirnya !!
AFAICT tidak perlu untuk pembatasan ini, atau ada ?! karena dalam pandangan saya switch harus dipesan secara gratis.
linux
command-line
tar
khikho
sumber
sumber
gtar option parsing
, Anda menemukan alasan lain untuk tidak menggunakan gtar.-f
mengharapkan nama file untuk diikuti. Di versi kedua Anda, Anda tentukan-fxv
, yang - untuk tar - berarti nama file adalah "xv".Jawaban:
Melihat pesan kesalahan Anda, jelas bahwa Anda tidak menggunakannya
tar
melainkangtar
.Secara umum ini dapat membantu untuk memahami hal-hal:
tar
biasanya selalu membutuhkan argumen file. Jika tidak ada, itu akan membaca / menulis dari / ke perangkat tape nyata standar sistem.star
mengubah ini pada tahun 1982 untuk menggunakan stdin / stdout secara default dan beberapa implementasi tar lainnya (misalnya gtar) mengikuti contoh ini baru-baru ini.tar
tidak mengimplementasikan-
opsi-opsi terkemuka untuk yang dipanggilkey letters
dalam kasus perintah tar. Beberapa implementasi kemudian ditambahkan-
sebagai huruf no-op key untuk kenyamanan pengguna tetapi Anda tidak dapat mengandalkan ini.Cara
tar
mem-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.star
untuk alasan ini (jika dipanggil secara as asstar
) tidak memungkinkan "f" digabungkan dengan opsi lain. Jikastar
dipanggiltar
mengimplementasikan kompatibilitas baris perintah dengantar
, 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 disebuttar wars
pada awal 1990-an. Akibatnya, programpax
(Bahasa Latin untuk "perdamaian" dalam perang tar) dibuat dan distandarisasi.pax
namun tidak mendapatkan popularitas karena sintaksisnya kurang berisiko tetapi juga kurang intuitif daripada sintaksis tar. Masalah lain mungkin yanggpax
kurang lebih tidak terawat.sumber
star
?tar
dancpio
.star
's-f"$file"
juga (selainind
) 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 .-long
opsi gaya lama tidak kompatibel dengan-xyz
opsi 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
, bukanxterm -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-foo
hidup berdampingan-x -y -xy
hanya jika Anda sangat berhati-hati untuk menghindari tumpang tindih.Urutan sakelar gratis, tetapi
-f
memiliki argumen wajib yang merupakan file yangtar
akan membaca / menulis.Anda bisa melakukannya
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.
sumber
-f=./myfile
, yaitu, f mengambil nilai, itu bukan bendera, itu input.Secara tradisional, pilihan tar yang lebih atau kurang "agar bebas" (urutan
f
danb
pilihan 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 untukf
) akan segera mengkonsumsi sisa kata "kata", jika ada, sebagai argumen (secara tradisional, tar menggunakan kata berikutnya sebagai nama file / ukuran blok saatf
ataub
ditentukan). 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
f
terakhir, dan selalu beri spasi di antaraf
dan nama file. Namun, ini adalah penyederhanaan yang rusak jika Anda memerlukanb
opsi atau secara umum opsi apa pun (sepertiC
) selainf
yang 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.
sumber
C
dalam BSD atau GNU tar. Schily tar mendukungnya sebagai -C tetapi tidak sebagai C, semua mendukungnya sebagai -C).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.
sumber