GNU/Linux >> Belajar Linux >  >> Linux

Mengapa "sementara Baca" Ini Bekerja Di Terminal, Tapi Tidak Di Skrip Shell?

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.


Linux
  1. Bisakah Skrip Dapat Dieksekusi Tetapi Tidak Dapat Dibaca?

  2. Linux – Mengapa Es_mx Lokal Bekerja Tapi Tidak Es?

  3. Mengapa `zip` Dalam A For Loop Bekerja Saat File Ada, Tapi Tidak Saat Tidak?

  1. Mengapa Dokumen Induk Shell Di Sini Tidak Berfungsi Untuk Sub-perintah Di Dash Tapi Bash Bekerja?

  2. Mengapa `keluar &` Tidak Berfungsi?

  3. Mengapa find -exec mv {} ./target/ + tidak berfungsi?

  1. Cara apa pun untuk keluar dari skrip bash, tetapi tidak keluar dari terminal

  2. Mengapa Tomcat bekerja dengan port 8080 tetapi tidak dengan 80?

  3. Modul Python tidak ditemukan di terminal tetapi di shell python, Linux