如何使 shell 脚本中“导出”的环境变量保留下来?

如何使 shell 脚本中“导出”的环境变量保留下来?

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

我有一个像这样设置的 shell 脚本:

#!/bin/sh
export EC2_HOME=/home/me/.ec2
echo $EC2_HOME

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

我知道这一定是非常初级的Linux脚本知识,但我不知道。我尝试寻找相关问题,但没有运气 - 所以如果这是重复的,我很抱歉。

答案1

你应该使用你的脚本

. ./script

或者

source ./script

答案2

当您运行脚本时,它会获得自己的 shell 和环境,一旦脚本完成,它们就会再次消失。要保留环境变量,请将脚本放入当前 shell 中:

$ source ./a.sh

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

$ . ./a.sh

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

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


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

如果脚本名称以路径形式给出(包含/),则在所有情况下都直接使用该路径。最可移植可靠的事情是. ./scriptor . /path/to/script

答案3

只是为了记录。

如果您想从互联网运行脚本,将环境导出到系统

您可以使用以下格式

source <(curl -s -L https://raw.githubusercontent.com/iamwwc/wwcdocker/master/install.sh)

例如:

source <(curl -s -L https://example.com/install.sh)

答案4

尝试

exec ./script

exec 命令在当前 shell 中运行脚本,而不启动非交互式 shell。

相关内容