Linux 环境变量和source命令 (转)
可能是班门弄斧了,仅share给尚不知道的童鞋。
1. 问题的来源:
为什么我们编译Android代码时,需要输入: source ./build/envsetup.sh 或者 . ./build/envsetup.sh哪? (这里的source和.的作用是一致的), 为什么不可以直接执行envsetup.sh脚步而需要通过source命令执行哪?
2. Linux 环境变量的机制
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中生效。
4. Android/Linux中环境变量的其他一些说明
由于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等,使得在其和其子进程中无法继承和访问系统的这些环境变量值。
Linux 环境变量和source命令 (转)的更多相关文章
- ubuntu 命令、linux环境变量设置
解压与压缩: tar.gz格式tar -xzvf xxx jar格式jar -xvf xxx.jar zip格式unzip xxx.zip zip -r xxx.zip xxx unarunar -e ...
- centos shell基础 alias 变量单引号 双引号 history 错误重定向 2>&1 jobs 环境变量 .bash_history source配置文件 nohup & 后台运行 cut,sort,wc ,uniq ,tee ,tr ,split, paste cat> 2.txt <<EOF 通配符 glob模式 发邮件命令mail 2015-4-8 第十二节课
centos shell基础知识 alias 变量单引号 双引号 history 错误重定向 2>&1 jobs 环境变量 .bash_history source配置文件 ...
- Linux命令行--使用linux环境变量(转)
5.1 什么时环境变量 bash shell用一个成为环境变量的特性来存储有关的shell回话和工作环境的信息,这是它们成为环境变量的原因.它允许你在内存中存储数据,以便运行在账户.系统.shell的 ...
- 三种配置linux环境变量的方法(以java为例)
1.先确认是否为openjdk:参考 2. 修改/etc/profile文件 如果你的计算机仅仅作为开发使用时推荐使用这种方法,因为所有用户的shell都有权使用这些环境变量,可能会给系统带来安全性 ...
- linux环境变量LD_LIBRARY_PATH
LIBRARY_PATH和LD_LIBRARY_PATH是Linux下的两个环境变量,二者的含义和作用分别如下: LIBRARY_PATH环境变量用于在程序编译期间查找动态链接库时指定查找共享库的路径 ...
- 设置Linux环境变量的方法与区别(Ubuntu)
设置 Linux 环境变量可以通过 export 实现,也可以通过修改几个文件来实现,有必要弄清楚这两种方法以及这几个文件的区别. 通过文件设置 Linux 环境变量 首先是设置全局环境变量, ...
- Linux环境变量配置全攻略
Linux环境变量配置 在自定义安装软件的时候,经常需要配置环境变量,下面列举出各种对环境变量的配置方法. 下面所有例子的环境说明如下: 系统:Ubuntu 14.0 用户名:uusama 需要配置M ...
- 设置Linux环境变量的方法和区别_Ubuntu
设置 Linux 环境变量可以通过 export 实现,也可以通过修改几个文件来实现,有必要弄清楚这两种方法以及这几个文件的区别. 通过文件设置 Linux 环境变量 首先是设置全局环境变量,对所有用 ...
- Linux 环境变量_006
***Linux 环境变量指系统运行程序或命令的能快速找到其位置等其它功能,不用输入复杂命令.以$PATH环境变量为例子, $PATH决定了shell指定寻找命令或程序的路径,比较执行ls命令,如果没 ...
随机推荐
- javascript第十六课:动态注册事件
直接给dom元素添加动态事件,如: document.getelementbyid('#id').onclick=function(){ 方法体! };
- ER 和 数据库关系模式
http://lianghuanyue123.blog.163.com/blog/static/130423244201162011850600/ 我们眼下所接触的数据库基本上是关系数据库,关系数据库 ...
- CSS备忘-1
CSS 可以通过以下方式添加到HTML中: 内联样式- 在HTML元素中使用"style" 属性 内部样式表 -在HTML文档头部 <head> 区域使用<sty ...
- Java基础笔记-String类
String 类(被final修饰) 字符串是一种特殊的对象,一旦字符串被初始化就不可以被改变了.(内容不变) 例如: String s = “abc”; String s1 = new Stri ...
- linq to sql简单使用
1.新建一个winform项目. 2.添加一个Linq to Sql 类,命名为Northwind 3.打开服务器资源管理器,将表拖动到linq to sql 类,实体类就由Vs生成了 4.实例化Da ...
- SpringMVC中采用简洁的配置实现文件上传
文件上传我们一般会有两种策略,一种是通过IO流上传,还有一种是通过表单上传,其实这两种在客户端实现起来都是很简单的,在服务端处理会略有差别,个人感觉IO上传代码简单,但是也有很多硬伤,还是表单上传更合 ...
- MVC 5 + EF 6
(一) ??运算符 C#中两个问号(“?”)的作用是判断“?”左边的对象是否为null,如果不为null则使用“?”左边的对象,如果为null则使用“?”右边的对象. (二)VS安装Entity Fr ...
- 机器学习(Machine Learning)
从wiki开始:http://en.wikipedia.org/wiki/Machine_learning 今天看机器学习相关的文章, 了解了一下opencv中机器学习功能比较多了 (http://d ...
- ubuntu 开启 rewrite 模块
1.sudo a2enmod rewrite 开启Rewrite模块 (停用模块,使用 a2dismod) 2. 在/etc/apache2/ 修改apache2.conf 文件中把AllowOver ...
- HTTP缓存缓存机制
http协议无状态,所以缓存设定从两方面考虑.客户端浏览器和服务器端. 浏览器端实现过期机制. 服务器端实现验证机制. 缓存机制. 为了减轻服务器负担,也减少网络传输数量.http1.0定义了Expi ...