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‘

23

$ env -i bash -c ‘echo $SHLVL‘

1

PWD

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


$ env -i PWD=/ bash -c ‘echo $PWD‘

/

$ env -i PWD=/etc bash -c ‘echo $PWD‘ # 不是当前目录的路径

/

$ env -i PWD=. bash -c ‘echo $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 作者表示他准备判断一下,如果是合法目录路径的话,才会继承。

时间: 2024-08-03 04:26:20

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

linuxbash 父进程 子进程

linux登陆linux,就获得一个bash,之后你的bash就是一个独立的进程,被称为pid的就是,之后你在bash下面执行的任何命令都是由这个bash所衍生的,那些被执行的命令被称为子进程.子进程只会继承父进程的环境变量,子进程不会继承父进程的自定义变量.那么你原本bash中的自定义变量在进入子进程后就会消失不见,一直到你离开子进程并回到原本的父进程后,这个变量才会出现.除非把自定义变量设置为环境变量  export name

子进程和父进程关系以及缓冲区应用

int main(){ printf("abc\n"); pid_t r = fork();//子进程从fork()的下条语句开始运行,标准答案是从fork的后半部分开始运行 if(r==0) { printf("getpid = %d\n",getpid()); printf("getppid = %d\n",getppid()); } if(r>0) { printf("r = %d\n",r); printf(&q

父进程和子进程

父进程 在计算机领域,父进程(英语:Parent Process)指已创建一个或多个子进程的进程. UNIX 在UNIX里,除了进程0(即PID=0的交换进程,Swapper Process)以外的所有进程都是由其他进程使用系统调用fork创建的,这里调用fork创建新进程的进程即为父进程,而相对应的为其创建出的进程则为子进程,因而除了进程0以外的进程都只有一个父进程,但一个进程可以有多个子进程. 操作系统内核以进程标识符(Process Identifier,即PID)来识别进程.进程0是系统

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

经过试验,qt启动一个新的进程时,这个进程的工作目录是继承父进程的,无论是通过start还是startDetached来启动. 其实对于linux系统,qt底层应该也是调用fork.exec之类的函数,对于fork,参看apue中文版第三版,有以下解析: 在f o r k之后处理文件描述符有两种常见的情况:(1) 父进程等待子进程完成.在这种情况下,父进程无需对其描述符做任何处理.当子进程终止后,它曾进行过读.写操作的任一共享描述符的文件位移量已做了相应更新.(2) 父.子进程各自执行不同的程序

父进程文件句柄被子进程占用

场景描述:1.父进程A使用函数fopen打开(创建)一个磁盘文件file.exe.tmp2.父进程进行长时间的边下载边写入3.下载写入完成后,使用fclose关闭文件句柄4.重命名file.exe.tmp为file.exe 以上为理想情况下的代码执行流程. 问题:在第四步,重命名文件有可能失败,使用 GetLastError 函数发现失败原因为 此文件被另外一个进程占用. 解决:1.使用微软官方开发的handle.exe来查找是哪个进程占用了这个文件(handle.exe的下载地址  https

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

摘要:本文主要介绍进程的基本属性,基本属性包括:进程ID.父进程ID.进程组ID.会话和控制终端. 进程基本属性 1.进程ID(PID) 函数定义: #include <sys/types.h> #include <unistd.h> pid_t getpid(void); 函数说明: 每个进程都有一个非负整型表示的唯一进程ID(PID).好比如我们的身份证一样,每个人的身份证号是唯一的.因为进程ID标示符总是唯一的,常将其用来做其他标示符的一部分以保证其唯一性,进程ID(PID)

5.1.3 网络编程进阶---查看进程ID和父进程ID

获取本进程id: os.getpid() 获取父进程id:   os.getppid() from multiprocessing import Process import time import os class MyProcess(Process): # 继承Process类 def __init__(self, name): super().__init__() self.name = name def run(self): # 必须重写run方法 print('%s is runnin

如何查找僵尸进程并Kill之,杀不掉的要查看父进程并杀之

用ps和grep命令寻找僵尸进程 #ps -A -ostat,ppid,pid,cmd | grep -e '^[Zz]' 命令注解: -A 参数列出所有进程 -o 自定义输出字段 我们设定显示字段为 stat(状态), ppid(进程父id), pid(进程id),cmd(命令)这四个参数 因为状态为 z或者Z的进程为僵尸进程,所以我们使用grep抓取stat状态为zZ进程 运行结果参考如下 Z 12334 12339 /path/cmd 这时,我们可以使用 kill -HUP 12339来杀

OTP的supervisor tree如何保证子进程一定随父进程的退出而退出

利用OTP行为包构建的应用之所以可靠,是因为我们按照OTP的设计模式,将所有进程组织成了一棵可靠的supervisor tree.每一个supervisor监控其子进程,并在其子进程出错时按照重启策略进行相应的处理. 但是,你是否考虑过,如果supervisor意外终止,其子进程会怎样?当然,直觉告诉我们连监控进程的没有了,所有的子进程应全部终止.但是,你在代码中是否真正考虑过这种情况?你的gen_server可否写过如下代码? handle_info({'EXIT', Parent, Reas