我试图/opt/texbin在 Ubuntu 上找到哪个文件将文件夹添加到我的 PATH 变量中。它不存在于我的/etc/environment文件中。文件夹中不sudo grep -lr texbin . 2>/dev/null输出任何内容/etc。而且,如果我添加set -x到/etc/zshenv 文件的开头,我可以/opt/texbin在 zsh 获取此文件之前看到它在我的 PATH 中。
有任何想法吗?
我会尝试这种方法来追踪/opt/texbinPATH 变量中的来源:
要获取实际读入的文件列表(例如,非标准文件可能来自另一个文件!),您可以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>
Run Code Online (Sandbox Code Playgroud)检查这些文件,其中 PATH 变量发挥作用:
$ grep -ie "path.*=" files_from_step_1
Run Code Online (Sandbox Code Playgroud)
不区分大小写至关重要,因为zsh使用 array $path,它会自动转换为类似 bash 的冒号分隔列表$PATH,反之亦然。
如果仍然不走运,请尝试在 中包含调试消息/etc/zshenv,其中首先读取命令:
print -l $path
Run Code Online (Sandbox Code Playgroud)
这将为您提供一个很好的 PATH 变量列表,该列表是 zsh 从其父进程(显示管理器、初始化进程等)继承的。*
如果路径确实是从启动进程继承的,那么了解哪些进程是相关的就至关重要:
$ pstree -apH $$
Run Code Online (Sandbox Code Playgroud)
这会生成一个进程树,其中$$突出显示了 shell 进程(pid in )。也检查这些进程的配置文件,并记住
source /some/file或者. /some file也可以改变 PATH/etc/profile在当前控制台中编辑,例如,注销并再次登录,父进程(X 登录管理器)可能仍具有旧环境。+*正如你所写的,PATH 已经包含/opt/texbin在/etc/zshenv被读取之前,通过set -xin签入/etc/zshenv。使用这种技术我没有得到任何输出,但是在我的第 3 步中,因此我在答案中也包含了其他步骤。
+由于前段时间的这种行为,我深受其害...