当 bash 执行脚本时,ls -la /proc/<pid of bash>/fd
显示“255 -> /path/to/script”。我认为 bash 通过文件描述符 255 读取脚本,并逐行执行命令。
但是当 bash 获取脚本时,我在ls -la /proc/<pid of bash>/fd
.我也找不到cat /proc/<pid of bash>/maps
。
我有一个问题:当bash获取脚本时,bash如何读取脚本?有什么特殊的方法来读取脚本文件吗?
答案1
我突然想出一个主意来分析形势strace
。
刚执行时,输出strace -f -p <pid>
如下:
openat(AT_FDCWD, "./test", O_RDONLY) = 3...
[pid 3408] dup2(3, 255) = 255
[pid 3408] 关闭(3) = 0
“test”是要执行的shell脚本。 “3408”是子shell的pid。 “test”在文件描述符 3 处打开,并复制到文件描述符 255。因此ls -la /proc/<pid of bash>/fd
显示“255 -> /some/directory/test”。
但是,当获取脚本时,“测试”被打开,读入缓冲区,然后立即关闭。所以ls -la /proc/<pid of bash>/fd
不显示上面这样的条目。
我不知道bash为什么要这样实现。