关于shell:我可以从bash脚本将变量导出到环境中而不需要源代码吗?

Can I export a variable to the environment from a bash script without sourcing it?

假设我有这个剧本

出口:

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

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

1
echo $VAR

有没有办法只通过执行export.bash而不获取它来访问$VAR


Is there any way to access to the $VAR by just executing export.bash without sourcing it ?

快速回答:不。

但有几种可能的解决办法。

您已经提到过的最明显的一个方法是使用source.在调用shell的上下文中执行脚本:

1
2
3
4
5
$ cat set-vars1.sh
export FOO=BAR
$ . set-vars1.sh
$ echo $FOO
BAR

另一种方法是让脚本(而不是设置环境变量)打印将设置环境变量的命令:

1
2
3
4
5
6
$ cat set-vars2.sh
#!/bin/bash
echo export FOO=BAR
$ eval"$(./set-vars2.sh)"
$ echo"$FOO"
BAR

第三种方法是使用脚本在内部设置环境变量,然后使用该环境调用指定的命令:

1
2
3
4
5
6
$ cat set-vars3.sh
#!/bin/bash
export FOO=BAR
exec"$@"
$ ./set-vars3.sh printenv | grep FOO
FOO=BAR

最后一种方法是非常有用的,尽管它不方便交互使用,因为它没有给您当前shell中的设置(包括您建立的所有其他设置和历史)。


为了首先导出var变量,最合乎逻辑且看似可行的工作方式是源变量:

1
. ./export.bash

1
source ./export.bash

当主壳发出回声时,它就开始工作了。

1
2
 echo $VAR
HELLO, VARABLE

我们现在将重置var

1
2
export VAR=""
echo $VAR

现在,我们将执行一个脚本来源代码变量,然后取消设置它:

1
2
3
4
./test-export.sh
HELLO, VARABLE
--
.

代码:cat test-export.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
    #!/bin/bash
    # Source env variable
    source ./export.bash

    # echo out the variable in test script
    echo $VAR

    # unset the variable
    unset VAR
    # echo a few dotted lines
    echo"---"
    # now return VAR which is blank
    echo $VAR

这里有一种方法

请注意:导出仅限于在主控制台中执行导出的脚本-至于cron作业,我将像下面的控制台一样添加它…对于命令部分,仍然存在疑问:下面是如何从shell中运行:

在命令提示下(只要export.bash有多个echo值)

1
2
3
4
IFS=$'
'
; for entries in $(./export.bash); do  export $entries;  done; ./v1.sh
HELLO THERE
HI THERE

猫V1.SH

1
2
3
#!/bin/bash
echo $VAR
echo $VAR1

现在,只要这是供您使用的—您可以通过这样的bash别名随时为脚本提供变量:

1
2
3
4
5
6
7
myvars ./v1.sh
HELLO THERE
HI THERE

echo $VAR

.

将此添加到.bashrc中

1
2
3
4
5
6
7
8
9
10
11
function myvars() {
    IFS=$'
'
;
    for entries in $(./export.bash); do  export $entries;  done;

   "$@";

    for entries in $(./export.bash); do variable=$(echo $entries|awk -F"=" '{print $1}'); unset $variable;
done

}

源代码您的bashrc文件,您可以做上述任何时候…

不管怎么说,回到剩下的……

这使它在全局可用,然后执行脚本。

只需将其回音,然后在回音上运行export!

猫出口

1
2
#!/bin/bash
echo"VAR=HELLO THERE"

现在在脚本或控制台中运行:

1
 export"$(./export.bash)"

尝试:

1
2
echo $VAR
HELLO THERE

多个值,只要您知道在使用上述方法的另一个脚本中需要什么:

猫出口

1
2
3
#!/bin/bash
echo"VAR=HELLO THERE"
echo"VAR1=HI THERE"

CAT测试-导出.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#!/bin/bash

IFS=$'
'

for entries in $(./export.bash); do
   export $entries
done

echo"round 1"
echo $VAR
echo $VAR1

for entries in $(./export.bash); do
     variable=$(echo $entries|awk -F"=" '{print $1}');
     unset $variable
done

echo"round 2"
echo $VAR
echo $VAR1

现在结果

1
2
3
4
5
6
7
8
 ./test-export.sh
round 1
HELLO THERE
HI THERE
round 2


.

最后一次自动分配的更新读取变量:

1
2
3
4
5
6
7
8
9
10
./test-export.sh
Round 0 - Export out then find variable name -
Set current variable to the variable exported then echo its value
$VAR has value of HELLO THERE
$VAR1 has value of HI THERE
round 1 - we know what was exported and we will echo out known variables
HELLO THERE
HI THERE
Round 2 - We will just return the variable names and unset them
round 3 - Now we get nothing back

剧本:CAT测试-导出.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#!/bin/bash

IFS=$'
'

echo"Round 0 - Export out then find variable name -"
echo"Set current variable to the variable exported then echo its value"
for entries in $(./export.bash); do
 variable=$(echo $entries|awk -F"=" '{print $1}');
 export $entries
 eval current_variable=\$$variable
 echo"\$$variable has value of $current_variable"
done


echo"round 1 - we know what was exported and we will echo out known variables"
echo $VAR
echo $VAR1

echo"Round 2 - We will just return the variable names and unset them"
for entries in $(./export.bash); do
 variable=$(echo $entries|awk -F"=" '{print $1}');
 unset $variable
done

echo"round 3 - Now we get nothing back"
echo $VAR
echo $VAR1


找到了一种从文件中导出环境变量的有趣而简洁的方法:

env.vars中:

1
foo=test

测试脚本:

1
2
3
4
5
6
7
8
9
10
11
12
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
export `cat env.vars`
echo $foo         # => test
sh -c 'echo $foo' # => test

执行

1
set -o allexport

此后从文件中获取的任何变量都将在shell中导出。

1
source conf-file

完成后执行。这将禁用allexport模式。

1
set +o allexport


另一个解决方法是:创建另一个继承导出变量的bash,这取决于具体情况。这是@keith汤普森回答的一个特例,会有所有的缺点。

出口:

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

现在:

1
2
./export.bash
echo $VAR


也许你可以用~/.zshrc,~/.bashrc编写一个函数。

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

因为在外部使用变量,所以可以避免编写脚本文件。


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

剧本:我的出口

1
2
#! \bin\bash
export $1

我的.bashrc中的别名

1
alias myExport='source myExport'

尽管如此,你还是可以找到它,但也许这样它更有用,对其他人来说也很有趣。