¿Por qué la fuente no funciona cuando llamo a bash -c

Quiero ejecutar un command que ordere una secuencia de commands para asumir algunos env. variables antes de ejecutarlas, sin searchlas en mi caparazón actual.

test.env

export test=1 

Ninguno de estos commands repite el env. variable:

a) ¿No debería funcionar esto? ¿No acabo de ejecutar estos commands en un nuevo shell y devolver el resultado?

 $ bash -c "source test.env && echo $test" 

b) Aquí ejecuto test.env y trato de ejecutar echo $ test en el mismo process usando exec.

 $ bash -c "./test.env && exec echo $test" 

c) Por último, probé esto ya que era una posible permutación. Pero ejecuta test.env y el command echo como processs separados.

 $ bash -c "./test.env && echo $test" 

¿Y cómo puedo hacer que funcione en el entorno? las variables se obtienen antes de que se ejecute el segundo command?

Debe escaping el signo de dólar $ en su primer command, de lo contrario bash lo expandirá antes de que se ejecute su command:

 $ bash -c "source test.env && echo \$test" 

O debería usar comillas simples en lugar de comillas dobles:

 $ bash -c 'source test.env && echo $test' 

Si el objective es solo manejar la configuration de ENV antes de ejecutar un process y evitar afectar el shell actual, entonces ejecutar el ejecutable bash podría no ser la forma más eficiente de hacerlo.

 ( . /dev/fd/4 && echo "$i" ) 4<<\SCRIPT i='i is set here in the subshell' #END SCRIPT echo ${i?but i isnt set here because it was set in the subshell} 

SALIDA

 i is set here in the subshell sh: line 5: i: but i isnt set here because it was set in the subshell 

Por supuesto, puede sustituir el enlace al descriptor de file de henetworkingoc con un file común; lo acabo de usar para demostrarlo.

Pero si exec un process externo, como bash o cualquier otro, en lugar de un shell incorporado, entonces no necesita la subshell.

 one=1 two=2 \ bash -c 'echo "${cmd=This is command #}$one" echo "${cmd}$two"' echo "${one?this var was only set for the execed ENV}" 

SALIDA

 This is command #1 This is command #2 sh: line 2: one: this var was only set for the execed ENV 

Y si ese process externo es bash o cualquier otro shell que se ajuste al estándar POSIX de aceptar -s tdin como pnetworkingeterminado, puede simplemente escribir su script directamente en un file |pipe

 { echo PS1= echo 'echo "$PS1"' cat /etc/skel/.bashrc echo 'echo "$PS1"' } | bash echo "${PS1:?unset here again}" 

SALIDA

 #blank line from first echo [\u@\h \W]\$ sh: line 7: PS1: unset here again 

Como está escrito, el shell está expandiendo $test antes de pasarlo a tu command. Puede evitar que esto suceda utilizando un ' lugar de " .

 bash -c 'source test.env && echo $test'