这可能是一个非常愚蠢的问题,但如何在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
答案 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。
如何确保保留环境变量?
如果你知道哪些需要保存,那么:
sudo
手册页说:
-E
-E
(保留环境)选项将覆盖env_reset选项 在sudoers(5))。它仅在匹配命令时可用 具有SETENV标记或setenv选项在sudoers(5)中设置。
您可以安排将环境变量中继到命令环境:
$ 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
上的目录中。)