GNU/Linux >> Tutoriels Linux >  >> Linux

Pourquoi ce "pendant la lecture" fonctionne-t-il dans un terminal, mais pas dans un script shell ?

J'ai rencontré ce problème intéressant en remplissant ma barre WM avec du texte d'information, qui est appliqué en définissant le titre de la fenêtre racine, c'est-à-dire xsetroot -name "clever words"

Pour cela, imprimer une fortune fonctionne bien dans un terminal :

fortune -s | while read -r; do xsetroot -name "$REPLY"; done

Pourtant, cela échoue lorsqu'il est exécuté à partir d'un script shell :

#!/bin/sh
cat /tmp/afile | while read; do echo "$REPLY"; done

Produit :

$ sh afilereader
afilereader :2 :lecture :nombre d'arguments

Bien sûr, cela est résolu en affectant notre résultat de fortune à une variable, puis en utilisant xsetroot avec ladite variable. Mais j'aimerais quand même comprendre pourquoi cela ne fonctionne pas dans un script.

Je me rends compte que chaque commande de chaque côté du pipeline est exécutée dans son propre sous-shell, mais je ne vois pas comment leurs variables localisées pourraient affecter la boucle de lecture while. Ou les variables sont-elles hors de portée même entre les itérations de la boucle ?

Qu'est-ce que je rate ?

Mise à jour : Le sh J'ai utilisé est lié à dash, qui est en train d'être rendu conforme à POSIX. Utilisation du plus vénérable bash résolu cela.

Réponse acceptée :

Vous semblez exécuter le premier exemple dans bash , et le second dans tout ce qui est pointé par /bin/sh , qui est un shell POSIX nécessitant la transmission d'un argument spécifiant la variable dans laquelle vous souhaitez placer l'entrée. Changer le shebang en #!/bin/bash devrait résoudre ce problème.


Linux
  1. Pourquoi l'expression régulière fonctionne-t-elle dans X mais pas dans Y ?

  2. Pourquoi find -exec mv {} ./target/ + ne fonctionne-t-il pas ?

  3. Pourquoi ce pipeline shell sort-il ?

  4. Pourquoi Tomcat fonctionne-t-il avec le port 8080 mais pas 80 ?

  5. Modules Python introuvables sur le terminal mais sur le shell Python, Linux

Pourquoi "zip" dans une boucle For fonctionne-t-il lorsque le fichier existe, mais pas lorsqu'il n'existe pas ?

Pourquoi le parent Shell Here-document ne fonctionne pas pour la sous-commande dans Dash mais Bash fonctionne?

Pourquoi `exit &` ne fonctionne pas ?

N'importe quel moyen de quitter le script bash, mais sans quitter le terminal

Pourquoi la modification de javascript dans les outils de développement Chrome ne fonctionne-t-elle pas ?

Pourquoi 'dd' ne fonctionne-t-il pas pour créer une clé USB amorçable ?