Me encontré con este interesante problema mientras llenaba mi barra WM con texto de información, que se aplica configurando el título de la ventana raíz, es decir xsetroot -name "clever words"
Para 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: read: arg count
Por supuesto, esto se soluciona asignando nuestro resultado de fortuna a una variable, luego usando xsetroot con dicha variable. Pero todavía me gustaría entender por qué esto no funciona en un script.
Me doy cuenta de que cada comando a cada lado de la tubería se ejecuta dentro de su propio subshell, pero no veo cómo sus variables localizadas podrían afectar el ciclo while read. ¿O las variables están fuera del alcance incluso entre las iteraciones del bucle?
¿Qué me estoy perdiendo?
Actualización: Lo sh
que utilicé está vinculado al guión, que está en proceso de cumplir con POSIX. Usando el más venerable bash
resuelto esto.
read
sea invocable sin una variable: pubs.opengroup.org/onlinepubs/9699919799/utilities/read.html