Environment-Variables

如何知道哪個文件包含變數定義?

  • September 5, 2021

在我的作業系統中:

echo $CLUTTER_IM_MODULE
fcitx5

如何知道哪個文件包含變數定義?

我知道我們可以在 .bashrc 或 /etc/bash.bash 中定義 env。

獲取包含 string 的文件要花費很多時間CLUTTER_IM_MODULE

sudo grep  -r  CLUTTER_IM_MODULE  /

有沒有聰明的方法來實現我的目標?

如果您確定變數是在 shell 配置文件腳本中定義的,並且您有一個locate支持擴展正則表達式和 NUL 分隔輸出(例如mlocateor plocate)的版本,您可以執行這樣的東西(這將比執行grep -r):

locate -0 --regex '/(\.(bash_)?profile|(bash)?\.?bashrc|etc/profile.d/|etc/environment$)' |
 xargs -0r grep -H '[^$]CLUTTER_IM_MODULE='

筆記:

  1. grep 的-H選項確保文件名始終與匹配項一起輸出,即使只返回一個文件名locate(這不太可能,但無論如何使用 -H 並沒有什麼壞處)。
  2. 您可能也想使用 grep 的-i選項進行不區分大小寫的匹配。
  3. 如果在其他位置可以找到 shell 配置文件腳本,或者它們可能具有其他名稱,那麼您需要調整正則表達式以適應。例如,我原來的正則表達式沒有搜尋/etc/environment(這是可以在某些系統上定義 shell 變數的另一個地方),所以我添加了它。
  4. 這不會也不能告訴您變數實際定義在哪個文件,它只能向您顯示可能對變數的目前值負責的文件**(**它無法知道實際執行的是哪個文件,它只能看到變數是在腳本中設置的)。
  5. locate的數據庫通常每天只更新一次。如果配置文件腳本是在上次執行後創建的,則不會找到該文件。
  6. 根據文件的權限,您可能需要將其執行為:
sudo locate ... | xargs -0r sudo grep -H

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