Bash 默认把 PATH 传给子 bash,请问是出于什么考虑?

2018 年 11 月 30 日
 autumn2018

即使不 export,bash 里再开的 bash(子 bash),也能继承到 PATH 这个 shell 变量,请问,这在平常的脚本编程中有什么用途?不然,bash 为什么这样设计呢?

5805 次点击
所在节点    程序员
33 条回复
neoblackcap
2018 年 11 月 30 日
不是 bash 是这样设计,是 unix 环境下,子进程默认继承父进程的环境变量
flynaj
2018 年 11 月 30 日
不止 Linux,Windows 也会传环境变量到子进程
wd
2018 年 11 月 30 日
这不是环境变量么,那在这个环境执行的命令不就会继承么?
WordTian
2018 年 11 月 30 日
要是 path 不继承的话,那子 bash 就没有什么命令可用了
undeflife
2018 年 11 月 30 日
bash shell 不同状态读取的配置文件优先级

https://www.solipsys.co.uk/images/BashStartupFiles1.png
widewing
2018 年 12 月 1 日
???难道其他变量没有被继承吗?
binux
2018 年 12 月 1 日
PATH 是环境变量不是 shell 变量啊
dangyuluo
2018 年 12 月 1 日
Quote form Wikipedia:

PATH is an environment variable on Unix-like operating systems, DOS, OS/2, and Microsoft Windows,
TonyLiu2ca
2018 年 12 月 1 日
man bash
whileFalse
2018 年 12 月 1 日
没有 PATH 跑不起来好吗。
gowa2017
2018 年 12 月 1 日
loginshell fork child bash 采用了 cow 技术 刚开始的时候是共享内存空间的
iwtbauh
2018 年 12 月 1 日
并没有传给子进程

只是新的 bash 初始化时读取了配置文件然后自己创建了 PATH 变量

请 lz 尝试:

unset PATH
PATH="foo"
/bin/bash
echo "$PATH"
lululau
2018 年 12 月 1 日
只听说过子进程和子 Shell,子 Bash 是什么鬼
weyou
2018 年 12 月 1 日
系统启动的时候 PATH 已经是环境变量了,你对它做出的任何修改它还是一个环境变量,所以都会被子进程继承。这有啥奇怪的呢。
chinvo
2018 年 12 月 1 日
你把 foo 塞进系统环境变量里,“不 export ”也能继承。所有已经是环境变量的变量,包括 path、lc_* 等,都是这样的
cnt2ex
2018 年 12 月 1 日
环境变量的传递不是 bash 完成的,是操作系统完成的。在创建子进程的时候操作系统把带有环境变量的那部分内存区域拷贝到子进程的内存完成了环境变量的传递。
momocraft
2018 年 12 月 1 日
先讲清楚你的"子 bash" 是什么东西, 比如附上你用的命令, 我们才能继续讨论环境变量是如何初始化的
DinoStray
2018 年 12 月 1 日
@chinvo 第一次知道还有这个区别,那怎样算放入系统环境变量呢?要放在哪个文件里?
ihainan
2018 年 12 月 1 日
还真是这样,这个我都没注意过,习惯性都是加上 export。
rrfeng
2018 年 12 月 1 日
楼主的总结恰好是反的

环境变量会传递给子进程,但是 PATH 恰恰是一个很可能子进程(特别是 bash )会自己重载的环境变量

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://v2ex.ih06.com/t/513207

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX