tar ve anahtar harfleri: bir hata veya özellik mi?


18

Bu iki komutun farkını merak ediyorum (yani sadece seçeneklerinin sırası farklıdır):

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

Birincisi mükemmel koştu ama ikincisi şöyle dedi:

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

Ve ile katran --test-labelve -zfxvşunları söyledi:

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

Sonra katran el kitabına baktım ve sonunda tüm örneklerin -fsonunda anahtar kullandığını fark ettim !

AFAICT bu kısıtlamaya gerek yok, ya da var mı ?! çünkü benim görüşüme göre anahtarlar sipariş ücretsiz olmalıdır.


2
@ schily komut satırlarına yaptığınız "düzeltmeniz" aslında hangi komutu yazdığını gizledi. Önde gelen bir çizgi, GNU tar'ın davranışını farklı bir bağımsız değişken ayrıştırıcısı kullanacak şekilde değiştirir. Hiçbir çizgi (ve böylece geleneksel argüman ayrıştırıcısı) kullanmadan, ikinci komut işe yarardı.
Random832

Web sistemindeki delta çıktısı size veya daha önce birisinin - eklediğini söyledi, bu yüzden sistemin OP'den söylediğini eşleştirmek için tekrar kaldırdım. Ancak haklıysanız gtar option parsing, gtar kullanmamanın başka bir nedenini keşfettiniz.
schily

1
-fdosya adının izlenmesini bekliyor. İkinci sürümünüzde, -fxv- tar için - dosya adının "xv" anlamına geldiğini belirttiniz.
Rolf

1
Zorunlu XKCD .
Pavel

Yanıtlar:


11

Hata mesajında baktığımızda, bunu kullandığınız vermedi açıktır tarziyade ancak gtar.

Genel olarak bu şeyleri anlamaya yardımcı olabilir:

  • tarnormalde her zaman bir dosya bağımsız değişkenine ihtiyaç duyar. Eksikse, sistemin varsayılan gerçek teyp aygıtına / aygıtından okuma / yazma yapar. star1982'de varsayılan olarak stdin / stdout kullanacak şekilde değiştirdi ve son zamanlarda diğer bazı katran uygulamaları (örn. gtar) izledi.

  • tarlider uygulamıyor -denir seçenekleri için key letterstar komutu durumunda. Bazı uygulamalar daha sonra -kullanıcıların rahatlığı için isteğe bağlı olmayan bir anahtar harfi olarak eklenmiştir , ancak buna güvenemezsiniz.

  • Bağımsız tardeğişkenlerini ayrıştırma şekli (özellikle arşiv dosyası bağımsız değişkeni) oldukça risklidir. İlgili dosya argümanı tar arşiv dosyası olarak alındığı için arşivde olması gereken dosyalardan birini yok eden birçok tar arşivini gördüm. starbu nedenle (yerel olarak adlandırılırsa star) "f" nin diğer seçeneklerle birleştirilmesine izin vermez. Olarak staradlandırılırsa tar, komut satırı uyumluluğunu uygular tar, ancak yine de "f" anahtar harfi için bağımsız değişkeni farklı şekilde işler: bağımsız değişkene yalnızca gerçek bir aygıt dosyasına başvuruyorsa veya dosya henüz yazmadığında (yazma modunda) izin verilir .

Riskli orijinal tar komut satırından kaçınmayı ve aldığınız modern daha güvenli komut satırı sözdizimini kullanmanızı öneririm star.

Sorunlu komut satırı sözdizimi nedeniyle tar, tar wars1990'ların başında sözde vardı . Sonuç olarak, program pax(katran savaşlarında "barış" için Latince) oluşturuldu ve standartlaştırıldı. paxancak sözdizimi katran sözdiziminden daha az riskli ancak daha az sezgisel olduğu için popülerlik kazanmamıştır. Başka bir sorun, gpaxaz ya da çok bakımsız olması olabilir.


3
Katran savaşları bitti. guntar kazandı.
Yeşu

2
Haklıysanız, tüm katran uygulamaları neden özellikleri kopyalar star?
schily

1
BTW: katran savaşları tarve arasında bir savaş oldu cpio.
schily

2
Tamam, bu yüzden star's ile başlayan dosya isimleri ile ilgili bir sorun -f"$file"da var gibi görünüyor . Yani ya da yazmak gerekir . Yıldız seçeneğinizi daha güvenli veya modern olarak ayrıştıracağımı bilmiyorum . ind=-f="$file"-f "$file"
Stéphane Chazelas

3
-longstil uzun seçenekleri yoğunlaştırılmış -xyzkısa seçeneklerle uyumlu değildir veya -xarg. Bu nedenle X11 stili uzun seçenekler, kısa seçeneklerin ayrı ( -x -ydeğil -xy) ve seçenek bağımsız değişkenlerinin ayrı bağımsız değişkenlerde ( xterm -n foodeğil xterm -nfoo) olmasını gerektirir. Bu yüzden GNU uzun seçeneklerinde, kısa seçeneklerle olası karışıklığı ortadan kaldırmak için ekstra bir çizgi var ve GNU tarzı uzun seçeneklerin neden daha iyi bir tasarım olduğunu. Ancak çakışmaları önlemek için çok dikkatli olmanız durumunda bir -fooarada bulunabilirsiniz -x -y -xy.
Stéphane Chazelas

55

Anahtarların sırası ücretsizdir, ancak okuma / yazma -fdosyası olan zorunlu bir bağımsız değişkeni vardır tar.

Yapabilirsin

tar -zf foo.tar.gz -xv

ve bu işe yarayacak ve spesifik olmayan bir anahtar sırası gereksinimine sahip olacaktır.

Bağımsız değişken içeren seçeneklere sahip tüm komutlar bu şekilde çalışır.


5
Tar, "ar" komutunda ve eski (POSIX öncesi) "ps" komutunda kullanılandan çok daha eski bir komut satırı ayrıştırıcısını kullandığından diğer komutlar gibi çalışmaz.
schily

1
Bunun için teşekkür ederim, seçilen cevap, ayrıntılı olsa da, sorunun özellikle ne olduğunu görmeme gerçekten izin vermedi. Geriye dönüp bakıldığında, tar 'xv' dosyasını okumaya çalıştığını belirten hata mesajından belli görünüyor
Josh Rumbut

1
Ben de bunu -f=./myfilef olarak bir değer alır, bir bayrak değil, bir girdi olarak ilan edebilirsiniz inanıyorum .
ThorSummoner

14

Geleneksel olarak, tar seçenekleri vardır az ya da çok "sipariş içermeyen" (sırası fve bhem belirtilirse seçenekleri madde yapmak). Önde gelen bir tire işareti kullanmak, GNU katranının seçenekleri diğer komutlarla daha tutarlı bir şekilde ayrıştırmasına neden olur; burada bağımsız değişken gerektiren bir seçenek belirtmek (dosya adı gibi f) hemen "kelimenin" geri kalanını tüketir, eğer varsa, argüman olarak (geleneksel olarak, tar bir sonraki sözcüğü fveya bbelirtildiğinde dosya adı / blok boyutu olarak kullanır ). Sizin durumunuzda, dosya adı olarak "xv" aldı.

Ancak bu davranış taşınabilirlik için kullanılamaz. Maksimum taşınabilirlik için, tire işareti kullanmaktan kaçınmalı, her zaman fen sonuncuyu koymalı ve her zaman fdosya adı ile arasında bir boşluk bırakmalısınız . Ancak bu, bseçeneğe veya genel olarak bir argüman gerektirmeyen herhangi bir seçeneğe (örneğin C) ihtiyacınız varsa bozulan bir sadeleştirmedir f.

Bu, Tar Manuel bölümünde "Üç Opsiyon Stili" bölümünde belgelenmiştir . Diğer bazı uygulamalar (ör. FreeBSD), eski stil seçeneklerine "paketli seçenek sözcüğü" olarak atıfta bulunur. Ve elbette, bazı uygulamalar yalnızca bu tür bir seçeneği destekleyebilir ve dahil edilirse bir tireyi görmezden gelebilir veya görmeyebilir. Bu, Tek Unix Spesifikasyonunda belirtilen tek invokasyon şeklidir ve bu nedenle hemen hemen tüm sistemlerde çalışacağı garanti edilir.


2
Bazı uygulamaların argümanlarla diğer seçenekleri desteklediğini unutmayın ( CBSD veya GNU tar gibi. Schily tar bunu -C olarak destekler, ancak C olarak değil, hepsi -C olarak destekler).
Stéphane Chazelas

0

Katranda, - in anahtarları yıllar önce kullanımdan kaldırılmıştır ve artık gerekli değildir. Tar aslında bunu söylerdi ama artık söylemezdi.

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

Both of these work fine without the -.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.