可能的重複:
如何確定環境變數來自哪裡
我想知道是否有一種方法可以確定某些配置存在的文件的位置。例如,我知道我有一個全域參數TMOUT
,我想更改它,但我不知道它在哪裡配置。我知道這這裡已經提出了這個問題,但是我想知道除了根據命令調查變數出現的順序之外是否還有其他可用的方法env
。
答案1
該命令將需要很長時間才能運行(因為它將檢查系統中的每個文件),但它應該找到該文件:
find / -type f -print0 | xargs -0 grep -w 'TMOUT=' /dev/null
另一種方法是找出它是在什麼情況下設定的,例如檢查 shell 不是登入 shell 時是否設定(env -i bash
)以及是否設定(env -i bash --login
)。您可以手動檢入文件$HOME
,例如.profile
、.env
、.bashrc
或.bash_profile
。還有一些文件/etc/
指定了環境變數;它可以設置在其中任何一個中。
如果您的登入 shell 是ksh
,您會發現它$TMOUT
是由 ksh shell 本身設定的。
編輯:解釋一下上面命令列的一些不太明顯的功能:
這個慣用語find ... -print0 | xargs -0 ...
很常見。使用-print0
而不是預設值的要點-print
是,在-print0
.這意味著包含實際換行符號的檔案名稱將被正確表示。傳遞-0
選項xargs
只是為了xargs
理解相同的約定。
/dev/null
通常作為第一個參數傳遞給 的做法grep
也值得解釋。由於您在讀取時僅獲得文件結尾/dev/null
,因此它永遠不會與任何非空字串相符grep
。因此該文件將不會被點擊。我們只是在grep命令列上指定它,以正確應對最後一次xargs
執行grep時,只剩下一個檔案需要搜尋的情況。如果 grep 只有一個檔案參數,它會列出符合項目而不指定命令列。就像這樣:
~/tmp/t$ echo hello > a
~/tmp/t$ echo hi > b
~/tmp/t$ grep '^h.*' a
hello
~/tmp/t$ grep '^h.*' a b
a:hello
b:hi
答案2
雖然這不是您問題的準確答案,但它可能回答了部分問題。
StackOverflow:Linux:環境變數儲存在哪裡?
編輯:
偵錯 shell 腳本時,我通常會添加 -x#!/bin/bash -x
您也可以嘗試從 shell 運行它:bash -x
# su - test
test$ bash -x
unset a r
+ . /etc/bash_completion.d/yast2-completion.sh
**(file sourced)**
++ YAST=/sbin/yast
++ YAST_MODLIST=()
**(variables set from file)**
#....
++ /usr/bin/dircolors -b /etc/DIR_COLORS
+ eval 'LS_COLORS='\''no=00
#....