Apa arti tanda hubung “-” dalam “tar xzf -”?

23

Ketika mencoba menginstal dropbox dari baris perintah, saya membaca perintah

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

apa yang dimaksud di -sini apakah itu direktori sebelumnya?

Aljabar
sumber
9
Sedikit kesedihan: opsi yang Anda tanyakan adalah f -. Ini mungkin membuat menemukan jawabannya di halaman manual sedikit lebih mudah.
pejantan
4
Akan sangat membantu jika Anda bisa menjelaskan apa, tepatnya tidak jelas kepada Anda tentang dokumentasi wgetdan tar. Dengan begitu, masing-masing pengembang dapat meningkatkan dokumentasi mereka sehingga pengguna di masa depan tidak tersandung masalah yang sama lagi. Dengan kata lain: jadilah pahlawan dan jadikan dunia tempat yang lebih baik!
Jörg W Mittag
2
Ini akan menjadi default yang bagus untuk tar untuk menggunakan stdin, tetapi karena itu adalah warisan untuk bekerja dengan kaset, itu tidak melakukan itu. Alih-alih ia belajar bagaimana bekerja dengan file (dengan opsi f) dan kemudian mengikuti konvensi untuk memiliki - di tempat nama file untuk stdin (Dalam kasus eXtract atau stdout dalam kasus Buat)
eckes
1
@eckes Dalam kasus GNU tar, stdin adalah default kecuali $TAPEdiatur.
chrylis -on strike-

Jawaban:

42

Beberapa perintah menerima -menggantikan nama file, baik:

  • Untuk menulis ke output standar, bukan ke file bernama. Inilah yang dilakukan -argumen wgetsetelah -Omelakukan.
  • Untuk membaca dari input standar, bukan dari file bernama. Inilah yang -dilontarkan tarsetelah argumen xzf.

Perintah yang Anda perlihatkan mengunduh file arsip dengan wgetdan membukanya tar. Untuk mencapai hal ini, output dari wgetyaitu pipa ( |) ke input dari tar. Inilah sebabnya mengapa wgetmenulis ke output standar, bukan file dan tarmembaca dari input standar, bukan file.

Eliah Kagan
sumber
Saya akan mengatakan "sebagian besar perintah" daripada hanya "beberapa perintah". Saya percaya itu bagian dari spesifikasi sintaksis opsi POSIX.
Barmar
2
@Barmar Ya dan tidak: Pedoman 13: Untuk utilitas yang menggunakan operan untuk mewakili file yang akan dibuka baik untuk membaca atau menulis, operan '-' harus digunakan hanya berarti input standar (atau output standar ketika jelas dari konteks yang file output sedang ditentukan) atau file bernama -. . Jadi jika - operan untuk "opsi file" dan memiliki arti khusus, maka itu harus dari stdin / stdout. Program ini bebas untuk tidak diperlakukan sebagai kasus khusus dan hanya mencari file-
Bakuriu
(dan biasanya dalam kasus-kasus yang menghilangkan opsi akan sama dengan menggunakan -)
Bakuriu
@ Bakuriu Saya tidak melihat bagaimana itu menyanggah apa yang saya katakan. Saya menduga sebagian besar perintah mengambil argumen nama file, jadi mereka seharusnya mengikuti pedoman itu. Tapi mungkin saya harus menyebutnya sebagai "sebagian besar perintah yang beroperasi pada file".
Barmar
1
@Barmar Salah satu cara untuk mengikuti panduan ini adalah menolak untuk memperlakukan -secara khusus sama sekali, memperlakukannya sebagai nama file literal. Satu-satunya cara untuk menentang pedoman adalah dengan memperlakukan -secara khusus tetapi dengan makna lain dari yang disarankan oleh pedoman tersebut.
Eliah Kagan
12

Itu hanya nama file yang ditafsirkan oleh banyak program Unix sebagai "alih-alih membuka file, membaca dari stdin(atau menulis ke stdout)."

Itu berarti membaca dari input yang dialirkan ke program; dalam kasus Anda, itulah output dari wget.

Marcus Müller
sumber
6
Apakah ini benar-benar nama file ?
Eric Duminil
7
@EricDuminil Ini adalah nama file dalam arti bahwa program menerimanya di beberapa tempat di mana mereka hanya akan menerima nama file, tetapi Anda benar bahwa itu bukan tentang nama sebenarnya dari file di beberapa direktori.
JoL
5
@EricDuminil: Khususnya, untuk program yang mengikuti konvensi ini, Anda harus menggunakan ./-jika Anda benar - benar ingin membuka file bernama -.
Jörg W Mittag
4
@EricDuminil Faktanya: ya! Ini nama sebuah file yang ; dalam arti unix, stdinadalah deskriptor file, dan -adalah nama yang Anda berikan untuk menggunakannya. Tapi itu bukan nama file dari perspektif OS. Hanya dari perspektif pengguna.
Marcus Müller
3
@rexkogitans no. /dev/stdinhanyalah nama file kenyamanan yang ditawarkan oleh beberapa fasilitas kernel. Biasanya tidak ada yang fopen("/dev/stdin", "r") terjadi di mana pun ketika Anda menulis sebuah program yang memilih untuk menggunakan stdin; Anda langsung saja menggunakan extern FILE* stdinheader libc yang disediakan untuk Anda; omong-omong, itu adalah deskriptor file integer 0.
Marcus Müller
5

The -argumen untuk tarmenetapkan bahwa arsip harus dibaca dari stdinbukan file. Dari manual tar GNU :

Jika Anda menggunakan -sebagai nama arsip , tarbaca arsip dari input standar (saat mendaftar atau mengekstrak file)

Perintah lain memiliki perilaku yang sama, dan itu ditentukan oleh standar POSIX.1-2017 :

Pedoman 13 :

Untuk utilitas yang menggunakan operan untuk mewakili file yang akan dibuka untuk membaca atau menulis, -operan ' ' harus digunakan untuk berarti hanya input standar (atau output standar ketika jelas dari konteksnya bahwa file output sedang ditentukan) atau file bernama -.

Tim
sumber