今天无意发现下面这个表现:
$ env -i bash -c cd bash: line 0: cd: HOME not set $ env -i bash -c 'echo $HOME' |
这表明了,Bash 只会从环境变量中继承 HOME 变量,从来不自己初始化它?为了证实这个想法,我去翻了下源码,发现其实并不是,在一种情况下,Bash 是会主动初始化 HOME 变量的:
if (login_shell == && posixly_correct == )
set_home_var ();
从这句源码看出,Bash 只有在当前 Shell 是个登陆 Shell 且不在 Posix 模式中时,才可能去给 HOME 赋初始值。然后我就试验了一下:
$ env -i bash --login -c 'echo $HOME' |
握草,为什么还没有值?遂谷歌了一下,发现 14 年有人报了个 bug https://lists.gnu.org/archive/html/bug-bash/2014-01/msg00063.html。看了这个 bug 后我明白了,原来在 Bash 内部,登陆 Shell 还分三种情况:
/* Non-zero means that this shell is a login shell.
Specifically:
0 = not login shell.
1 = login shell from getty (or equivalent fake out)
-1 = login shell from "--login" (or -l) flag.
-2 = both from getty, and from flag.
*/
int login_shell = ;
一种是 Bash 的父进程启动 Bash 时传入的第 0 个参数(通过 exec* 函数指定)的第一个字符是以 - 开头的情况,一种是 Bash 启动时用了 --login 或 -l 选项的情况,最后一种是上面两种表现混合的情况,login_shell 变量的值分别为 1、-1、-2,但从刚才看的源码看出,只有在 login_shell 为 1 的情况下,Bash 才会初始化 HOME 变量。那么我们再次验证一下:
$ exec -ca -whatever bash -c 'echo $HOME' /home/admin |
这条命令用到了 exec 的 -a 选项来指定 argv[0]。我们还可以自己写个 c 程序验证一下:
$ cat a.c #include<unistd.h> int main() { char *argv[ ] = { "-whatever", "-c", "echo $HOME", NULL }; char *envp[ ] = { NULL }; execve("/bin/bash", argv, envp); } $ gcc a.c -o a $ ./a /home/admin |
Bash 什么时候会给 HOME 赋初始值的更多相关文章
-
static 和 final 关键字 对实例变量赋初始值的影响
static 和 final 关键字 对实例变量赋初始值的影响 最近一直在看<深入理解Java虚拟机>,在看完了对象内存分配.Class文件格式之后,想深扒一下实例变量是如何被赋上初始值的 ...
-
(二)用控制器controller给模型数据赋初始值
之前博客,非常easy的就实现了模型数据和页面显示的自己主动绑定.如今我们使用控制器,给模型赋初始值. 假设使用jquery来实现变量赋初值,须要在页面载入完毕后运行$("#target&q ...
- C语言赋初始值
-
Vue中用props给data赋初始值遇到的问题解决
Vue中用props给data赋初始值遇到的问题解决 更新时间:2018年11月27日 10:09:14 作者:yuyongyu 我要评论 这篇文章主要介绍了Vue中用props给dat ...
-
vector 赋初始值的问题
这个,输出为1 这个,啥都输不出来. 据说是因为没有初始化. 其实我搜了一下 vector<vector<int> > A;//正确的定义方式 vector<vector ...
-
[转]Vue中用props给data赋初始值遇到的问题解决
原文地址:https://segmentfault.com/a/1190000017149162 2018-11-28更:文章发布后因为存在理解错误,经@Kim09AI同学提醒后做了调整,在此深表感谢 ...
-
静态Map类型变量赋初始值
private static Map<String,String> sysTypeList = new HashMap<String, String>(); static { ...
-
DropdownList 赋初始值问题
网上查了这样的代码 虽然是可以用.但是会点击多次会出现”“ dropdownList不能选多个值的问题“ private void initdroplistitemlirun(string c_Bus ...
-
关于Delphi中二维数组赋初始值
dctb:array[1..2,1..38] of Single=((0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ...
随机推荐
-
关于Chrome Dev Tool
★注意点一:函数名,方法名要拼写准确;
-
OC学习笔记——类别(Category)
类别,有些程序员又称之为分类. 类别是一种为现有的类添加新方法的方式,尤其是为系统的做扩展的时候,不用继承系统类,可以直接为类添加新的方法.也可以覆盖系统类的方法. 如: @interface NSO ...
-
利用接口做参数,写个计算器,能完成+-*/运算 (1)定义一个接口Compute含有一个方法int computer(int n,int m); (2)设计四个类分别实现此接口,完成+-*/运算 (3)设计一个类UseCompute,含有方法: public void useCom(Compute com, int one, int two) 此方法要求能够:1.用传递过来的对象调用compute
package com.homework5; public interface Compute { //声明抽象方法 int computer(int n,int m); } package com. ...
-
linode最新试用(购买)流程
最新linode官网www.linode.com可以免费试用7天,但是需要你的身份认证 第一步:注册一个linode账号email填写国内的163.126.qq邮箱是不能认证的,这里可以填写gmail ...
-
[置顶] Android系统移植与调试之------->;Amlogic方案编译步骤
1. 拷贝Amlogic的SourceCode 切换目录到 /home/roco/work/amlogic/SourceCode/mx0831-0525下将mx0831-0525.tgz拷贝到 / ...
-
Java基础学习——泛型
一.泛型方法 /** 自定义泛型:自定义泛型可以理解为是一个数据类型的占位符,或者理解为是一个数据类型的变量. 泛型方法: 泛型方法的自定义格式:修饰符<声明自定义泛型>返回值类型 函数名 ...
-
js 中innerHTML,innerText,outerHTML,outerText的区别
开头说下innerText和outerText只在chrome浏览器中有效 定义和用法 innerHTML 属性设置或返回表格行的开始和结束标签之间的 HTML,包括标签. 来看代码 <!DOC ...
-
CentOS 7创建自定义KVM模板(现有KVM迁移到另外一台机)
说明:创建KVM模板有个好处,不用每次都运行命令创建,并且可以为迁移做准备. 一.创建KVM模板 1.下载iso(省略) 2.创建磁盘 qemu-img create -f raw centos7.r ...
-
学习笔记22—PS小技巧
1.将图片四角变弧形:菜单-->选择-->平滑-->设置参数: 2.画曲线的方法是: 1)选择钢笔工具, 2)工具属性选择路径:用钢笔点下路径的起点,点下即松开鼠标:在下一个锚点,点 ...
-
C# 自己动手实现Spy++(二)
昨天已经实现了获取窗口的标题.句柄等信息,但是高亮部分还有问题,而且红色绘制框擦除也有问题,今天就又研究了下上述两个问题. 高亮部分红色框只显示左上的边框,而右下的显示不出来,如图: 代码如下: pu ...