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)
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 中肯定会有相同的行为,但是source
and.
和. a.sh
and. ./a.sh
可能会有所不同。对于 Bashsource
和.
在所有情况下都是相同的;for zshsource
总是先检查当前目录;ksh 本质上是相似的。
如果脚本名称作为路径(包含/
)给出,则在所有情况下都直接使用该路径。最便携可靠的方法是. ./script
or . /path/to/script
。