Bagaimana saya bisa mengirim karakter ke perintah seolah-olah mereka berasal dari file?
Misalnya saya mencoba:
wc < "apple pear orange"
-bash: apple pear orange: No such file or directory
Dalam shell yang mendukung string di sini , termasuk bash
, zsh
dan ksh93
, Anda dapat menggunakan
wc <<< "apple pear orange"
Dua pendekatan lain (yang memungkinkan input berganda tanpa usaha ekstra):
Gunakan "di sini dokumen":
The
EOF
string pembatas. Anda dapat menggunakan string apa pun;EOF
hanyalah pilihan konvensional.Gunakan tty sebagai input:
Ini memiliki kelemahan bahwa program mulai berjalan, dan mulai membaca input, segera setelah Anda mengetik namanya. Ini bisa membingungkan; sebagai contoh:
sumber
<<<
Formulir ini juga memungkinkan input beberapa baris tanpa usaha ekstra, karena"
string-tertutup dapat berisi baris baru. Tentu saja<< EOF
formulir (sintaksis sini-doc asli) lebih mudah dibaca jika Anda memiliki input multi-line.<<<
word
- tentu saja, dalam konteks shell, aword
dapat berupa string yang dikutip, berisi spasi dan baris baru! Doh! Itu sangat jelas sehingga tidak perlu dikatakan (dan, pada kenyataannya, saya tidak melihatnya disebutkan di halaman manual sama sekali). :-( Terima kasih telah menunjukkan ini kepada saya!word
didefinisikan dalam halaman manual sebagai "Urutan karakter yang dianggap sebagai satu unit oleh shell" (alias "token"), dan Anda perlu tahu bahwa string yang dikutip diperlakukan sebagai "unit tunggal" dalam arti yang relevan (setelah pemrosesan backslash, ekspansi variabel, dll. "Tetapi memang itulah tujuan dari double-quoting di shell. (Kutipan tunggal juga melindungi dari ekspansi.) Model pemrosesan shell dipikirkan dengan sangat baik, dan apa pun kecuali hal sederhana.Meskipun ada beberapa solusi yang valid di sini, sintaks lain yang terkadang bermanfaat, adalah menjalankan perintah
<()
. Ini akan memungkinkan Anda untuk membuat lebih dari 1 objek file-deskriptor pada baris perintah.Ini bisa berguna ketika Anda melakukan sesuatu seperti membandingkan string teks yang panjang, atau jika Anda ingin membedakan beberapa konten yang tidak ada dalam file.
Misalnya, membandingkan file host pada dua node tanpa harus menyalin file host ke localhost:
The
<
pengalihan file untuk STDIN, dan()
membuat subkulit untuk menjalankan perintah antara kurung. Ini adalah STDOUT dari subkulit yang diteruskan ke STDIN dari perintah yang sedang dijalankan.Ini adalah cara yang lebih mudah untuk membuat lebih dari 1 input "file" ke suatu perintah daripada mencoba menggunakan banyak dokumen di sini, atau mencoba untuk menggemakan beberapa perintah ke dalam sebuah pipa ke perintah terakhir.
sumber
<fileorpathname
arahan ulang stdin, tetapi<(subcmd)
tidak; itu mengganti nama yang ketika / jika dibuka oleh program dapat membaca stdout dari subcmd.< <(subcmd)
(diperlukan ruang) melakukan redirect stdin dari file itu, hampir sepertisubcmd |
. Andadiff
dapat membaca salah satu inputnya dari stdin dengan menentukan argumen-
tetapi tidak keduanya.cmd <(cmd2 ...)
dancmd < <(cmd2 ...)
. Yang pertama memungkinkan data yang diturunkan (output dari cmd2) untuk digunakan di tempat nama file. Yang terakhir ini setara dengancmd2 ... | cmd
. Perintah harus ditulis untuk secara eksplisit menerima input stdin dan banyak yang tidak. Ini terutama berlaku untuk skrip shell.Anda bisa menggunakan pipa
sumber
Anda mungkin ingin menggunakan sesuatu yang mirip dengan yang diharapkan. Berikut ini adalah contoh sederhana dari membuka sesi telnet jarak jauh, menunggu konfirmasi, mengirim beberapa data, menunggu tanggapan, tidur dan keluar.
sumber