我该如何调试$ PATH?

时间:2014-12-15 15:23:50

标签: macos bash

我要删除的$ PATH中有一个目录。 但我无法弄清楚它是如何到达那里的。 我已经看过所有可以想到$ PATH设置位置的地方:.profile,.bashrc,.bash_profile,et cetra 但是我找不到将这个特定目录放入$ PATH的人。 显然,我不知道在我的系统启动时所有改变$ PATH的东西。 有没有办法调试启动顺序? 理想情况下,我只想在触及$ PATH的任何事物上设置陷阱。 或者我可以扫描一个日志文件(或一组有序的日志文件)。 如何在系统启动时运行的所有事物中找到每个目录在$ PATH中的设置?

3 个答案:

答案 0 :(得分:5)

有两种方法可以做到这一点:

  1. 在终端窗口中尝试bash --login -x。这将在执行时打印设置脚本的每一行(kudos转到kojiro)。

    或者,您可以在set -x/etc/profile的顶部附近添加$HOME/.profile。这里的危险是,如果你犯了一个错误,你的系统可能会变得无法使用(如果你不能再开始一个新的shell),你需要root。如果您想尝试这个,我建议创建两个终端窗口,不惜一切代价保持打开,进行更改,然后启动新的终端窗口以查看效果。

  2. 使用grep -r PATTERN /(将PATTERN替换为您要查找的路径)。这应该搜索整个硬盘的这种模式,可能需要很长时间。也许从您的主目录开始。如果您只想搜索.个文件,请使用此技巧:grep -r PATTERN .??*

答案 1 :(得分:4)

如果您使用BASH,登录加载的工作方式是此顺序:

    首先阅读
  • /etc/profile
  • $HOME/.bash_profile已被阅读。
  • 如果$HOME/.bash_profile不存在,则会读入$HOME/.bash_login
  • 如果$HOME/.bash_login不存在,则会读入$HOME/.profile

注意 :默认情况下未读入$HOME/.bashrc。但是,许多人在登录时在.bashrc文件中执行 source

调用shell时,如果它不是登录shell,则会加载$HOME/.bashrc文件。


默认情况下,Mac的路径为/bin:/usr/bin:/usr/sbin:/sbin。这是通过执行/etc/profile的{​​{1}}设置的。这将采用/usr/libexec/path_helper/etc/paths.d/...的初始路径。如果安装了X11,则/etc/paths仅在/etc/paths.d目录中添加。否则,使用/opt/X11/bin并且它包含默认路径。

我的设置为:

  • /etc/paths
  • /usr/local/bin
  • /usr/bin
  • /bin
  • /usr/sbin

我将/sbin用于第三方工具。或已安装工具的较新版本。例如,/usr/local/bin是版本1.7.17,而/usr/bin/svn是版本1.8.10。我调用/usr/local/bin/svn将调用我安装的Subversion版本,而不是本机版本。

在这种情况下,1.8版本的Subversion实际安装在svn中,但我在/opt/subversion/bin/svn中创建了一个符号链接。我为我安装的任何工具执行此操作:该工具已安装在/usr/local/svn中,我将二进制文件和脚本链接到/opt,因此它们位于我的/usr/local/bin中。

答案 2 :(得分:2)

将{2}行放在~/.bash_profile的顶部(如果它不存在则创建它):

set -o functrace
trap '[[ "$BASH_COMMAND" == *" PATH="* ]] && echo "$BASH_COMMAND"' DEBUG

然后退出当前shell并启动一个新shell。

每次在您的环境中设置PATH变量时都会打印。