Necesito leer algunos datos de configuración en variables de entorno en un script bash.bash coproc y salida coproc sobrante
El patrón "obvio" (pero incorrecta) es:
egrep "pattern" config-file.cfg | read VAR1 VAR2 VAR3 etc...
Esta falla porque el read
está dirigido de una subcapa y por lo tanto no puede establecer variables en la cáscara que invoque. Así que se me ocurrió esto como una alternativa
coproc egrep "pattern" config-file.cfg
read -u ${COPROC[0]} VAR1 VAR2 VAR3 etc...
que funciona bien.
Para probar qué sucede si el coproceso vuelve más de una línea, he intentado esto:
coproc cat config-file.cfg
read -u ${COPROC[0]} VAR1 VAR2 VAR3 etc...
donde config-file.cfg
contiene tres líneas.
$ cat config-file.cfg
LINE1 A1 B1 C1
LINE2 A2 B2 C2
LINE3 A3 B3 C3
Esperaba que esto procesara la primera línea del archivo, seguido de algún tipo de mensaje de error de "tubería rota". Si bien hizo procesar la primera línea, no hubo ningún mensaje de error y no se dejó ningún proceso en curso.
Así que luego trató lo siguiente en una secuencia de comandos:
$ cat test.sh
coproc cat config-file.cfg
read -u ${COPROC[0]} VAR1 VAR2 VAR3 VAR4
echo $VAR1 $VAR2 $VAR3 $VAR4
wait
echo $?
Ejecutarlo:
$ bash -x test.sh
+ read -u 63 VAR1 VAR2 VAR3 VAR4
+ cat config-file.cfg
LINE1 A1 B1 C1
+ wait
+ echo 0
0
¿Dónde han ido las dos líneas restantes? Hubiera esperado que se colgara el "tubo roto" o el wait
, ya que no había nada para leer las líneas restantes, pero como pueden ver, el código de retorno era cero.
A menos que me falta algo, algo como 'leer VAR1 VAR2 VAR3 <<(egrep" patrón "config-file.cfg)" sería suficiente, ¿no? –
@ShawnChin: eso está ignorando la pregunta. Los Coprocs son geniales por buenas razones para que el OP no tenga que explicar primero – sehe
Disculpe mi ignorancia. Admito que los coprocs son geniales, pero el comentario fue una respuesta a una idea pasajera de que coprocs podría ser una exageración si es simplemente para evitar 'leer ejecutarse en una subcadena y perder los vars. Probablemente estoy equivocado, como de costumbre. –