为什么bash脚本变量没有保存



我有一个简单的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的强大工具。

相关内容

  • 没有找到相关文章

最新更新