GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Warum funktioniert dieses „beim Lesen“ in einem Terminal, aber nicht in einem Shell-Skript?

Ich bin auf dieses interessante Problem gestoßen, als ich meine WM-Leiste mit Infotext gefüllt habe, der durch Festlegen des Titels des Stammfensters angewendet wird, z. B. xsetroot -name "clever words"

Zu diesem Zweck funktioniert das Drucken eines Vermögens in einem Terminal gut:

fortune -s | while read -r; do xsetroot -name "$REPLY"; done

Dasselbe schlägt jedoch fehl, wenn es von einem Shell-Skript ausgeführt wird:

#!/bin/sh
cat /tmp/afile | while read; do echo "$REPLY"; done

Erzeugt:

$ sh afilereader
afilereader:2:read:arg count

Natürlich wird dies behoben, indem wir unser Glücksergebnis einer Variablen zuweisen und dann xsetroot mit dieser Variablen verwenden. Aber ich würde trotzdem gerne verstehen, warum das funktioniert nicht in einem Skript.

Mir ist klar, dass jeder Befehl auf beiden Seiten der Pipeline in seiner eigenen Subshell ausgeführt wird, aber ich sehe nicht, wie sich ihre lokalisierten Variablen auf die While-Leseschleife auswirken könnten. Oder sind Variablen sogar zwischen den Schleifeniterationen außerhalb des Gültigkeitsbereichs?

Was übersehe ich?

Aktualisierung: Das sh I used is linked to dash, das gerade POSIX-kompatibel gemacht wird. Verwenden des ehrwürdigeren bash gelöst.

Akzeptierte Antwort:

Sie scheinen das erste Beispiel in bash auszuführen , und die zweite in was auch immer durch /bin/sh gezeigt wird , bei der es sich um eine POSIX-Shell handelt, bei der ein Argument übergeben werden muss, das die Variable angibt, in die Sie die Eingabe einfügen möchten. Änderung des Shebangs in #!/bin/bash sollte das beheben.


Linux
  1. Linux – Warum funktioniert Setuid nicht?

  2. Rm-Befehl im Bash-Skript funktioniert nicht mit Variablen?

  3. Warum funktioniert „zip“ in einer For-Schleife, wenn die Datei existiert, aber nicht, wenn sie nicht existiert?

  4. Warum funktioniert das Parent Shell Here-Dokument nicht für Unterbefehle in Dash, aber Bash funktioniert?

  5. Warum funktioniert `exit &` nicht?

Linux – Warum funktioniert Locale Es_mx, aber nicht Es?

Jede Möglichkeit, das Bash-Skript zu beenden, aber das Terminal nicht zu verlassen

Warum funktioniert Tomcat mit Port 8080, aber nicht mit 80?

Warum funktioniert das Bearbeiten von Javascript in den Chrome Developer Tools nicht?

Warum funktioniert „dd“ nicht zum Erstellen eines bootfähigen USB-Sticks?

Warum funktioniert diese Regex nicht unter Linux?