Na tento zajímavý problém jsem narazil při zaplňování mého WM panelu informačním textem, který se použije nastavením názvu kořenového okna, tj. xsetroot -name "clever words"
Za tímto účelem tisk jmění funguje v terminálu dobře:
fortune -s | while read -r; do xsetroot -name "$REPLY"; done
Přesto totéž selže při spuštění ze skriptu shellu:
#!/bin/sh
cat /tmp/afile | while read; do echo "$REPLY"; done
Vyrábí:
$ sh afilereader
afilereader:2:čtení:počet argumentů
Samozřejmě to lze napravit přiřazením našeho výsledku štěstěny do proměnné a poté pomocí xsetroot s uvedenou proměnnou. Ale přesto bych rád pochopil proč toto nefunguje ve skriptu.
Uvědomuji si, že každý příkaz na obou stranách potrubí je spouštěn v rámci jeho vlastního subshell, ale nevidím, jak by jejich lokalizované proměnné mohly ovlivnit smyčku při čtení. Nebo jsou proměnné mimo rozsah i mezi iteracemi smyčky?
Co mi chybí?
Aktualizace: sh
Použil jsem je propojen s pomlčkou, která je v procesu přizpůsobování POSIX. Použití úctyhodnějšího bash
vyřešil to.
Přijatá odpověď:
Zdá se, že spouštíte první příklad v bash
a druhý v čemkoli, na co ukazuje /bin/sh
, což je shell POSIX vyžadující předání argumentu určujícího proměnnou, do které chcete vložit vstup. Změna shebang na #!/bin/bash
by to mělo opravit.