假设我有这样的脚本:

export.bash:

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

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

echo $VAR

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


当前回答

答案是否定的,但对我来说,我做了以下事情

脚本:

myExport

#! \bin\bash
export $1

我的.bashrc文件中的别名:

alias myExport='source myExport'

你仍然可以获取它,但也许这样它更有用,对其他人来说也更有趣。

其他回答

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

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

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

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

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

简单幼稚的方法有效:

脚本1:

回显"something" > /tmp/myvar

脚本2:

myvar=$(cat /tmp/myvar)

是否有任何方法通过执行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中的设置(以及您已建立的所有其他设置和历史)。