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:
bash
ejecuta el lado derecho de una tubería en un contexto de subshell , por lo que los cambios en las variables (que es lo queread
hace) 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,
read
se 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 deread
con la<
operación ordinaria . Debido a que seread
ejecutó 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 ladoecho
de$line
la 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
bash
fallo quePOSIX
permite tantobash
yksh
comportamientos, 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.2
y más reciente, puede configurar lalastpipe
opción en scripts no interactivos para obtener el resultado esperado, por ejemplo:Salida:
fuente
lastpipe
es 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/…