Exportar sin configurar la variable cuando la canaliza a otro comando

Exportar sin configurar la variable cuando la canaliza a otro comando

Al canalizar la exportación a otro comando (usando bash 3.2), la variable no se modifica.

export USER=new | cat ; env | grep USER

Producción:USER=old

La variable Usuario no cambia y permanece igual. Pero la exportación salió exitosamente: export USER=new | echo $?genera 0.

Respuesta1

Por lo general, las partes de una tubería (excepto la última en algunos shells) se ejecutan en subshells, es decir, el shell bifurca una copia de sí mismo para cada una de ellas y luego cada copia procesa el comando en esa parte y ejecuta cualquier comando externo. (como catallí). El shell principal que continúa con el siguiente comando (la otra canalización) no ve el valor modificado.

(Y en cualquier caso, ¿cuál esperaría que varfuera el valor de después de un comando como var=foo | var=bar?)

Por lo general, esto surge cuando tiene asignaciones de variables en la última parte de una canalización, como

n=0
some command | while read line; do n=$((n+1)); done

lo que dejaría nset to 0en muchos shells, pero no en todos: ksh y zsh ejecutan la última parte en el shell principal, y Bash tiene una opción para eso. Esto se discute en¿Por qué mi variable es local en un bucle 'mientras se lee', pero no en otro bucle aparentemente similar?.

Respuesta2

Vuelva a escribir el código de esta manera:

export USER=new
env | grep $USER

Para obtener el contenido de la variable USERque necesita $antes. Y pipe on exportno tiene sentido ya que exportel comando no tiene ninguna salida a STDOUT

información relacionada