/etc/zshenv 之前设置的 PATH

/etc/zshenv 之前设置的 PATH

我正在尝试查找哪个文件将/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 变量中的来源:

  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>
    
  2. 检查这些文件,其中 PATH 变量发挥作用:

    $ grep -ie "path.*=" files_from_step_1
    

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

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

    print -l $path
    

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

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

    $ 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 xtracezsh -l -o sourcetrace——请务必尝试使用该-l选项,因为路径元素可能仅在登录时添加。

/etc/zshenv除此之外,如果在加载之前仍添加路径元素,则可以检查~/.pam_environment文件。这是文件的用户本地版本/etc/environment,大约在同一时间加载,在 shell 或用户环境之前。查看手册页“pam_env”以了解有关所用格式的更多详细信息 - 它与用户文件不同。

另一个次要的可能性是ENV环境变量。当以 SH 兼容模式启动 SH 兼容 shell 时,路径为 的文件ENV将作为启动文件加载,而不是其他任何文件。请搜索 shell 的文档以了解更多详细信息。 login.defs也在登录时和各种用户/登录实用程序中使用,但它/etc/environment是所有现代登录系统的标准,并且是建立变量的首选PATH

相关内容