我要删除的$ PATH中有一个目录。 但我无法弄清楚它是如何到达那里的。 我已经看过所有可以想到$ PATH设置位置的地方:.profile,.bashrc,.bash_profile,et cetra 但是我找不到将这个特定目录放入$ PATH的人。 显然,我不知道在我的系统启动时所有改变$ PATH的东西。 有没有办法调试启动顺序? 理想情况下,我只想在触及$ PATH的任何事物上设置陷阱。 或者我可以扫描一个日志文件(或一组有序的日志文件)。 如何在系统启动时运行的所有事物中找到每个目录在$ PATH中的设置?
答案 0 :(得分:5)
有两种方法可以做到这一点:
在终端窗口中尝试bash --login -x
。这将在执行时打印设置脚本的每一行(kudos转到kojiro)。
或者,您可以在set -x
或/etc/profile
的顶部附近添加$HOME/.profile
。这里的危险是,如果你犯了一个错误,你的系统可能会变得无法使用(如果你不能再开始一个新的shell),你需要root
。如果您想尝试这个,我建议创建两个终端窗口,不惜一切代价保持打开,进行更改,然后启动新的终端窗口以查看效果。
使用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
变量时都会打印。