如何查找设置 $PATH 的所有位置

如何查找设置 $PATH 的所有位置

我想知道是否有办法确定 $PATH 变量的特定部分的设置位置。

大约一年半前,我经历了在我的计算机上为我正在学习的课程设置 Oracle XE 11.2.0 的繁琐过程。在此过程中的某个位置,我将路径“/u01/app/oracle/product/11.2.0/xe/bin”添加到我的 $PATH 变量中以使事情正常运行。现在我已经删除了 Oracle DB 专用的根 /u01/ 文件夹,因此 bash 在启动时会抛出错误,表明该文件或目录不存在。所以我手动查看了我能找到的所有可能的文件,但什么也没有。

据我所知, $PATH 的该部分未在以下任何文件中设置 :/etc/login.defs~/.profile/etc/environment/etc/profile~/.bash_login或。~/.bash_profile~/.bashrc

cat ~/.bashrc | grep "*oracle*"首先通过运行上面列出的每个文件来验证这一点。我什至做了疯狂的事情并跑sudo strings /dev/sdb -n 11 | grep -C100 "/u01/app/oracle/*"给我包含该字符串的每个文件的列表。我得到了很多结果,但没有什么特别有价值的。我可怜的 SSD 不值得这样。

那么有什么建议吗?我怎样才能找到 $PATH 的那部分被连接到的位置?我还应该检查其他典型文件吗?如果可以缩小范围的话,我正在 Linux Mint 18.3 上运行它。

答案1

调试 shell 初始化的一种方法是运行登录交互式 shell ( -li) 并告诉它在执行时打印所有命令,并在输出中查找您想要的内容:

PS4=' $BASH_SOURCE:$LINENO: ' bash -lixc true |& grep oracle

PS4bash 使用它来打印-x选项中的额外信息,当设置为 时$BASH_SOURCE:$LINENO,它将打印正在获取的文件的路径和正在执行的行号。运行 with-c true |& grep oracle可以让我们快速过滤单个 shell 的初始化。通过前导空格,bash 在发生嵌套采购时会出现行。

答案2

尝试

grep -lr /u01/app/oracle/product/11.2.0/xe/bin /etc/*

这列出了/etc/包含路径元素的文件。如果像您所说的那样,它不在您在问题中列出的文件中,则它应该在下面/etc/。我的猜测是/etc/profile.d/.

更新1

假设您使用 bash,您可以尝试bash -vbash -x尝试查看运行了哪些命令。bash -v转储原始源,bash -x转储带有扩展变量的实际执行的命令。这些标志可以组合起来,但代价是可读性大大降低:)

答案3

您还可以检查 string oraenv

Oracle 数据库安装程序通常会创建一对脚本:/usr/local/bin/oraenv设置 Oracle 数据库引擎所需的所有环境变量,以及/usr/local/bin/coraenv取消设置它们。由于这些脚本的目的是操纵当前会话的环境变量,因此需要对它们进行“来源”,否则它们将不会达到预期的效果。

您可能已oraenv在登录脚本中包含如下内容:

ORACLE_SID=<database SID here>
ORAENV_ASK=NO
. oraenv

最后一行也可以是source oraenv.

相关内容