当我检查系统环境时,会弹出很多环境变量。我怎样才能搜索特定变量?
我正在读的一本书说:
有时,环境中的变量数量会变得非常大,以至于当您只对一个值感兴趣时,您不想看到显示的所有值。如果是这种情况,您可以使用该
echo
命令来显示环境变量的当前值。
如何在 Linux 终端中执行此操作?
答案1
只是:
echo "$VARIABLENAME"
例如,对于环境变量$HOME
,请使用:
echo "$HOME"
然后打印类似的内容:
/home/username
编辑: 根据斯特凡·查泽拉斯 (Stéphane Chazelas) 的评论printenv
,如果您使用而不是echo
:可能会更好
printenv HOME
答案2
通过执行:
printenv
您将看到所有环境变量。欲了解更多信息,您可以查看:
答案3
重要的是要了解每个进程都有自己的一组环境变量。
当一个进程调用fork()
系统调用时,第二个进程(孩子)与第一个(家长)被创建(这复制包括环境,它位于堆栈的正上方(或正下方,取决于您如何看待堆栈:-)
- 但在 unix/linux 中,堆栈会增长向下来自高地址)。
通常,子进程随后将调用execve()
系统调用,这将丢弃其(虚拟)内存中的所有内容并重建它来自指定二进制文件中的代码和数据部分。
然而,当它重建在调用函数之前,它首先将传递到堆栈的环境和参数字符串execve()
(按该顺序)复制main()
(很多工作是在返回crt0
后的引导代码中完成的execve()
)入口点在二进制文件中指定))。
C 库中有execve()
系统调用的包装器,它们将传递当前环境(即父环境的副本),而不是调用者提供它(因此实际上子级将继承父母的环境) - 请参阅environ(7)
。
尝试运行(以 root 身份)命令ps axeww | less
...这将向您显示以下环境:全部流程!一个有趣的是进程 id 1(即进程init
- 内核在启动时创建的第一个进程)。
如果您想查看特定进程的环境(并且您知道它的进程 ID),请尝试运行该命令cat /proc/<PID>/environ
(替换<PID>
为进程 ID)。
请注意,如果一个进程有足够的权限,它可以重写自己的堆栈,这可能会导致很难知道它的环境是什么 - 您将在 ps 输出中看到一些像这样的守护进程。
但最后,所有这些胡扯都归结为@chaos上面所说的,如果你想查看 shell 进程中特定环境变量的当前值,只需使用(内置)命令echo "$<NAME>"
(替换<NAME>
为您感兴趣的环境变量)...请注意,同一变量在另一个进程中可能具有不同的值,或者根本不存在。
答案4
如果你必须设置很多变量:
( set -o posix ; set ) | sort >~/vars.before
设置后:
( set -o posix ; set ) | sort >~/vars.after
显示已设置的内容:
comm -3 ~/vars.before ~/vars.after | perl -ne 's#\s+##g;print "\n $_ "'
这样你很快就会发现自己正在使用 cnf 文件中预定义的多组 shell 变量,与 tmux 结合将使你成为 shell 环境中配置管理的大师:
# ---------------------------------------------------------
# cat cnf/qto.dev.host-name.cnf
# [MainSection]
# postgres_db_name = dev_qto
# postgres_db_host = host-name
#
# call by: doParseCnfEnvVars cnf/qto.dev.host-name.cnf
# ---------------------------------------------------------
doParseCnfEnvVars(){
cnf_file=$1;shift 1;
test -z "$cnf_file" && echo " you should set the cnf_file !!!"
INI_SECTION=MainSection
( set -o posix ; set ) | sort >~/vars.before
eval `sed -e 's/[[:space:]]*\=[[:space:]]*/=/g' \
-e 's/#.*$//' \
-e 's/[[:space:]]*$//' \
-e 's/^[[:space:]]*//' \
-e "s/^\(.*\)=\([^\"']*\)$/export \1=\"\2\"/" \
< $cnf_file \
| sed -n -e "/^\[$INI_SECTION\]/,/^\s*\[/{/^[^#].*\=.*/p;}"`
# and post-register for nice logging
( set -o posix ; set ) | sort >~/vars.after
echo "INFO added the following vars from section: [$INI_SECTION]"
comm -3 ~/vars.before ~/vars.after | perl -ne 's#\s+##g;print "\n $_ "'
}