在终端中能打印值的环境变量,在脚本里打印却为空?

看shell执行情况:

jk@kglb:~$ echo $ANDROID_NDK_ROOT
/home/jk/sdk/android-ndk-r10e
jk@kglb:~$ cat test.sh
#!/bin/sh
echo $ANDROID_NDK_ROOT
jk@kglb:~$ sh test.sh

jk@kglb:~$ 

环境变量ANDROID_NDK_ROOT在终端中能打印出来,但放在脚本里却打印为空,不得其解。
使用环境:bash, Ubuntu 14.04.3 LTS

阅读 6.9k
2 个回答
export ANDROID_NDK_ROOT
sh test.sh

环境变量只在当前进程有效,传递到子进程,需要export

总算搞明白了,这个问题还挺有意思,也是之前一个不留心引起。
ANDROID_NDK_ROOT我是放在.bashrc里的,如下:

NDK_ROOT=/home/jk/sdk/android-ndk-r10e
ANDROID_NDK_ROOT=$NDK_ROOT
PATH="$NDK_ROOT:$PATH"

每次打开一个新的终端,.bashrc都会被执行,上面是定义了ANDROID_NDK_ROOT这个变量,并不是export一个环境变量,所以在终端里是可以使用$ANDROID_NDK_ROOT获取值的。
而如果使用sh test.sh,这个脚本是在终端的子进程中执行的,它不能获取父进程终端的ANDROID_NDK_ROOT变量是正常的,注意,这里是变量,如果需要获取的话,可以让test.sh在终端所在的进程执行,但要使用:

. ./test.sh
或
source ./test.sh

所以,回到最初的目的,是想暴露ANDROID_NDK_ROOT为环境变量,供所有脚本和终端使用,这就必须在前面加export:

export NDK_ROOT=/home/jk/sdk/android-ndk-r10e
export ANDROID_NDK_ROOT=$NDK_ROOT
export PATH="$NDK_ROOT:$PATH"

这样才是设置环境变量,因此,sh test.sh才能正常打印ANDROID_NDK_ROOT

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进