Untuk suatu perintah, jika digunakan -
sebagai argumen sebagai pengganti nama file berarti STDIN atau STDOUT.
Namun dalam contoh ini, ia membuat file dengan nama
-
:echo hello > -
Bagaimana saya bisa membuat
-
contoh ini berarti STDOUT?Sebaliknya, bagaimana saya bisa membuat
-
file berarti bernama-
dalam contoh seperti:cat -
2>&-
konstruksi, yang berarti "tutup keterangan 2".Jawaban:
Menggunakan
-
sebagai nama file berarti stdin / stdout adalah konvensi yang banyak digunakan program. Ini bukan properti khusus dari nama file. Kernel tidak mengenali-
sebagai istimewa sehingga panggilan sistem apa pun yang merujuk-
sebagai nama file akan digunakan-
secara harfiah sebagai nama file.Dengan pengalihan bash,
-
tidak dikenali sebagai nama file khusus, jadi bash akan menggunakannya sebagai nama file literal.Ketika
cat
melihat string-
sebagai nama file, itu memperlakukannya sebagai sinonim untuk stdin. Untuk menyiasatinya, Anda perlu mengubah string yangcat
melihat sedemikian rupa sehingga masih merujuk ke file yang disebut-
. Cara biasa untuk melakukan ini adalah dengan mengawali nama file dengan path -./-
, atau/home/Tim/-
. Teknik ini juga digunakan untuk mengatasi masalah serupa di mana opsi baris perintah berbenturan dengan nama file, jadi file yang disebut sebagai./-e
tidak muncul sebagai-e
opsi baris perintah ke suatu program, misalnya.sumber
/dev/stdin
dan/dev/stdout
tersedia secara universal dan dapat digunakan sebagai pengganti-
konvensi.cat
kasus ini, menggunakan pengalihan bukannya daftar argumen mungkin membantucat <-
:; namun, akan sulit untuk mencampur dan mencocokkannya dengan menggabungkan lebih dari satu file sekaligus.jmtd
atas pertanyaan itu? :)Alih-alih
echo hello > -
, Anda bisa menggunakanecho hello > /dev/stdout
.Sementara '-' adalah konvensi yang harus dilaksanakan oleh setiap program yang ingin mendukungnya
/dev/stdin
,,/dev/stdout
dan/dev/stderr
, ketika didukung oleh OS (setidaknya Solaris, Linux dan BSD lakukan), independen dari aplikasi dan kemudian akan berfungsi seperti yang Anda inginkan. berniat.sumber
Seperti yang disebutkan camh ,
-
hanyalah konvensi penamaan yang digunakan oleh beberapa program. Jika Anda ingin merujuk ke stream ini dengan deskriptor file yang akan dikenali shell, jiliagre benar karena Anda menggunakan namanya/dev/stdin
atau/dev/stdout
sebaliknya. Nama-nama file itu harus bekerja di mana saja nama file normal akan berfungsi.Yang sedang berkata, contoh pertama Anda agak konyol. Setiap output yang akan ditangkap oleh operator pengarah untuk menulis ke file sudah pada standar-output, jadi mengarahkan dan menulis kembali ke tempat asalnya tidak berguna. Perilaku yang Anda gunakan di sana adalah pipa, bukan redirect:
Dalam contoh kedua Anda, Anda hanya perlu memberikan beberapa indikasi bahwa Anda menginginkan file litteral dari nama itu, bukan alias internal yang dimilikinya. Anda dapat melakukan ini dengan termudah dengan menentukan jalur ke file seperti ini:
sumber
Adapun 1, program harus mendukungnya. Anda tidak bisa begitu saja menggunakannya secara sewenang-wenang. Adapun 2, mengarahkan input dari (misalnya,
cat < -
).sumber
Pendekatan '-' memiliki banyak masalah. Pertama-tama membutuhkan interpretasi karakter '-' dan banyak program tidak melakukan interpretasi seperti itu. Dan lebih jauh lagi, ada beberapa program yang menafsirkan tanda hubung sebagai pembatas menandai akhir opsi baris perintah. Program ditulis untuk bekerja dengan argumen nama file, pendekatan '-' adalah hack, bagus tapi lemah.
Cara terbaik adalah:
/dev/stdout
adalah tautan simbolik dari/dev/fd/1
sumber