linux 取消source命令,Linux 环境变量和source命令 (转)

多是班门弄斧了,仅share给尚不知道的童鞋。 shell

1.       问题的来源: 安全

为何咱们编译Android代码时,须要输入:  source ./build/envsetup.sh  或者 . ./build/envsetup.sh哪? (这里的source和.的做用是一致的), 为何不能够直接执行envsetup.sh脚步而须要经过source命令执行哪?  函数

2.      Linux 环境变量的机制ui

Linux的环境变量是存储于RAM中的,每一个Process启动时,OS会往Process的RAM中写入环境变量,因此每一个Process的环境变量间是相互独立的。 Linux每一个Process启动时的初始环境变量是从其父进程继承过来的,可是一旦子进程启动后,那么不会再和父进程的环境变量存在任何依赖关系,子进程的环境变量的更改不会影响父进程,反之亦然。 因此,要控制程序运行时能获取的环境变量,只能在父进程中写入。   继承

3.     回答开始的问题 进程

Linux中,标准方式运行Shell Script会致使启动一个新的shell进程来运行Script。 对于envsetup.sh而言,若是以标准方式执行,那么就会启动一个新的shell进程来运行,运行完成退回到当前的shell进程(咱们的编译shell环境)。envsetup.sh内部定义了一系列的环境变量和shell函数,指望在咱们的编译环境中被使用。那么,若是使用标准方式(非Source)执行时,这些环境变量和函数的定义将只会在新的shell进程(当前编译环境所在shell进程的子进程)中生效,当envsetup.sh执行后返回其父进程(当前编译环境所在shell)时,全部envsetup.sh中定义的环境变量和函数在此编译环境shell中并无生效,违背了咱们的意愿,后续的编译就不能引用了,好比mm,mmm都不能引用。 此时就须要使用source命令,在固然shell中使用source命令执行envsetup.sh时,不会fork出新的shell进程来运行,而是直接在当前shell进程中读取envsetup.sh文件来运行,这样使得envsetup.sh中的环境变量和函数的定义在当前的用户编译环境shell中生效。 ip

4.     Android/Linux中环境变量的其余一些说明 get

因为init是User Space的1号进程,因此在init.rc中 Export的环境变量将在全部的User Space进程中可见。Zygote中设置的环境变量,将在全部的Android APK 进程中可见,可是在Native Process中不可见。   Native的环境变量的读写函数是,getenv/setenv Java层的环境变量的读写函数是:System.getProperties().getProperty/setProperty     注意和Android Property的区别:System.getproperty/setproperty   另外,因为安全问题(这里不详述,又是另外一个话题)全部具备SUID/SGID属性的Linux的可执行文件(包括.so)在运行时,会在自身进程中删除一系列和安全相关的继承来的环境变量,好比LD_LIBRARY_PATH等,使得在其和其子进程中没法继承和访问系统的这些环境变量值。it

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值