如何在 shell 脚本中“导出”环境变量?

cwd*_*cwd 80 shell bash shell-script environment-variables

我有多个 Amazon EC2 账户,并希望能够$EC2_HOME使用脚本快速切换变量,例如。

我有一个如下设置的shell脚本:

#!/bin/sh
export EC2_HOME=/home/me/.ec2
echo $EC2_HOME
Run Code Online (Sandbox Code Playgroud)

当我运行脚本时,我知道EC2_HOME已设置,但我认为使用export会使变量在脚本完成后继续存在。它没有,因为运行echo $EC_HOME不会显示任何内容。

我知道这一定是非常初级的 Linux 脚本知识,但我不知道。我试图在没有运气的情况下寻找相关问题 - 如果这是重复的,我深表歉意。

enz*_*tib 86

你应该使用你的脚本来源

. ./script
Run Code Online (Sandbox Code Playgroud)

或者

source ./script
Run Code Online (Sandbox Code Playgroud)

  • 原因是您的脚本生成了一个新的 shell 进程作为当前 shell 的子进程。您在子进程中所做的任何环境更改*不能*影响父进程。当你使用 `.` 或 `source` 时,你不是在生成一个新的子进程,而是在当前 shell 中运行命令。 (27认同)
  • @Patryk:也许你的脚本有一个 `exit` 语句,所以不适合被引用。 (7认同)
  • @glennjackman我有一个类似的问题,我已经尝试过你的解决方案,但当我执行“.”或“source”时,它会将我从shell中注销。为什么会出现这种情况? (2认同)

Mic*_*mer 44

当你运行一个脚本时,它有自己的 shell 和自己的环境,一旦脚本完成,它就会再次消失。要保留环境变量,请将脚本输入到当前的 shell 中:

$ source ./a.sh
Run Code Online (Sandbox Code Playgroud)

或等效地(但更便携)使用POSIX 点命令

$ . ./a.sh
Run Code Online (Sandbox Code Playgroud)

然后定义将被放入您当前的 shell 环境中,并由您从中启动的任何程序继承。

为了更接近运行脚本,. a.sh将通过搜索PATH环境变量中的目录来找到 a.sh。


它们的行为方式以及是否.source是否相同(或根本不存在)有一些微妙之处。. ./a.sh在每个 POSIX 兼容的 shell 中肯定会有相同的行为,但是sourceand.. a.shand. ./a.sh可能会有所不同。对于 Bashsource.在所有情况下都是相同的;for zshsource总是先检查当前目录;ksh 本质上是相似的。

如果脚本名称作为路径(包含/)给出,则在所有情况下都直接使用该路径。最便携可靠的方法是. ./scriptor . /path/to/script