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


54

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

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

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

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

我知道这一定是非常基本的Linux脚本知识,但是我不知道。我尝试寻找相关问题时没有运气-如果这是重复的话,我深表歉意。

Answers:


60

您应该使用以下命令获取脚本

. ./script

要么

source ./script

19
原因是您的脚本作为当前shell的子代产生了一个新的shell进程。您在子进程中所做的任何环境更改都不会影响父进程。当您使用.或时source,您没有生成新的子进程,而是在当前shell中运行命令。
glenn jackman 2012年

1
@glennjackman我有一个类似的问题,我已经试过您的解决方案,但它记录了我从关闭外壳当我做.source。为什么会这样呢?
Patryk '02

7
@Patryk:也许您的脚本中有一条exit语句,所以不适合用作源。
enzotib 2012年

source ./script,虽然工作完全正常。如何使用sudo做到这一点?sudo source ./script.shsudo: source: command not found
2014年

1
@ 71GA:使用时运行命令时sudo,取决于/etc/sudoers是否可以保留环境,取决于编译偏好和配置设置sudo。我建议您尝试获取脚本的源代码,然后sudo使用-E选项运行以保留环境。如果不起作用,我想您几乎无能为力。
enzotib 2014年

35

运行脚本时,它将获得自己的外壳和环境,脚本完成后,外壳和环境将再次消失。要保留环境变量,请将脚本源到当前的shell中:

$ source ./a.sh

或等效地(但更便于携带)使用POSIX dot命令

$ . ./a.sh

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

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


它们的行为方式以及是否.source(或完全相同)存在一些细微差别。. ./a.sh在每个与POSIX兼容的外壳中,其行为肯定相同,但是source.,和. a.sh. ./a.sh可以有所不同。对于Bash source.在所有情况下都相同;因为zsh source总是首先检查当前目录 ; ksh本质上是相似的。

如果将脚本名称指定为路径(包含/),则在所有情况下都将直接使用该路径。最可移植的可靠方法是. ./script. /path/to/script


1

仅作记录。

如果要从Internet运行脚本,将环境导出到系统

您可以使用以下格式

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

例如:

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

看起来很危险,但如果您信任该脚本,它将很有用!
马克·斯图尔特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.