Apa arti tanda hubung “-” di akhir perintah?

78

Diberi perintah berikut:

gzip -dc /cdrom/cdrom0/file.tar.gz | tar xvf 

Apa artinya -di akhir perintah? Apakah ini semacam placeholder?

Eugene S
sumber
3
Satu detail kecil untuk menyebutkan: -tidak perlu berada di akhir perintah. Sebagai contoh: ls -l | diff - /old_ls_output.txt.
manatwork

Jawaban:

82

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 -fopsi. Dalam kasus di mana -tidak didukung, Anda dapat menggunakan sesuatu seperti tar xvf /proc/self/fd/0atau 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 suatasnya 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.

Alexios
sumber
4
Ini juga bisa berarti STDOUT, tergantung pada konteksnya.
bahamat
3
Dan hampir semua hal lain, tergantung pada program individu untuk menafsirkannya.
Alexios
5
/dev/stdinatau /dev/stdoutdapat 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)
Lekensteyn
3
Dalam kasus 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 bashAnda dapat menggunakan tanda hubung di sebagian besar tempat mengharapkan nama file. Ini pelengkap yang jelas untuk <| > IMHO
bsd
4
Saya tidak yakin itu masalahnya. Pertama, catmenangani -(periksa halaman manual). Versi shell-builtin catmungkin 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/stdinatau /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 catdan diff, yang keduanya mengerti tanda hubung secara eksplisit.
Alexios
13

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 fflag 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 gzipdirinya sendiri dengan menentukan zflag:

tar xfz filename

- Tidak perlu menelepon gzipsecara eksplisit.

Konrad Rudolph
sumber
1
Catatan: tidak semua tarmemiliki zopsi.
liori
2
Sebagian besar OS selain Linux memiliki tardefault ke tape drive pertama, karena alasan historis.
Gilles
1
@Gilles dan BSD, dan OS X, .... Tapi saya ingin tahu: sistem apa yang lain kecuali dalam beberapa mainframe lama masih menggunakan versi seperti itu (sistem apa selain mainframe bahkan memiliki tape drive)?
Konrad Rudolph
1
@KonradRudolph Ketiga BSD utama default untuk tape drive ( /dev/sa0pada FreeBSD 9.0, /dev/rst0pada 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.
Gilles
1
@Gilles - Saya mengkompilasi ulang tarke default ke drive tape kedua , untuk alasan yang jelas. :)
David Harkness