Editar: el título original era "la lectura falla en bash"
Con ksh estoy usando leer como una forma conveniente de separar valores:
$ echo 1 2 3 4 5 | read a b dump
$ echo $b $a 
2 1
$
Pero falla en bash:
$ echo 1 2 3 4 5 | read a b dump
$ echo $b $a 
$
No encontré una razón en la página del manual por la que falla, ¿alguna idea?

Respuestas:
bashejecuta el lado derecho de una tubería en un contexto de subshell , por lo que los cambios en las variables (que es lo quereadhace) no se conservan; mueren cuando la subshell lo hace, al final del comando.En su lugar, puede usar la sustitución de procesos :
En este caso,
readse ejecuta dentro de nuestro shell primario, y nuestro comando de producción de salida se ejecuta en el subshell. La<(...)sintaxis crea una subshell y conecta su salida a una tubería, que redirigimos a la entrada dereadcon la<operación ordinaria . Debido a que sereadejecutó en nuestro shell principal, las variables están establecidas correctamente.Como se señaló en un comentario, si su objetivo es literalmente dividir una cadena en variables de alguna manera, puede usar una cadena aquí :
Supongo que hay más que eso, pero esta es una mejor opción si no la hay.
fuente
read a b dump <<< '1 2 3 4 5'.cat /etc/passwd | (read -r line ; echo $line). Pero al ladoechode$linela cual no se encuentra en la tubería ponga nada en la pantalla, ya que fue existía justo valor entre paréntesis (subcapa). Esperanza, ayuda a alguien.Esto no es un
bashfallo quePOSIXpermite tantobashykshcomportamientos, lo que lleva a la desafortunada discrepancia que está observando.http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_12
Además, cada comando de una tubería de comandos múltiples está en un entorno de subshell; como extensión, sin embargo, cualquiera o todos los comandos en una tubería pueden ejecutarse en el entorno actual. Todos los demás comandos se ejecutarán en el entorno de shell actual.
Sin embargo, con
bash 4.2y más reciente, puede configurar lalastpipeopción en scripts no interactivos para obtener el resultado esperado, por ejemplo:Salida:
fuente
lastpipees que no funciona en otros shells (p. ej., guión). Básicamente no hay forma de hacer que este portátil no ejecute todo en esa subshell, consulte stackoverflow.com/questions/36268479/…