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" |
当我执行脚本并尝试访问
1 | echo $VAR |
有没有办法只通过执行export.bash而不获取它来访问
Is there any way to access to the
$VAR by just executingexport.bash without sourcing it ?
快速回答:不。
但有几种可能的解决办法。
您已经提到过的最明显的一个方法是使用
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 |
找到了一种从文件中导出环境变量的有趣而简洁的方法:
在
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' |
尽管如此,你还是可以找到它,但也许这样它更有用,对其他人来说也很有趣。