我可以从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,你可以避免写脚本文件。