从Bash脚本设置Env Var和Access

时间:2013-11-27 19:33:37

标签: linux bash shell environment-variables

这可能是一个非常愚蠢的问题,但如何在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

1 个答案:

答案 0 :(得分:2)

你展示的应该有用!它适合我:

$ 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符号 - 你必须要看这些天很难找到具有这种限制的shell;也许是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
$ 

有一天,我会调查24和23个环境变量之间的区别和原因,而不涉及sudo,但显然sudo消除了许多变量(5或6,特别包括APIKEY。

  

如何确保保留环境变量?

如果你知道哪些需要保存,那么:

  1. sudo手册页说:

      

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

  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上的目录中。)