[英]Set Env Var and Access From Bash Script
这可能是一个非常愚蠢的问题,但是如何在Bash中设置环境变量,然后在Shell脚本中访问它呢?
kkeiper@machine:/home/kkeiper $ export APIKEY="adsf"
在bash脚本中
#!/bin/bash
echo $APIKEY; # prints a blank line
echo $(env | grep APIKEY); # wouldn't return APIKEY even if it did work, but this also prints a blank string
您显示的内容应该有效! 它为我做:
$ export APIKEY="asfw"
$ cat script.sh
#!/bin/bash
echo $APIKEY
env | grep APIKEY
$ bash -x script.sh
+ echo asfw
asfw
+ env
+ grep APIKEY
APIKEY=asfw
$ sudo bash script.sh
Password:
$
请注意,您在脚本中不需要分号或echo $(...)
表示法-但它们也不会造成任何损害。
(经过测试的Mac OS X 10.9 Mavericks,Bash 3.2.51。但是,我并不认为这很重要。只有真正的Bourne shell不支持export VAR=value
表示法-而且您必须很难找到一个这些天的外壳;也许是Solaris /bin/sh
。)
在评论中的问题之后添加了sudo
示例。 是的, sudo
杂散环境变量,例如APIKEY
。
有关sudo
更多说明:
$ env | wc -l
24
$ env | grep APIKEY
APIKEY=asfw
$ cat script.sh
#!/bin/bash
echo $APIKEY
env | grep APIKEY
env | wc -l
$ bash script.sh
asfw
APIKEY=asfw
23
$ sudo bash script.sh
18
$
有一天,我将调查在不涉及sudo
情况下24和23个环境变量之间的差异的原因和原因,但显然sudo
消除了许多变量(5或6,具体包括APIKEY)。
如何确保环境变量得到保留?
如果您知道需要保留哪些内容,则:
sudo
手册页说:
-E
-E
(保留环境)选项将覆盖sudoers(5)中的env_reset选项。 仅当匹配命令具有SETENV标记或在sudoers(5)中设置了setenv选项时,此选项才可用。
您可以安排将环境变量中继到命令环境:
$ sudo -E bash script.sh Password: asfw APIKEY=asfw 26 $ sudo bash -c "APIKEY='$APIKEY' bash script.sh" asfw APIKEY=asfw SUDO_COMMAND=/bin/bash -c APIKEY='asfw' bash script.sh 19 $
SUDO_COMMAND
在环境中的外观很有趣。
(请注意,仅需要bash script.sh
注释即可,因为我尚未将script.sh
可执行文件。如果它是可执行文件,则可以根据其是否位于目录中而键入script.sh
或./script.sh
。我的$PATH
。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.