我在 Google 计算引擎上安装的 ubuntu 有几个启动文件。
是否有任何命令可以告诉我当前正在使用的 shell 正在使用哪个启动文件?
答案1
shell 通常在启动时读取的文件列表仅限于少数几个。但那些反过来可能来源其他的,最终可能会成为一个很大的数字,就像加载复杂的完成系统时一样。
一种方法是使用以下命令运行 shell:
strace -e open your-shell
(或系统上的等效命令,例如truss
// tusc
... dtruss
)
这将列出 shell 打开的所有文件。它还会列出它打开的文件和非启动文件,以及它尝试但无法打开的文件。
另一种方法可能是使用xtrace
某些 shell 的模式,其中 shell 在 stderr 上输出它将对每个命令执行的操作。为此,您只需使用该-x
选项调用 shell 即可。
默认情况下,某些 shellzsh
会打印正在运行的代码来自的文件的路径(尽管您可能希望设置PS4
为+%x>
,例如也为在函数中运行的代码打印文件名)。对于其他一些像bash
或ksh93
,您可以通过修改变量使其打印它$PS4
。
PS4='+$BASH_SOURCE> ' bash -x
PS4='+${sh.file}> ' ksh93 -x
PS4='+%x> ' zsh -x
使用bash
,您可以对输出进行后处理,以便仅保留文件的唯一路径,例如:
PS4=' <:>$BASH_SOURCE<:>' BASH_XTRACEFD=3 3> >(
awk -F'<:>' 'NF>2 && !seen[$2]++ {print $2}') bash -x
(假设启动文件的路径不包含换行符,或者<:>
并且在包含的启动文件中没有运行多行命令<:>
)
这些xtrace
基于 - 的方法不会列出空的或仅包含注释或函数定义的启动文件(除非这些函数稍后运行),也不会列出 shell 将处理的启动文件(如果存在)。
但是,您可以检索已定义函数的文件
eval "(shopt -s extdebug; declare() { typeset -F \"\$2\"; }
$(typeset -F))" | cut -d ' ' -f 3- | sort -u
与bash
或
type ${(k)functions} | sed -n 's/.*is a shell function from //p' | sort -u
和zsh
。