Bash 会清空从父进程继承来的 OLDPWD

即便 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 作者表示他准备判断一下,如果是合法目录路径的话,才会继承。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值