即便 Bash 没有从父进程继承任何的环境变量,Bash 自己也会创建三个环境变量,分别是:

$ env -i bash -c export

declare -x OLDPWD

declare -x PWD="/"

declare -x SHLVL="1"

SHLVL

如果父进程传递了 SHLVL 环境变量,那么 Bash 会在那个值的基础上累加 1,如果没有传,则赋初始值 1:

$ env -i SHLVL=22 bash -c 'echo $SHLVL' # 原值基础上累加 1

23

$ env -i bash -c 'echo $SHLVL' # 赋初始值 1

1

PWD

如果父进程传递了 PWD 环境变量,且该环境变量的值是当前目录的路径,且是个绝对路径,则 Bash 会直接继承这个值,否则 Bash 会自己调用 getcwd C 函数获取当前工作目录赋值给 PWD。

$ env -i PWD=/ bash -c 'echo $PWD' # 直接继承,没有调用 getcwd C 函数

/

$ env -i PWD=/etc bash -c 'echo $PWD' # 不是当前目录的路径,自己给 PWD 赋值

/

$ env -i PWD=. bash -c 'echo $PWD' # 是当前目录的路径,但是是个相对路径,自己给 PWD 赋值

/

OLDPWD

如果父进程传递了 OLDPWD 环境变量,Bash 会直接清空这个变量的值。

$ env -i OLDPWD=/etc bash -c 'echo $OLDPWD'

$ env -i OLDPWD=/etc ksh -c 'echo $OLDPWD'

/etc

$ env -i OLDPWD=/etc csh -c 'echo $OLDPWD'

/etc

$ env -i OLDPWD=/etc zsh -c 'echo $OLDPWD'

/

可见不同于 Bash,ksh 和 csh 会直接继承那个值,而 zsh 会用当前工作目录的值改写继承来的 OLDPWD 变量的值。

有人在 bug-bash 上提了这个问题  http://lists.gnu.org/archive/html/bug-bash/2015-11/msg00115.html,Bash 作者表示会在下个版本尝试改变这个行为,但并不是照抄 ksh 和 csh 的做法,ksh 和 csh 只是简单的继承了 OLDPWD 的值,并不判断那个值是不是个合法的且存在的目录的路径:

$ env -i OLDPWD=2333 ksh -c 'echo $OLDPWD'

2333

$ env -i OLDPWD=2333 csh -c 'echo $OLDPWD'

2333

而 Bash 作者表示他准备判断一下,如果是合法目录路径的话,才会继承。

Bash 会清空从父进程继承来的 OLDPWD的更多相关文章

  1. fork出的子进程和父进程的继承关系【转载】

    [原文地址]http://blog.163.com/dengjingniurou@126/blog/static/53989196200962924412524/ fork出的子进程和父进程的继承关系 ...

  2. fork之后,子进程从父进程那继承了什么(转载)

    转载自:https://blog.csdn.net/xiaojun111111/article/details/51764389 知道子进程自父进程继承什么或未继承什么将有助于我们.下面这个名单会因为 ...

  3. linuxbash 父进程 子进程

    linux登陆linux,就获得一个bash,之后你的bash就是一个独立的进程,被称为pid的就是,之后你在bash下面执行的任何命令都是由这个bash所衍生的,那些被执行的命令被称为子进程.子进程 ...

  4. qt新进程工作目录的设置(工作目录确实是被子进程继承的,但也可以设置)

    经过试验,qt启动一个新的进程时,这个进程的工作目录是继承父进程的,无论是通过start还是startDetached来启动. 其实对于linux系统,qt底层应该也是调用fork.exec之类的函数 ...

  5. Linux内核学习笔记(2)-- 父进程和子进程及它们的访问方法

    Linux系统中,进程之间有一个明显的继承关系,所有进程都是 PID 为1的 init 进程的后代.内核在系统启动的最后阶段启动 init 进程.该进程读取系统的初始化脚本(initscript)并执 ...

  6. Linux Guard Service - 守护进程的作用、用途、父进程标识的特点

    让test2直接成为守护进程 [root@localhost 02]# cat test2.c //test2 #include<stdio.h> #include<unistd.h ...

  7. 进程的基本属性:进程ID、父进程ID、进程组ID、会话和控制终端

    摘要:本文主要介绍进程的基本属性,基本属性包含:进程ID.父进程ID.进程组ID.会话和控制终端. 进程基本属性 1.进程ID(PID) 函数定义:      #include <sys/typ ...

  8. 用 set follow-fork-mode child即可。这是一个 gdb 命令,其目的是告诉 gdb 在目标应用调用fork之后接着调试子进程而不是父进程,因为在 Linux 中fork系统调用成功会返回两次,一次在父进程,一次在子进程

    GDB的那些奇淫技巧 evilpan 收录于 Security  2020-09-13  约 5433 字   预计阅读 11 分钟  709 次阅读  gdb也用了好几年了,虽然称不上骨灰级玩家,但 ...

  9. fork、父进程和子进程

    进程 什么是进程?进程是一个运行中的程序实体,拥有独立的堆栈.内存空间和逻辑控制流. 这是标准的进程概念.让我们通过操作系统的fork函数看看这个抽象的概念是怎么在进程的实现中体现出来的. 构成要素 ...

随机推荐

  1. 全透明Activity

    第一步:在/res/values/styles里面添加如下代码: <style name="translucent"> <item name="andr ...

  2. postgreSQL使用

    1.1. 安装     自然,在你想开始使用 PostgreSQL 之前, 你必须安装它.PostgreSQL 很有可能 已经安装到你的节点上了,因为它包含在你的操作系统的发布里, 或者是系统管理员已 ...

  3. 使用Sqlserver更新锁防止数据脏读

    有时候我们需要控制某条记录在程序读取后就不再进行更新,直到事务执行完释放后才可以.这时候我们就可以将所有要操作当前记录的查询加上更新锁,以防止查询后被其它事务修改.这种操作只锁定表中某行而不会锁定整个 ...

  4. 迅为最新推出iTOP-6818开发平台无缝支持4418开发板

    iTOP-6818开发板是一款四核ARM 八核开发板与iTOP-4418开发板完全兼容,CPU主频1.4GHz,内存1GB DDR3(2GB可选),存储16GB EMMC,板载千兆以太网,GPS,WI ...

  5. 帆软报表FineReport中数据连接之Weblogic配置JNDI连接

    1. 制作报表的原理 在帆软报表FineReport设计器中先用JDBC连接到数据库,建立数据库连接,然后用SQL或者其他方法创建数据集,使用数据集制作报表,然后把建立的数据库连接从JDBC连接改成J ...

  6. JustWeTools - 自定义控件集

    JustWeTools - Some useful tools 项目地址 JustWe 现在有哪些模块? View自定义控件 PaintView画图工具(包含重构压感新版) CodeView代码编辑 ...

  7. [普通平衡树splay]【学习笔记】

    参考: http://blog.csdn.net/clove_unique/article/details/50630280 gty课件 找一个好的风格太难了,自己习惯用struct,就强行用stru ...

  8. POJ1679 The Unique MST[次小生成树]

    The Unique MST Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 28673   Accepted: 10239 ...

  9. 第16章 List集合的总结和遍历

    第16章 List集合的总结和遍历 1.重构设计 根据Vector类,ArrayList类,和LinkedList类所具有的存储特点以及拥有的方法入手,发现共性往上抽取. 共同特点: 1.允许元素重复 ...

  10. apache服务器启动时提示httpd: apr_sockaddr_info_get() failed for

    apache服务器启动时提示httpd: apr_sockaddr_info_get() failed for 在RedHat Linux 5 与 CentOS 5服务器上配置好apache后,启动或 ...