我可以从bash脚本中将variables导出到环境中吗?

假设我有这个脚本

export.bash

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

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

 echo $VAR 

有没有办法通过执行export.bash来访问$VAR ,而不采购它?

有没有办法通过执行export.bash来访问$VAR ,而不采购它?

快速回答:不可以

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

你已经提到的最明显的是使用source或者. 在调用shell的上下文中执行脚本:

 $ cat set-vars1.sh export FOO=BAR $ . set-vars1.sh $ echo $FOO BAR 

另一种方法是让脚本,而不是设置一个环境variables,打印将设置环境variables的命令:

 $ cat set-vars2.sh #!/bin/bash echo export FOO=BAR $ eval $(./set-vars2.sh) $ echo $FOO BAR 

请注意, $(...)会将输出连接到一行。 如果你有多个东西要设置,你应该给打印的命令添加分号,这样它们在连接在一起后仍然是有效的。

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

 $ cat set-vars3.sh #!/bin/bash export FOO=BAR exec "$@" $ ./set-vars3.sh printenv | grep FOO FOO=BAR 

最后一种方法可能相当有用,尽pipe交互式使用不方便,因为它不会给你当前shell中的设置(包含所有其他设置和历史logging)。

为了导出VARvariables首先最合乎逻辑,似乎工作的方式是源variables:

 . ./export.bash 

要么

 source ./export.bash 

现在,当从主shell回声它的作品

  echo $VAR HELLO, VARABLE 

我们现在将重置VAR

 export VAR="" echo $VAR 

现在我们将执行一个脚本来源variables然后取消它的设置:

 ./test-export.sh HELLO, VARABLE -- . 

代码:cat test-export.sh

  #!/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有多个回显值)

 IFS=$'\n'; for entries in $(./export.bash); do export $entries; done; ./v1.sh HELLO THERE HI THERE 

猫v1.sh

 #!/bin/bash echo $VAR echo $VAR1 

现在只要这是你的使用 – 你可以随时通过做一个bash别名,使你的脚本variables可用:

 myvars ./v1.sh HELLO THERE HI THERE echo $VAR . 

将此添加到您的.bashrc

 function myvars() { IFS=$'\n'; 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文件,你可以做任何时间以上…

无论如何回到其余的..

这使得它可以在全球范围内使用,然后执行脚本。

只需将其回显出来,然后在echo上运行导出即可!

猫export.bash

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

现在在脚本或您的控制台运行:

  export "$(./export.bash)" 

尝试:

 echo $VAR HELLO THERE 

只要你知道你在使用上面的方法在另一个脚本中所期待的多个值:

猫export.bash

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

cat test-export.sh

 #!/bin/bash IFS=$'\n' 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 

现在的结果

  ./test-export.sh round 1 HELLO THERE HI THERE round 2 . 

和最后的最后更新自动分配读取VARIABLES:

 ./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 test-export.sh

 #!/bin/bash IFS=$'\n' 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 

find一个有趣而整洁的方式来从文件中导出环境variables:

env.vars

 foo=test 

testing脚本:

 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 

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

脚本:myExport

 #! \bin\bash export $1 

在我的.bashrc中的别名

 alias myExport='source myExport' 

尽pipe如此,你也可以通过这种方式获得更多的可用性,这对其他人来说是有趣的。

另一个解决方法,取决于大小写,它可能是有用的:创build另一个bashinheritance导出的variables。 这是@凯斯汤普森回答的一个特殊情况,将所有这些缺点。

export.bash:

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

现在:

 ./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 } 

因为使用外部variables,你可以避免写脚本文件。