可能的重复:
如何确定环境变量来自哪里
我想知道是否有一种方法可以确定某些配置存在的文件的位置。例如,我知道我有一个全局参数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
#....