Jawaban:
Dalam hal ini, itu berarti 'input standar'. Ini digunakan oleh beberapa perangkat lunak (misalnya tar
) ketika argumen file diperlukan dan Anda harus menggunakan stdin sebagai gantinya. Ini bukan shell konstruksi dan itu tergantung pada program yang Anda gunakan. Periksa halaman manual jika ragu!
Dalam hal ini, input standar adalah argumen ke -f
opsi. Dalam kasus di mana -
tidak didukung, Anda dapat menggunakan sesuatu seperti tar xvf /proc/self/fd/0
atau tar xvf /dev/stdin
(yang terakhir didukung secara luas di berbagai kesatuan).
Jangan mengandalkan ini berarti 'input standar' secara universal. Karena tidak ditafsirkan oleh shell, setiap program bebas untuk menghadapinya sesuka hati. Dalam beberapa kasus, ini merupakan output standar atau sesuatu yang sama sekali berbeda: di su
atasnya menandakan 'memulai shell login'. Dalam kasus lain, itu tidak ditafsirkan sama sekali. Memori otot telah membuat saya membuat beberapa file bernama -
karena beberapa versi dari beberapa program saya terbiasa tidak mengerti tanda hubung.
STDOUT
, tergantung pada konteksnya.
/dev/stdin
atau /dev/stdout
dapat digunakan jika Anda benar-benar menginginkan aliran input / output. Perhatikan bahwa ini adalah streaming, program yang ingin mencari dalam file mungkin tidak berfungsi sebagaimana mestinya -
(seperti ffmpeg)
bash
, tanda hubung yang ditafsirkan oleh shell. Lihat Panduan Bash-Scripting Lanjutan - Bab 3. Karakter Khusus , lalu cari teks [tanda hubung] atau "pengalihan dari / ke stdin atau stdout". Menggunakan bash
Anda dapat menggunakan tanda hubung di sebagian besar tempat mengharapkan nama file. Ini pelengkap yang jelas untuk <| > IMHO
cat
menangani -
(periksa halaman manual). Versi shell-builtin cat
mungkin atau mungkin tidak, tapi itu tidak sepenuhnya seluruh shell. Juga, jika shell ditangani -
, Anda bisa mengatakan gema -
dan itu akan berkembang ke sesuatu yang lain. Sebagai gantinya, itu hanya menggemakan tanda hubung (tidak /dev/stdin
atau /proc/self/fd/0
). Dan echo test > -
hanya membuat file bernama -
, jadi jelas tidak menangani di sana juga. Oh, dan halaman yang Anda daftarkan tidak mengatakan itu ditangani oleh shell , ia mengatakan Anda dapat menggunakannya dengan cat
dan diff
, yang keduanya mengerti tanda hubung secara eksplisit.
Dalam hal ini, -
ini sebenarnya sangat tidak berguna, dengan asumsi Anda menjalankan Linux:
GNU tar (versi di Linux) menerima inputnya dari input standar secara default. Jika Anda tidak ingin perilaku ini, dan ingin meneruskan nama file sebagai argumen baris perintah, maka Anda perlu menentukan tanda f
:
tar xf filename
Jadi ini sama dengan
tar x < filename
Atau, jika inputnya di-gzip seperti pada contoh Anda:
gzip -dc filename | tar x
Sama sekali tidak bermakna untuk menentukan f
flag di sini, tetapi karena sudah ditentukan, nama file perlu diberikan -
untuk menunjukkan bahwa kita ingin membaca dari input standar (lihat jawaban lain). Jadi, ulangi, ini berlebihan dan sedikit aneh.
Selain itu, baris di atas dapat disederhanakan karena tar GNU dapat diperintahkan untuk mengalirkan input melalui gzip
dirinya sendiri dengan menentukan z
flag:
tar xfz filename
- Tidak perlu menelepon gzip
secara eksplisit.
tar
memiliki z
opsi.
tar
default ke tape drive pertama, karena alasan historis.
/dev/sa0
pada FreeBSD 9.0, /dev/rst0
pada NetBSD 6.0 dan OpenBSD 5.1). AIX 7.1 default ke /dev/rmt0
. MINIX3 default ke /dev/sa0
. (Saya memeriksa versi OS terbaru dalam setiap kasus, ini bukan "mainframe lama".) Solaris dapat dikonfigurasi melalui file di /etc
, yang saya pikir default untuk tape drive. GNU tar, tar Schilling, OSX dan BusyBox default ke stdin / stdout.
tar
ke default ke drive tape kedua , untuk alasan yang jelas. :)
-
tidak perlu berada di akhir perintah. Sebagai contoh:ls -l | diff - /old_ls_output.txt
.