Grep

如何查找設置了 $PATH 的所有位置

  • July 23, 2018

我想知道是否有辦法確定 $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 上執行它。

調試 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 在嵌套採購發生時打算使用行。

引用自:https://unix.stackexchange.com/questions/457888