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.
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:
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. :)
-
tidak perlu berada di akhir perintah. Sebagai contoh:ls -l | diff - /old_ls_output.txt
.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 sepertitar xvf /proc/self/fd/0
atautar 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.sumber
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". Menggunakanbash
Anda dapat menggunakan tanda hubung di sebagian besar tempat mengharapkan nama file. Ini pelengkap yang jelas untuk <| > IMHOcat
menangani-
(periksa halaman manual). Versi shell-builtincat
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
). Danecho 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 dengancat
dandiff
, 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
:Jadi ini sama dengan
Atau, jika inputnya di-gzip seperti pada contoh Anda:
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 menentukanz
flag:- Tidak perlu menelepon
gzip
secara eksplisit.sumber
tar
memilikiz
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. :)