Lebih
Membaca nilai-nilai ke sebuah variabel shell dari pipa
Saya mencoba untuk mendapatkan bash untuk memproses data dari stdin yang akan disalurkan ke dalam, tapi tidak berhasil. Yang saya maksud adalah tidak ada pekerjaan berikut:
echo "hello world" | test=($(< /dev/stdin)); echo test=$test
test=
echo "hello world" | read test; echo test=$test
test=
echo "hello world" | test=`cat`; echo test=$test
test=
di mana saya ingin output untuk menjadi test=hello world
. I've mencoba menempatkan "," tanda kutip "$test"
yang doesn't bekerja dengan baik.
193
15
Gunakan
jika anda ingin membaca di banyak data dan bekerja pada setiap baris secara terpisah, anda bisa menggunakan sesuatu seperti ini:
jika anda ingin membagi garis menjadi beberapa kata, anda dapat menggunakan beberapa variabel pada x seperti ini:
atau:
Tapi segera setelah anda mulai untuk ingin melakukan sesuatu yang benar-benar pintar dengan hal semacam ini, anda're baik akan untuk beberapa bahasa script seperti perl di mana anda dapat mencoba sesuatu seperti ini:
Ada's cukup kurva belajar yang curam dengan perl (atau saya kira salah satu dari bahasa-bahasa ini) tapi anda'll menemukan ini jauh lebih mudah dalam jangka panjang jika anda ingin melakukan apa-apa tapi sederhana dari script. I'd merekomendasikan Perl Masak dan, tentu saja, Bahasa Pemrograman Perl oleh Larry Wall et al.
Ini adalah pilihan lain
baca
tidak't baca dari sebuah pipa (atau mungkin hasilnya hilang karena pipa menciptakan subkulit). Namun, anda dapat menggunakan berikut string di Bash:I'm tidak ahli dalam Bash, tapi aku bertanya-tanya mengapa ini tidak't telah diusulkan:
Satu-liner bukti bahwa ia bekerja untuk saya:
bash
4.2 memperkenalkanlastpipe
pilihan, yang memungkinkan kode anda untuk bekerja seperti yang tertulis, dengan mengeksekusi perintah terakhir dalam pipa pada shell saat ini, daripada subkulit.Sintaks untuk implisit pipa dari perintah shell ke bash variabel
atau
Dalam contoh anda, anda adalah pipa data untuk tugas pernyataan, yang tidak mengharapkan masukan apapun.
Upaya pertama adalah cukup dekat. Variasi ini harus bekerja:
dan output adalah:
Anda perlu kawat gigi setelah pipa untuk melampirkan tugas untuk menguji dan echo.
Tanpa kawat gigi, tugas untuk tes (setelah pipa) adalah dalam satu shell, dan echo "test=$test" di tempat terpisah shell yang doesn't tahu tentang penugasan itu. Yang's mengapa anda mendapatkan "test=" dalam output bukan "test=halo dunia".
Di mata saya cara terbaik untuk baca dari stdin di bash adalah yang berikut, yang juga memungkinkan anda bekerja pada garis sebelum input berakhir:
Karena aku jatuh untuk itu, saya ingin menjatuhkan catatan. Saya menemukan thread ini, karena saya harus menulis ulang tua sh script untuk menjadi POSIX compatible. Ini pada dasarnya berarti untuk menghindari pipa/subkulit masalah yang diperkenalkan oleh POSIX dengan menulis ulang kode seperti ini:
ke:
Pipa sesuatu ke suatu ekspresi yang melibatkan tugas doesn't berperilaku seperti itu.
Sebaliknya, cobalah:
Kode berikut:
akan bekerja juga, tapi itu akan membuka lagi baru sub-shell setelah pipa, di mana
won't.
Aku harus menonaktifkan kontrol pekerjaan untuk membuat penggunaan [chepnars][1]' metode (saya menjalankan perintah ini dari terminal):
Saya pikir anda mencoba untuk menulis sebuah skrip shell yang bisa mengambil input dari stdin. tapi saat anda mencoba untuk melakukannya inline, anda tersesat mencoba untuk membuat bahwa tes= variabel. Saya pikir itu tidak masuk akal untuk melakukannya inline, dan yang's mengapa hal itu tidak bekerja seperti yang anda harapkan.
Saya mencoba untuk mengurangi
untuk mendapatkan baris tertentu dari berbagai input. jadi saya bisa mengetik...
jadi saya perlu kecil program shell dapat baca dari stdin. seperti yang anda lakukan.
di sana anda pergi.
Pintar script yang dapat membaca data dari PIPA dan argumen baris perintah:
Output:
Penjelasan: Ketika sebuah script menerima data melalui pipa, maka stdin /proc/self/fd/0 akan symlink ke pipa.
Jika tidak, hal itu akan mengarah ke terminal saat ini:
Bash
jika -p
pilihan dapat memeriksa itu adalah pipa atau tidak.kucing
membaca daristdin
.Jika kita menggunakan
kucing
ketika tidak adastdin
, itu akan menunggu selamanya, itu sebabnya kami menempatkan itu di dalamjika
kondisi.Bagaimana dengan ini: