上下文
- 对我的启动脚本的某些修改以
dash: 1: [[: not found
结尾,并以ash
shell结束。 - 我自然地认为这是一些基于配置文件(.profile等)的脚本,该脚本在基于POSIX的shell上运行时使用了
bash
的{{1}}。但是不知道是哪一个。 - 因此决定在
[[
下运行它,以查找正在读取的所有文件。结果令我惊讶-strace输出中未列出任何基于配置文件的文件。
结果
strace
使用普通$ strace -fe trace=%file bash -c exit
execve("/usr/bin/bash",["bash","-c","exit"],0x7ffc430c3870 /* 67 vars */) = 0
access("/etc/ld.so.preload",R_OK) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD,"/etc/ld.so.cache",O_RDONLY|O_CLOEXEC) = 3
openat(AT_FDCWD,"/lib/x86_64-linux-gnu/libtinfo.so.6","/lib/x86_64-linux-gnu/libdl.so.2","/lib/x86_64-linux-gnu/libc.so.6","/dev/tty",O_RDWR|O_NONBLOCK) = 3
openat(AT_FDCWD,"/usr/lib/locale/locale-archive","/usr/lib/x86_64-linux-gnu/gconv/gconv-modules.cache",O_RDONLY) = 3
stat("/home/quarkstone",{st_mode=S_IFDIR|0755,st_size=4096,...}) = 0
stat(".",...}) = 0
stat("/home",...}) = 0
stat("/home/quarkstone",...}) = 0
stat("/home/quarkstone/.cargo/bin/bash",0x7ffe62a61e90) = -1 ENOENT (No such file or directory)
stat("/home/quarkstone/.local/bin/bash",0x7ffe62a61e90) = -1 ENOENT (No such file or directory)
stat("/home/quarkstone/.local/opt/bin/bash",0x7ffe62a61e90) = -1 ENOENT (No such file or directory)
stat("/home/quarkstone/.cargo/bin/bash",0x7ffe62a61e90) = -1 ENOENT (No such file or directory)
stat("/home/quarkstone/.npm/bin/bash",0x7ffe62a61e90) = -1 ENOENT (No such file or directory)
stat("/home/quarkstone/workspace/go/bin/bash",0x7ffe62a61e90) = -1 ENOENT (No such file or directory)
stat("/usr/local/sbin/bash",0x7ffe62a61e90) = -1 ENOENT (No such file or directory)
stat("/usr/local/bin/bash",0x7ffe62a61e90) = -1 ENOENT (No such file or directory)
stat("/usr/sbin/bash",0x7ffe62a61e90) = -1 ENOENT (No such file or directory)
stat("/usr/bin/bash",{st_mode=S_IFREG|0755,st_size=1166912,...}) = 0
stat("/usr/bin/bash",...}) = 0
access("/usr/bin/bash",X_OK) = 0
stat("/usr/bin/bash",R_OK) = 0
stat("/usr/bin/bash",R_OK) = 0
+++ exited with 0 +++
运行,这样似乎也什么也没显示。
问题
- 如何列出外壳程序最终读取的所有文件? (请注意,问题不是根据文档应该读取的内容,而是真正在运行时读取的 内容)
- 为什么上面没有显示
strace -f bash |& grep profile
,.profile
,/etc/profile
/etc/bashrc
等中的任何一个? - (有点偏离主题)为什么在这里发生一系列
.bashrc
-ENOENT
-似乎是在所有env路径上搜索bash。但是为什么会这样呢? (如何在此处找到实际执行stat("/home/quarkstone/.cargo/bin/bash",0x7ffe62a61e90) = -1 ENOENT (No such file or directory)
命令的内容,从而导致PATH搜索)