GNU/Linux >> Znalost Linux >  >> Linux

Proč to „při čtení“ funguje v terminálu, ale ne ve skriptu Shell?

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.


Linux
  1. Proč regulární výraz funguje v X, ale ne v Y?

  2. Může být skript spustitelný, ale nečitelný?

  3. Proč „zip“ v A For Loop funguje, když soubor existuje, ale ne, když neexistuje?

  1. Jakýkoli způsob, jak ukončit bash skript, ale ne opustit terminál

  2. Moduly Pythonu nebyly nalezeny přes terminál, ale na python shell, Linux

  3. Shoda vzoru nefunguje ve skriptu bash

  1. Proč substituce procesu Bash nefunguje s některými příkazy?

  2. Linux – Proč Setuid nefunguje?

  3. Proč nefungují úpravy javascriptu v nástrojích pro vývojáře Chrome?