我有一个简单的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
确实在子shell中正确地设置为/Users/user/ec2-api
(类似地,PATH
环境变量也在子shell内正确地更新和导出),但这些更改不会传播回父shell - 使用
source
直接在当前shell中运行脚本,而不生成子shell,因此所做的更改将持续存在 - (关于
export
:export的一个注释用于告诉从当前shell派生的新shell使用从当前shell导出的变量。因此,对于只在当前shell中使用的任何变量,都不需要导出。)
shell脚本永远不能修改其父级的环境。要解决您的问题,您可以使用dot(.)命令:
$ . ./ec2
这应该行得通。在cshell中,它将是
% source ./ec2
要了解更多关于shell和脚本的信息,我最好的资源是Unix的强大工具。