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, d. H. xsetroot -name "clever words"
Zu diesem Zweck funktioniert das Drucken eines Vermögens in einem Terminal einwandfrei:
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
Produziert:
$ sh afilereader
afilereader: 2: read: arg count
Dies wird natürlich behoben, indem wir unser Vermögensergebnis einer Variablen zuweisen und dann xsetroot mit dieser Variablen verwenden. Aber ich würde immer noch gerne verstehen, warum dies in einem Skript nicht funktioniert.
Ich erkenne, dass jeder Befehl auf beiden Seiten der Pipeline in einer eigenen Subshell ausgeführt wird, sehe jedoch nicht, wie sich ihre lokalisierten Variablen auf die while-Leseschleife auswirken können. Oder liegen Variablen auch zwischen den Schleifeniterationen außerhalb des Gültigkeitsbereichs?
Was vermisse ich?
Update: Das von sh
mir verwendete ist mit einem Dash verknüpft, der gerade POSIX-konform gemacht wird. Mit dem ehrwürdigeren bash
löste dies.
read
ohne eine Variable aufgerufen werden kann: pubs.opengroup.org/onlinepubs/9699919799/utilities/read.html