我想使用一个可以调用的shell脚本来设置一些环境variables。 但是,脚本执行后,我看不到在bash中使用“printenv”的环境variables。
这是我的脚本:
#!/bin/bash echo "Hello!" export MYVAR=boubou echo "After setting MYVAR!"
当我做“./test.sh”时,我看到:
Hello! After setting MYVAR!
当我做“princessv MYVAR”时,我什么都看不到。
你能告诉我我做错了什么吗?
这是环境变量的工作原理。 每个进程都有一个环境的副本。 进程对其副本所做的任何更改都会传播给进程的子进程。 但是,他们并不传播给过程的父母。
解决这个问题的一个方法是使用source
命令:
source ./test.sh
要么
. ./test.sh
(这两种形式是同义词)。
当你这样做的时候,不是在子shell中运行脚本,而是在脚本中执行每个命令,就像在提示符下键入一样。
另一种方法是让脚本打印你想要设置的变量,并在你的主shell中使用echo export VAR=value
和eval "$(./test.sh)"
。 这是各种程序所使用的方法[例如resize,dircolors]提供的环境变量设置。
这只适用于脚本没有其他输出的情况(或者在stderr上出现任何其他输出, >&2
)