找出启动期间bash / dash / sh读取的所有文件

上下文

  • 对我的启动脚本的某些修改以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 +++ 运行,这样似乎也什么也没显示。

问题

  1. 如何列出外壳程序最终读取的所有文件? (请注意,问题不是根据文档应该读取的内容,而是真正在运行时读取的 内容)
  2. 为什么上面没有显示strace -f bash |& grep profile.profile/etc/profile /etc/bashrc等中的任何一个?
  3. (有点偏离主题)为什么在这里发生一系列.bashrc-ENOENT-似乎是在所有env路径上搜索bash。但是为什么会这样呢? (如何在此处找到实际执行stat("/home/quarkstone/.cargo/bin/bash",0x7ffe62a61e90) = -1 ENOENT (No such file or directory)命令的内容,从而导致PATH搜索)
hnlvyou 回答:找出启动期间bash / dash / sh读取的所有文件

您正在查看Shell正在读取的所有文件。

/etc/profile~/.profile~/.bash_profile~/.bash_login是登录文件,只有bash作为login shell调用时bash才会读取。 /etc/bashrc(或/etc/bash.bashrc)和~/.bashrc是用于交互式会话的自定义文件(具有与此处无关的怪癖)。解释脚本或使用-c运行单个命令时,不会读取这些文件。

Bash在启动时会读取名称在BASH_ENV环境变量中的文件。但通常不会设置此环境变量,因此bash不会读取任何文件。

Bash显然喜欢在启动时获取有关其自身二进制文件的信息。我不知道这是做什么用的,但这是内置行为,而不是某些启动脚本产生的行为。

这些都不以任何方式帮助您理解为什么包含bash构造的脚本使用破折号运行。该脚本使用破折号运行的原因可能是/bin/sh在您的系统上是破折号:系统很少显式调用dash。如果您不知道是哪个脚本引起的,或者您不知道该脚本的调用方式,则应从出现此消息的情况开始调查。如果是登录时脚本,则需要了解登录在系统上的工作方式以及调用了哪些程序。 Unix & Linux可能会有所帮助。

本文链接:https://www.f2er.com/2887158.html

大家都在问