shell命令可以事先写入一个文件中,使用时shell读取文件中的命令逐条解释执行,这种文件,被称为脚本。
执行脚本的方法与执行其他程序一样,如:
./setenv.sh #setenv.sh是当前目录下的一个脚本
以这种方法执行脚本时,其中的命令是在一个子shell中执行的。子shell继承了父shell的环境变量,但无法修改他们,或者说所做的修改仅对子shell有效。
如果要使用脚本来修改环境变量,则必须让脚本在当前shell中执行,这一点可以用以下命令实现:
source setenv.sh #读入setenv.sh文件中的命令,在当前shell中执行。
source 是内置命令,用途是读取文件中的内容,并在当前shell中逐条执行。这种方式执行的脚本无须执行权限。source命令可以缩写为一个小数点,如
source setenv.sh 等价于 . setenv.sh
以下是一个例子:
在shell中设置TARGET变量
TARGET=arm-linux
然后新建了一个脚本文件test.sh,里面echo ${TARGET}
1. 执行 ./test.sh #无任何输出,因为test.sh在子shell中执行,如果不加export,就不会在子shell中看到这个变量,因为它还不是一个系统环境变量
2. 执行source test.sh #输出arm-linux,因为test.sh在当前shell中执行
3. export TARGET
./test.sh #输出arm-linux,因为export了TARGET的值
所以得出的结论是:1、执行脚本时是在一个子shell环境运行的,脚本执行完后该子shell自动退出;2、一个shell中的系统环境变量才会被复制到子shell中(用export定义的变量);3、一个shell中的系统环境变量只对该shell或者它的子shell有效,该shell结束时变量消失(并不能返回到父shell中)。3、不用export定义的变量只对该shell有效,对子shell也是无效的。