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

Sno*_*man 2 bash terminal

我有一个简单的 bash 脚本:

#!/bin/bash
JAVA_HOME=/usr
EC2_HOME=~/ec2-api
echo $EC2_HOME
export PATH=$PATH:$EC2_HOME/bin
Run Code Online (Sandbox Code Playgroud)

我像这样运行脚本

$ ./ec2
/Users/user/ec2-api
Run Code Online (Sandbox Code Playgroud)

该脚本运行并产生正确的输出。

但是,当我现在尝试访问 EC2_HOME 变量时,我什么也没得到:

$ echo $EC2_HOME
Run Code Online (Sandbox Code Playgroud)

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

sam*_*hen 5

请执行以下任一操作:

source ec2
Run Code Online (Sandbox Code Playgroud)

或者

. ec2
Run Code Online (Sandbox Code Playgroud)

(请注意,.符号只是 的快捷方式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 中使用的任何变量,不需要导出它们。)