我正在尝试查找哪个文件将/opt/texbin
文件夹添加到 Ubuntu 上的 PATH 变量中。它不存在于我的/etc/environment
文件中。文件夹sudo grep -lr texbin . 2>/dev/null
中没有任何输出/etc
。如果我将它添加set -x
到文件的开头,/etc/zshenv
我仍然可以发现它/opt/texbin
在 zsh 获取此文件之前就在我的 PATH 中。
有任何想法吗?
答案1
/opt/texbin
我将尝试这种方法来追踪PATH 变量中的来源:
获取文件列表,实际上读入(例如非标准文件可能由另一个文件获取!),您可以启用
zsh
该SOURCE_TRACE
选项来调用:$ zsh -o sourcetrace +/etc/zshenv:1> <sourcetrace> +/home/user/.zshrc:1> <sourcetrace> +/home/user/.zcompdump:1> <sourcetrace> +/home/user/.zshrc-last:1> <sourcetrace>
检查这些文件,其中 PATH 变量发挥作用:
$ grep -ie "path.*=" files_from_step_1
不区分大小写至关重要,因为
zsh
使用数组$path
,它会自动转换为类似 bash 的冒号分隔列表$PATH
,反之亦然。如果仍然不走运,请尝试在中包含一条调试消息
/etc/zshenv
,其中首先读取命令:print -l $path
这将为您提供一个很好的 PATH 变量列表,zsh 从其父进程(显示管理器、init 进程等)继承了该变量。*
如果路径确实是从起始进程继承的,那么了解哪些进程是相关的就至关重要:
$ pstree -apH $$
这将生成一个进程树,其中 shell 进程( 中的 pid
$$
)被突出显示。检查这些进程的配置文件,并记住source /some/file
或者. /some file
也可以改变 PATH- 如果您
/etc/profile
在当前控制台中编辑例如,注销并再次登录,则父进程(X 登录管理器)可能仍具有旧环境。+
*正如您所写的,PATH/opt/texbin
之前已经包含/etc/zshenv
被读取、被检查的set -x
内容/etc/zshenv
。使用这种技术我没有得到任何输出,但是使用我的步骤 3,因此我也在答案中包含了其他步骤。
+不久前,我因为这种行为受到了很大的伤害……
答案2
登录时传递给 shell 的 PATH 变量在 中定义/etc/login.defs
。这里有两种设置,环境_SUPATH和环境路径。根据您是以 root 还是用户身份登录,两者之一会通过环境变量 PATH 传递给 shell。在将 PATH 变量传递给 shell 后,任何其他更改都由 shell 的启动脚本控制。
答案3
在加载时激活执行跟踪或源跟踪的正确方法/etc/zshenv
是在 shell 命令中激活它:zsh -l -o xtrace
,zsh -l -o sourcetrace
——请务必尝试使用该-l
选项,因为路径元素可能仅在登录时添加。
/etc/zshenv
除此之外,如果在加载之前仍添加路径元素,则可以检查~/.pam_environment
文件。这是文件的用户本地版本/etc/environment
,大约在同一时间加载,在 shell 或用户环境之前。查看手册页“pam_env”以了解有关所用格式的更多详细信息 - 它与用户文件不同。
另一个次要的可能性是ENV
环境变量。当以 SH 兼容模式启动 SH 兼容 shell 时,路径为 的文件ENV
将作为启动文件加载,而不是其他任何文件。请搜索 shell 的文档以了解更多详细信息。 login.defs
也在登录时和各种用户/登录实用程序中使用,但它/etc/environment
是所有现代登录系统的标准,并且是建立变量的首选PATH
。