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.