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.