如何查询给定系统上 bash 的编译时选项?
bash 的系统 rc 路径因系统而异。有时是/etc/bash.bashrc
,有时是/etc/bashrc
。我如何以编程方式检测到这一点?
我知道我可以在 shell 中列出选项:
set -o
或者
shopt
答案1
据我所知,巴什源代码编译后不区分SYS_BASHRC
其他包含的 rc 文件。此外,SYS_BASHRC
可能是未定义的,并且生成的二进制文件根本不会使用系统 rc。
但是,可以通过 找到进程使用的所有文件strace
。 Bash 仅当以交互方式运行时才包含 rc 文件,因此:
echo | strace -e openat -o tmp.log bash -i 2>/dev/null
生成的文件tmp.log
将包含所需的信息:
openat(AT_FDCWD, "/etc/bash.bashrc", O_RDONLY) = 3
不幸的是,它还将包含大量行,例如库行(以及重定向到/dev/null)。我不确定如何在每种情况下选择正确的线路。但实际上,我认为它很可能是以下地区的第一个非图书馆/etc/
:
grep -v O_CLOEXEC tmp.log | grep \"/etc | head -n 1 | sed -e 's/.*"\(.*\)".*/\1/'