繁体   English   中英

设置环境变量并从Bash脚本访问

[英]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)。

如何确保环境变量得到保留?

如果您知道需要保留哪些内容,则:

  1. sudo手册页说:

    -E -E (保留环境)选项将覆盖sudoers(5)中的env_reset选项。 仅当匹配命令具有SETENV标记或在sudoers(5)中设置了setenv选项时,此选项才可用。

  2. 您可以安排将环境变量中继到命令环境:

     $ 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM