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 kita ke variabel, kemudian menggunakan xsetroot dengan variabel tersebut. Tapi saya masih ingin memahami mengapa ini tidak berfungsi dalam skrip.
Saya menyadari setiap perintah di kedua sisi pipa dijalankan di dalam subkulitnya sendiri, tetapi gagal melihat bagaimana variabel lokalnya dapat memengaruhi loop while read. Atau apakah variabel di luar cakupan bahkan di antara iterasi loop?
Apa yang saya lewatkan?
Pembaruan: sh
Saya menggunakan tertaut ke tanda hubung, yang sedang dalam proses dibuat agar sesuai dengan POSIX. Menggunakan bash
yang lebih terhormat memecahkan ini.
Jawaban yang Diterima:
Anda tampaknya menjalankan contoh pertama di bash
, dan yang kedua dalam apa pun yang ditunjukkan oleh /bin/sh
, yang merupakan shell POSIX yang membutuhkan argumen untuk diteruskan dengan menentukan variabel yang ingin Anda masukkan inputnya. Mengubah Shebang menjadi #!/bin/bash
harus memperbaiki ini.