Bash 什么时候会给 HOME 赋初始值

时间:2022-09-03 23:32:02

今天无意发现下面这个表现:

$  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 赋初始值的更多相关文章

  1. static 和 final 关键字 对实例变量赋初始值的影响

    static 和 final 关键字 对实例变量赋初始值的影响 最近一直在看<深入理解Java虚拟机>,在看完了对象内存分配.Class文件格式之后,想深扒一下实例变量是如何被赋上初始值的 ...

  2. (二)用控制器controller给模型数据赋初始值

    之前博客,非常easy的就实现了模型数据和页面显示的自己主动绑定.如今我们使用控制器,给模型赋初始值. 假设使用jquery来实现变量赋初值,须要在页面载入完毕后运行$("#target&q ...

  3. C语言赋初始值

  4. Vue中用props给data赋初始值遇到的问题解决

    Vue中用props给data赋初始值遇到的问题解决 更新时间:2018年11月27日 10:09:14   作者:yuyongyu    我要评论   这篇文章主要介绍了Vue中用props给dat ...

  5. vector 赋初始值的问题

    这个,输出为1 这个,啥都输不出来. 据说是因为没有初始化. 其实我搜了一下 vector<vector<int> > A;//正确的定义方式 vector<vector ...

  6. &lbrack;转&rsqb;Vue中用props给data赋初始值遇到的问题解决

    原文地址:https://segmentfault.com/a/1190000017149162 2018-11-28更:文章发布后因为存在理解错误,经@Kim09AI同学提醒后做了调整,在此深表感谢 ...

  7. 静态Map类型变量赋初始值

    private static Map<String,String> sysTypeList = new HashMap<String, String>(); static { ...

  8. DropdownList 赋初始值问题

    网上查了这样的代码 虽然是可以用.但是会点击多次会出现”“ dropdownList不能选多个值的问题“ private void initdroplistitemlirun(string c_Bus ...

  9. 关于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 ...

随机推荐

  1. 关于Chrome Dev Tool

    ★注意点一:函数名,方法名要拼写准确;

  2. OC学习笔记——类别&lpar;Category&rpar;

    类别,有些程序员又称之为分类. 类别是一种为现有的类添加新方法的方式,尤其是为系统的做扩展的时候,不用继承系统类,可以直接为类添加新的方法.也可以覆盖系统类的方法. 如: @interface NSO ...

  3. 利用接口做参数,写个计算器,能完成&plus;-&ast;&sol;运算 (1)定义一个接口Compute含有一个方法int computer&lpar;int n&comma;int m&rpar;&semi; (2)设计四个类分别实现此接口,完成&plus;-&ast;&sol;运算 (3)设计一个类UseCompute,含有方法: public void useCom&lpar;Compute com&comma; int one&comma; int two&rpar; 此方法要求能够:1.用传递过来的对象调用compute

    package com.homework5; public interface Compute { //声明抽象方法 int computer(int n,int m); } package com. ...

  4. linode最新试用(购买)流程

    最新linode官网www.linode.com可以免费试用7天,但是需要你的身份认证 第一步:注册一个linode账号email填写国内的163.126.qq邮箱是不能认证的,这里可以填写gmail ...

  5. &lbrack;置顶&rsqb; Android系统移植与调试之-------&gt&semi;Amlogic方案编译步骤

    1. 拷贝Amlogic的SourceCode 切换目录到  /home/roco/work/amlogic/SourceCode/mx0831-0525下将mx0831-0525.tgz拷贝到  / ...

  6. Java基础学习——泛型

    一.泛型方法 /** 自定义泛型:自定义泛型可以理解为是一个数据类型的占位符,或者理解为是一个数据类型的变量. 泛型方法: 泛型方法的自定义格式:修饰符<声明自定义泛型>返回值类型 函数名 ...

  7. js 中innerHTML&comma;innerText&comma;outerHTML&comma;outerText的区别

    开头说下innerText和outerText只在chrome浏览器中有效 定义和用法 innerHTML 属性设置或返回表格行的开始和结束标签之间的 HTML,包括标签. 来看代码 <!DOC ...

  8. CentOS 7创建自定义KVM模板(现有KVM迁移到另外一台机)

    说明:创建KVM模板有个好处,不用每次都运行命令创建,并且可以为迁移做准备. 一.创建KVM模板 1.下载iso(省略) 2.创建磁盘 qemu-img create -f raw centos7.r ...

  9. 学习笔记22—PS小技巧

    1.将图片四角变弧形:菜单-->选择-->平滑-->设置参数: 2.画曲线的方法是: 1)选择钢笔工具, 2)工具属性选择路径:用钢笔点下路径的起点,点下即松开鼠标:在下一个锚点,点 ...

  10. C&num; 自己动手实现Spy&plus;&plus;(二)

    昨天已经实现了获取窗口的标题.句柄等信息,但是高亮部分还有问题,而且红色绘制框擦除也有问题,今天就又研究了下上述两个问题. 高亮部分红色框只显示左上的边框,而右下的显示不出来,如图: 代码如下: pu ...