在 /etc/zshenv 之前设置的 PATH

sen*_*cer 6 zsh path

我试图/opt/texbin在 Ubuntu 上找到哪个文件将文件夹添加到我的 PATH 变量中。它不存在于我的/etc/environment文件中。文件夹中不sudo grep -lr texbin . 2>/dev/null输出任何内容/etc。而且,如果我添加set -x/etc/zshenv 文件的开头,我可以/opt/texbin在 zsh 获取此文件之前看到它在我的 PATH 中。

有任何想法吗?

mpy*_*mpy 6

我会尝试这种方法来追踪/opt/texbinPATH 变量中的来源:

  1. 要获取实际读入的文件列表(例如,非标准文件可能来自另一个文件!),您可以zshSOURCE_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)
  2. 检查这些文件,其中 PATH 变量发挥作用:

    $ grep -ie "path.*=" files_from_step_1
    
    Run Code Online (Sandbox Code Playgroud)

    不区分大小写至关重要,因为zsh使用 array $path,它会自动转换为类似 bash 的冒号分隔列表$PATH,反之亦然。

  3. 如果仍然不走运,请尝试在 中包含调试消息/etc/zshenv,其中首先读取命令:

    print -l $path
    
    Run Code Online (Sandbox Code Playgroud)

    这将为您提供一个很好的 PATH 变量列表,该列表是 zsh 从其父进程(显示管理器、初始化进程等)继承的。*

  4. 如果路径确实是从启动进程继承的,那么了解哪些进程是相关的就至关重要:

    $ 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 步中,因此我在答案中也包含了其他步骤。

+由于前段时间的这种行为,我深受其害...