GNU/Linux >> Tutoriales Linux >  >> Linux

¿Por qué este "mientras se lee" funciona en una terminal, pero no en un script de Shell?

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.


Linux
  1. ¿Por qué la sustitución del proceso Bash no funciona con algunos comandos?

  2. Linux:¿por qué no funciona Setuid?

  3. Linux – ¿Por qué Locale Es_mx funciona pero no Es?

  4. ¿Por qué el documento principal Shell Here no funciona para el subcomando en Dash pero Bash funciona?

  5. ¿Por qué `exit &` no funciona?

¿El comando Rm en Bash Script no funciona con variables?

¿Por qué `zip` en un bucle For funciona cuando el archivo existe, pero no cuando no existe?

Cualquier forma de salir del script bash, pero sin salir de la terminal

¿Por qué Tomcat funciona con el puerto 8080 pero no con el 80?

¿Por qué no funciona la edición de javascript en Chrome Developer Tools?

¿Por qué esta expresión regular no funciona en Linux?