2

我有一个简单的 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

我得到一个空白字符串。我究竟做错了什么?

4

2 回答 2

4

请改为执行以下任一操作:

source ec2

或者

. ec2

(注意.符号只是 的快捷方式source

解释:

  • 这是因为./ec2实际上从您当前的 shell 生成了一个子 shell 来执行脚本,并且子 shell 不能影响它生成的父 shell 的环境。
  • 因此,EC2_HOME确实/Users/user/ec2-api在子 shell 中设置为正确(类似地,PATH环境变量也在子 shell 中正确更新和导出),但这些更改不会传播回您的父 shell。
  • Usingsource直接在当前 shell 中运行脚本,而不产生子 shell,因此所做的更改将持续存在。
  • (关于export: export 的注释用于告诉从当前 shell 生成的新 shell 使用从当前 shell 导出的变量。因此,对于仅在当前 shell 中使用的任何变量,它们不需要导出。)
于 2012-11-15T19:06:32.927 回答
0

shell 脚本永远不能修改其父级的环境。要解决您的问题,您可以使用点 (.) 命令:

$ . ./ec2

这应该有效。在 cshell 中,它将是

% source ./ec2

要了解有关 shell 和脚本的更多信息,我最好的资源是Unix power tools

于 2012-11-15T19:17:09.397 回答