我的 shell 正在使用哪个启动文件?

我的 shell 正在使用哪个启动文件?

我在 Google 计算引擎上安装的 ubuntu 有几个启动文件。

是否有任何命令可以告诉我当前正在使用的 shell 正在使用哪个启动文件?

答案1

shell 通常在启动时读取的文件列表仅限于少数几个。但那些反过来可能来源其他的,最终可能会成为一个很大的数字,就像加载复杂的完成系统时一样。

一种方法是使用以下命令运行 shell:

strace -e open your-shell

(或系统上的等效命令,例如truss// tusc... dtruss

这将列出 shell 打开的所有文件。它还会列出它打开的文件和非启动文件,以及它尝试但无法打开的文件。

另一种方法可能是使用xtrace某些 shell 的模式,其中 shell 在 stderr 上输出它将对每个命令执行的操作。为此,您只需使用该-x选项调用 shell 即可。

默认情况下,某些 shellzsh会打印正在运行的代码来自的文件的路径(尽管您可能希望设置PS4+%x>,例如也为在函数中运行的代码打印文件名)。对于其他一些像bashksh93,您可以通过修改变量使其打印它$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

相关内容