在我的操作系统中:
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='
笔记:
grep 的
-H
选项确保文件名始终会匹配地输出,即使只返回一个文件名locate
(这不太可能,但无论如何使用 -H 也没有坏处)。您可能还想使用 grep 的
-i
选项来进行不区分大小写的匹配。如果在其他位置可能会找到 shell 配置文件脚本,或者它们可能具有其他名称,那么您需要调整正则表达式以适应。例如,我原来的正则表达式没有搜索
/etc/environment
(这是可以在某些系统上定义 shell 变量的另一个地方),所以我添加了它。这不会也不能告诉你变量是哪个文件曾是实际上定义在,它只能显示你的文件可能负责变量的当前值(它无法知道实际执行了哪一个,它只能看到变量是在脚本中设置的)。
locate
的数据库通常每天只更新一次。如果配置文件脚本是在上次运行后创建的,则将找不到该文件。根据文件的权限,您可能需要运行以下命令:
sudo locate ... | xargs -0r sudo grep -H
答案2
Bash 不跟踪这一点。尝试在不同文件中查找 CLUTTER_IM_MODULE。