我想知道是否有办法确定 $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
PS4
bash 使用它来打印-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 -v
或bash -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
.