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 cat
allí). 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 var
fuera 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 n
set to 0
en 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 USER
que necesita $
antes. Y pipe on export
no tiene sentido ya que export
el comando no tiene ninguna salida a STDOUT