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.
fuente
read
sea invocable sin una variable: pubs.opengroup.org/onlinepubs/9699919799/utilities/read.htmlRespuestas:
Parece que está ejecutando el primer ejemplo
bash
, y el segundo en lo que sea que señale/bin/sh
, que es un shell POSIX que requiere que se pase un argumento que especifique la variable en la que desea ingresar la entrada. Cambiar el shebang a#!/bin/bash
debería solucionar esto.fuente
sh
ybash
./bin/sh
a vincular a bash, pero creo que solo usaría bash directamente de ahora en adelante, para evitar la ambigüedad. Gracias :)En la sintaxis sh, necesitas
Algunos shells como ksh, bash y zsh permiten
read
ser llamados sin un nombre de variable, pero el comportamiento difiere entre ellos. Ver por ejemplo la salida deque difieren en todos los bash, zsh, pdksh y ksh93
fuente