我有一个简单的 bash 脚本:
#!/bin/bash
JAVA_HOME=/usr
EC2_HOME=~/ec2-api
echo $EC2_HOME
export PATH=$PATH:$EC2_HOME/bin
我像这样运行脚本
$ ./ec2
/Users/user/ec2-api
该脚本运行并产生正确的输出。
但是,当我现在尝试访问 EC2_HOME 变量时,我什么也没得到:
$ echo $EC2_HOME
我得到一个空白字符串。我究竟做错了什么?
请改为执行以下任一操作:
source ec2
或者
. ec2
(注意.
符号只是 的快捷方式source
)
解释:
./ec2
实际上从您当前的 shell 生成了一个子 shell 来执行脚本,并且子 shell 不能影响它生成的父 shell 的环境。EC2_HOME
确实/Users/user/ec2-api
在子 shell 中设置为正确(类似地,PATH
环境变量也在子 shell 中正确更新和导出),但这些更改不会传播回您的父 shell。source
直接在当前 shell 中运行脚本,而不产生子 shell,因此所做的更改将持续存在。export
: export 的注释用于告诉从当前 shell 生成的新 shell 使用从当前 shell 导出的变量。因此,对于仅在当前 shell 中使用的任何变量,它们不需要导出。)shell 脚本永远不能修改其父级的环境。要解决您的问题,您可以使用点 (.) 命令:
$ . ./ec2
这应该有效。在 cshell 中,它将是
% source ./ec2
要了解有关 shell 和脚本的更多信息,我最好的资源是Unix power tools。