假设我有这样的脚本:

export.bash:

#! /usr/bin/env bash
export VAR="HELLO, VARIABLE"

当我执行脚本并试图访问$VAR时,我没有得到任何值!

echo $VAR

是否有一种方法通过执行export来访问$VAR。没有来源的Bash ?


当前回答

也许你可以在~/中添加一个函数。ZSHRC或~/.bashrc。

# set my env
[ -s ~/.env ] && export MYENV=`cat ~/.env`
function myenv() { [[ -s ~/.env ]] && echo $argv > ~/.env && export MYENV=$argv }

由于使用了外部变量,可以避免使用脚本文件。

其他回答

也许你可以在~/中添加一个函数。ZSHRC或~/.bashrc。

# set my env
[ -s ~/.env ] && export MYENV=`cat ~/.env`
function myenv() { [[ -s ~/.env ]] && echo $argv > ~/.env && export MYENV=$argv }

由于使用了外部变量,可以避免使用脚本文件。

我有类似的问题调用ssh-agent -s在rsync的选项-e调用的脚本。

在脚本中,eval $(ssh-agent -s)不为下一次调用保留环境变量。

rsync -e 'source ssh-check-agent.sh -p 8022'不起作用,所以我做了一个变通方案。在脚本中,我在调用ssh-agent后将变量保存在一个临时文件中,如下:

echo "export SSH_AUTH_SOCK=$SSH_AUTH_SOCK;" > /tmp/ssh-check-agent.vars
echo "export SSH_AGENT_PID=$SSH_AGENT_PID;" >> /tmp/ssh-check-agent.vars

然后在调用rsync (backup.sh)的脚本中调用:

source /tmp/ssh-check-agent.vars

问题是调用rsync的脚本必须由source (source backup.sh)调用。

我知道这不是问题(我使用两次源),但如果有人在rsync上有类似的问题,我在这里放了。

我发现了一个从文件中导出环境变量的有趣而简洁的方法:

在文件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

另一种变通方法(取决于具体情况)可能很有用:创建另一个继承导出变量的bash脚本。这是Keith Thompson回答的一个特例,所有这些缺点。

文件export.bash:

# !/bin/bash
export VAR="HELLO, VARIABLE"
bash

Now:

./export.bash
echo $VAR

如果你想为调用shell设置一个变量,有一个使用c unix套接字的健壮方法。 测试结果如下:

$ ./a.out &
[1] 5363
$ ./b.out 123;a=`./b.out`;echo ${a}
123
[1]+  Done                    ./a.out

参见我的github上的a.c, b.c和a.h。