为什么bash脚本变量不能保存?

时间:2012-11-15 19:02:37

标签: bash terminal

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

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

2 个答案:

答案 0 :(得分:4)

请执行以下任一操作:

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中使用的任何变量,它们需要不能出口。)

答案 1 :(得分:0)

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

$ . ./ec2

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

% source ./ec2

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