“Tar” yazısının “-” tire ile anlamı nedir?


23

Dropbox'ı komut satırından yüklemeye çalıştığımda komutları okudum

cd ~ && wget -O - "https://www.dropbox.com/download?plat=lnx.x86_64" | tar xzf -

-burada ne anlama geliyor? önceki dizin mi


9
Biraz soygun: sorduğunuz seçenek f -. Bu, man sayfalarında cevabı bulmayı biraz daha kolaylaştırabilir.
studog

4
Ne, açıklayabilir eğer gerçekten yararlı olacağını tam olarak belgelenmesi konusunda size net değildir wgetve tar. Bu şekilde, ilgili geliştiriciler dokümantasyonlarını geliştirebilir, böylece gelecekteki kullanıcılar yine aynı sorunları çözemezler. Başka bir deyişle: bir kahraman ol ve dünyayı daha iyi bir yer yap!
Jörg W Mittag

2
Tar'ın stdin kullanması iyi bir varsayılan olacaktır, ancak mirası bantlarla çalışmak olduğundan bunu yapmadı. Bunun yerine, dosyalarla (f seçeneğiyle) nasıl çalışacağını öğrendi ve daha sonra stdin için dosya isminin yerine (Create durumunda eXtract veya stdout olması durumunda)
eckes

1
GNU tar durumunda @eckes, Stdin olduğu sürece varsayılan $TAPEolarak ayarlanır.
chrylis

Yanıtlar:


42

Bazı komutlar -bir dosya adı yerine kabul eder :

  • Adlandırılmış bir dosya yerine standart çıktıya yazmak . -Argümanın wgetardından -Oyaptıkları buydu .
  • Adlandırılmış bir dosya yerine standart girdiden okumak için . -Argümanın tarsonradan geçtiği şey budur xzf.

Gösterdiğiniz komut bir arşiv dosyasını indirir wgetve onunla birlikte açılır tar. Bu amaca ulaşmak için, çıkış wgetIS borulu ( |girişine) tar. Bu yüzden wgetbir dosya yerine standart çıktıya yazar ve bir dosya taryerine standart girdiden okur.


Sadece "bazı komutlar" yerine "çoğu komut" derdim. POSIX seçenek sözdizimi belirtiminin bir parçası olduğuna inanıyorum.
Barmar

2
@Barmar Evet ve hayır: Kılavuz İlke 13: Okuma veya yazma için açılacak dosyaları temsil etmek için- operands kullanan araçlar için, '-' operand'ı yalnızca standart girdi (veya bağlamdan açık olduğunda standart çıktı) anlamına gelmek için kullanılmalıdır. bir çıktı dosyası belirtiliyor) ya da adlandırılmış bir dosya . . Yani eğer - bir "dosya seçeneği" için bir işlenendir ve özel bir anlamı vardır, o da Stdin / stdout'u o olmalıdır. Program özel bir durum olarak ele almak ve sadece dosyayı aramak için ücretsiz-
Bakuriu

(ve genellikle seçeneğin ihmal edilmesi durumunda, kullanmakla aynı olacaktır -)
Bakuriu

@Bakuriu Söylediklerimi nasıl çürütdüğünü anlamıyorum. Komutların çoğunun dosya adı argümanları aldığından şüpheleniyorum, bu yüzden bu kılavuzu takip etmeleri gerekiyordu. Ama belki de bunu "dosyalar üzerinde çalışan çoğu komut" olarak nitelemeliydim.
Barmar

1
@Barmar Kılavuza uymanın bir yolu, özel bir şekilde ele almayı reddetmek ve -bunu değişmez bir dosya adı olarak kabul etmektir . Kılavuza aykırı olmanın tek yolu, -özel olarak davranmak, ancak kılavuzun önerdiğinden farklı bir anlam ifade etmektir.
Eliah Kagan

12

Bu sadece Unix programlarının çoğunun "bir dosyayı açmak, okumak stdin(veya okumak) yerine" olarak adlandırdığı bir dosya adı stdout.

Bu, programa girilen girdiden okumak anlamına gelir; Senin durumunda, bu wget çıktısı.


6
Yine de gerçekten bir dosya adı mı?
Eric Duminil

7
@EricDuminil Programların, sadece dosya isimlerini kabul edebileceği bazı yerlerde kabul etmesi anlamında bir dosya adıdır, fakat bir dizindeki bir dosyanın asıl adı ile ilgili değildir.
JoL

5
@EricDuminil: Özellikle bu uylaşımını programlar için, kullanılan zorunda ./-eğer gerçekten adlı bir dosya açmak istiyor -.
Jörg W Mittag

4
@EricDuminil Aslında: evet! Bu isimler bir dosyayı ; unix anlamında, stdinbir dosya tanımlayıcısı ve -bunu kullanmak için sağladığınız ad. Yine de, işletim sisteminin bakış açısından bir dosya adı değil. Sadece kullanıcı bakış açısından.
Marcus Müller

3
@rexkogitans no. /dev/stdinbazı çekirdek olanakları tarafından sunulan kolaylık dosya adıdır. Stdin kullanmayı seçen bir program yazdığınızda genellikle hiçbir fopen("/dev/stdin", "r") yerde olmaz; sadece devam edin ve extern FILE* stdinlibc başlığınızın size sağladığı şeyi kullanın; Bu arada, bu tamsayı dosya tanımlayıcısı 0.
Marcus Müller

5

-Argüman tararşiv okunan gerektiğini belirttiğinden stdinbir dosya yerine. Gönderen GNU tar kılavuzuna :

Eğer kullanırsanız -bir şekilde arşiv-name , tar(listeleme veya dosyaların ayıklanması olduğunda) standart giriş arşivi okur

Diğer komutlar aynı davranışa sahiptir ve POSIX.1-2017 standardında belirtilmiştir :

İlke 13 :

Okuma veya yazma için açılacak dosyaları temsil eden operandları kullanan araçlar için, ' -' operand'ı yalnızca standart girdi (veya bir çıktı dosyasının belirtildiği bağlamdan netse standart çıktı) veya bir dosya anlamına gelmelidir. adlı -.

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.