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.
quelle
read
ohne eine Variable aufgerufen werden kann: pubs.opengroup.org/onlinepubs/9699919799/utilities/read.htmlAntworten:
Sie scheinen das erste Beispiel in
bash
und das zweite in/bin/sh
einer POSIX-Shell auszuführen, auf die ein Argument übergeben werden muss, das die Variable angibt, in die Sie die Eingabe eingeben möchten. Das Ändern des Shebang in#!/bin/bash
sollte dies beheben.quelle
sh
und nachlesenbash
./bin/sh
mit Bash verbinden, aber ich denke, ich würde Bash von nun an direkt verwenden, um Mehrdeutigkeiten zu vermeiden. Danke :)In sh-Syntax benötigen Sie
Einige Shells wie ksh, bash und zsh können
read
ohne Variablennamen aufgerufen werden, aber das Verhalten unterscheidet sich zwischen ihnen. Siehe zum Beispiel die Ausgabe vonunterscheidet sich bei allen bash, zsh, pdksh und ksh93
quelle