如何知道哪个文件包含变量定义?

如何知道哪个文件包含变量定义?

在我的操作系统中:

echo $CLUTTER_IM_MODULE
fcitx5

如何知道哪个文件包含变量定义?
我知道我们可以在 .bashrc 或 /etc/bash.bash 中定义 env。
获取包含 string 的文件需要花费很多时间CLUTTER_IM_MODULE

sudo grep  -r  CLUTTER_IM_MODULE  /

有一个聪明的方法来实现我的目标吗?

答案1

如果您确定该变量是在 shell 配置文件脚本中定义的locate如果你有一个支持扩展正则表达式和 NUL 分隔输出(例如mlocate或)的版本plocate,你可以运行这样的东西(这比运行快得多grep -r):

locate -0 --regex '/(\.(bash_)?profile|(bash)?\.?bashrc|etc/profile.d/|etc/environment$)' |
  xargs -0r grep -H '[^$]CLUTTER_IM_MODULE='

笔记:

  1. grep 的-H选项确保文件名始终会匹配地输出,即使只返回一个文件名locate(这不太可能,但无论如何使用 -H 也没有坏处)。

  2. 您可能还想使用 grep 的-i选项来进行不区分大小写的匹配。

  3. 如果在其他位置可能会找到 shell 配置文件脚本,或者它们可能具有其他名称,那么您需要调整正则表达式以适应。例如,我原来的正则表达式没有搜索/etc/environment(这是可以在某些系统上定义 shell 变量的另一个地方),所以我添加了它。

  4. 这不会也不能告诉你变量是哪个文件曾是实际上定义在,它只能显示你的文件可能负责变量的当前值(它无法知道实际执行了哪一个,它只能看到变量是在脚本中设置的)。

  5. locate的数据库通常每天只更新一次。如果配置文件脚本是在上次运行后创建的,则将找不到该文件。

  6. 根据文件的权限,您可能需要运行以下命令:

    sudo locate ... | xargs -0r sudo grep -H
    

答案2

Bash 不跟踪这一点。尝试在不同文件中查找 CLUTTER_IM_MODULE。

相关内容