博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Bash 什么时候会给 HOME 赋初始值
阅读量:5919 次
发布时间:2019-06-19

本文共 1212 字,大约阅读时间需要 4 分钟。

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

$  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 == 1 && posixly_correct == 0)  set_home_var ();

从这句源码看出,Bash 只有在当前 Shell 是个登陆 Shell 且不在 Posix 模式中时,才可能去给 HOME 赋初始值。然后我就试验了一下:

$  env -i bash --login -c 'echo $HOME'

 

握草,为什么还没有值?遂谷歌了一下,发现 14 年有人报了个 bug 。看了这个 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 = 0;

一种是 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

转载地址:http://fcfvx.baihongyu.com/

你可能感兴趣的文章
解决某些软件检测不到java环境问题
查看>>
2016年学习计划
查看>>
[51nod1190]最小公倍数之和V2(莫比乌斯反演)
查看>>
HDU 1253 胜利大逃亡
查看>>
poj 1789 Truck History
查看>>
Python数据分析基础教程
查看>>
FTP上传下载
查看>>
Android中的自定义数据适配器
查看>>
Shell根据年月日创建文件夹
查看>>
SQL Server 2012新特性与应用解决方案
查看>>
hdu6040
查看>>
加密和签名的相关知识
查看>>
2017.10.24 A test error about ATE device
查看>>
CSS绝对定位的应用
查看>>
NX回转实体实例 UF_MODL_create_revolution
查看>>
监听EF执行的sql语句及状态
查看>>
并查集(路径更新) LA 3027 Corporative Network
查看>>
stl(set+stack) LA 3634 The SetStack Computer
查看>>
ACM进阶计划
查看>>
第四章 关于测试的一些思考
查看>>