假设我有这样的脚本:
export.bash:
#! /usr/bin/env bash
export VAR="HELLO, VARIABLE"
当我执行脚本并试图访问$VAR时,我没有得到任何值!
echo $VAR
是否有一种方法通过执行export来访问$VAR。没有来源的Bash ?
假设我有这样的脚本:
export.bash:
#! /usr/bin/env bash
export VAR="HELLO, VARIABLE"
当我执行脚本并试图访问$VAR时,我没有得到任何值!
echo $VAR
是否有一种方法通过执行export来访问$VAR。没有来源的Bash ?
当前回答
是否有任何方法通过执行export来访问$VAR。没有来源的Bash ?
快速回答:不。
但也有几种可能的变通办法。
您已经提到的最明显的方法是使用source or。在调用shell的上下文中执行脚本:
$ cat set-vars1.sh
export FOO=BAR
$ . set-vars1.sh
$ echo $FOO
BAR
另一种方法是让脚本,而不是设置环境变量,打印将设置环境变量的命令:
$ cat set-vars2.sh
#!/bin/bash
echo export FOO=BAR
$ eval "$(./set-vars2.sh)"
$ echo "$FOO"
BAR
第三种方法是使用脚本在内部设置环境变量,然后在该环境中调用指定的命令:
$ cat set-vars3.sh
#!/bin/bash
export FOO=BAR
exec "$@"
$ ./set-vars3.sh printenv | grep FOO
FOO=BAR
最后一种方法可能非常有用,但对于交互式使用来说不太方便,因为它不能提供当前shell中的设置(以及您已建立的所有其他设置和历史)。
其他回答
我发现了一个从文件中导出环境变量的有趣而简洁的方法:
在文件env.vars中:
foo=test
测试脚本:
eval `cat env.vars`
echo $foo # => test
sh -c 'echo $foo' # =>
export eval `cat env.vars`
echo $foo # => test
sh -c 'echo $foo' # => test
# a better one. "--" stops processing options,
# key=value list given as parameters
export -- `cat env.vars`
echo $foo # => test
sh -c 'echo $foo' # => test
使用脚本文件导出环境变量
问题: 当您运行一个脚本时,它在子shell中执行,并在执行后返回到父shell。导出变量只适用于子shell,不能将子shell的变量导出回父shell。
解决方案: 从你的脚本文件调用一个子shell和你想要导出的变量,这将创建一个新的子shell和你导出的变量。
script.sh - - - >
bash -c 'export VAR=variable; exec bash'
:: ciph3r
也许你可以在~/中添加一个函数。ZSHRC或~/.bashrc。
# set my env
[ -s ~/.env ] && export MYENV=`cat ~/.env`
function myenv() { [[ -s ~/.env ]] && echo $argv > ~/.env && export MYENV=$argv }
由于使用了外部变量,可以避免使用脚本文件。
我不认为这可以做到,但我找到了一个使用别名的变通办法。只有当您将脚本放在scripts目录中时,它才会工作。否则,您的别名将具有无效的名称。
唯一的解决方法是能够在文件中使用同名函数,并且在使用它之前不必费心查找它。将以下代码添加到~/.bashrc文件中:
alias myFunction='unalias myFunction && . myFunction && myFunction "$@"'
您现在可以调用myFunction,而无需首先获取它。
另一种变通方法(取决于具体情况)可能很有用:创建另一个继承导出变量的bash脚本。这是Keith Thompson回答的一个特例,所有这些缺点。
文件export.bash:
# !/bin/bash
export VAR="HELLO, VARIABLE"
bash
Now:
./export.bash
echo $VAR