Saya mengalami masalah menarik ini saat mengisi bilah WM saya dengan teks info, yang diterapkan dengan mengatur judul jendela root, yaitu xsetroot -name "clever words"
Untuk tujuan ini, mencetak keberuntungan bekerja dengan baik di terminal:
fortune -s | while read -r; do xsetroot -name "$REPLY"; done
Namun hal yang sama gagal ketika dijalankan dari skrip shell:
#!/bin/sh
cat /tmp/afile | while read; do echo "$REPLY"; done
Menghasilkan:
$ sh afilereader
afilereader: 2: baca: arg count
Tentu saja ini diatasi dengan menetapkan hasil keberuntungan kami ke suatu variabel, kemudian menggunakan xsetroot dengan variabel tersebut. Tapi saya masih ingin mengerti mengapa ini tidak berhasil dalam naskah.
Saya menyadari bahwa setiap perintah di kedua sisi pipeline dijalankan di dalam subshell itu sendiri, tetapi gagal untuk melihat bagaimana variabel lokal mereka dapat mempengaruhi loop saat membaca. Atau apakah variabel berada di luar cakupan bahkan di antara iterasi loop?
Apa yang saya lewatkan?
Update: The sh
I digunakan terkait dengan dasbor, yang dalam proses yang dibuat POSIX compliant. Menggunakan yang lebih terhormat bash
memecahkan ini.
sumber
read
invocable tanpa variabel: pubs.opengroup.org/onlinepubs/9699919799/utilities/read.htmlJawaban:
Anda tampaknya menjalankan contoh pertama
bash
, dan yang kedua dalam apa pun yang ditunjukkan oleh/bin/sh
, yang merupakan shell POSIX yang membutuhkan argumen untuk dilewati menentukan variabel yang Anda ingin masukkan input. Mengubah shebang ke#!/bin/bash
harus memperbaiki ini.sumber
sh
danbash
./bin/sh
ke bash, tetapi saya pikir saya hanya akan menggunakan bash langsung dari sekarang, untuk menghindari ambiguitas. Terima kasih :)Dalam sintaksis sh, Anda perlu
Beberapa shell seperti ksh, bash dan zsh memungkinkan
read
untuk dipanggil tanpa nama variabel tetapi perilaku berbeda di antara mereka. Lihat misalnya output dariberbeda pada semua bash, zsh, pdksh dan ksh93
sumber