Me encontré con este problema interesante al llenar mi barra de WM con texto de información, que se aplica configurando el título de la ventana raíz, es decir, xsetroot -name "clever words"
Con este fin, imprimir una fortuna funciona bien en una terminal:
fortune -s | while read -r; do xsetroot -name "$REPLY"; done
Sin embargo, eso mismo falla cuando se ejecuta desde un script de shell:
#!/bin/sh
cat /tmp/afile | while read; do echo "$REPLY"; done
Produce:
$ sh afilereader
afilereader:2:leer:recuento de argumentos
Por supuesto, esto se soluciona asignando nuestro resultado de fortuna a una variable y luego usando xsetroot con dicha variable. Pero aún me gustaría entender por qué esto no funciona en un script.
Me doy cuenta de que cada comando en cualquier lado de la canalización se ejecuta dentro de su propia subcapa, pero no veo cómo sus variables localizadas podrían afectar el ciclo de lectura. ¿O las variables están fuera del alcance incluso entre las iteraciones del ciclo?
¿Qué me estoy perdiendo?
Actualización: El sh
Utilicé está vinculado a dash, que está en proceso de ser compatible con POSIX. Usando el más venerable bash
resolvió esto.
Respuesta aceptada:
Parece que estás ejecutando el primer ejemplo en bash
, y el segundo en lo que apunta /bin/sh
, que es un shell POSIX que requiere que se pase un argumento que especifique la variable en la que desea colocar la entrada. Cambiando el shebang a #!/bin/bash
debería arreglar esto.