iLe*_*low 30 command-line environment-variables
当我检查系统环境时,会弹出很多环境变量。我怎样才能只搜索一个特定的变量?
我正在读的一本书说:
有时,您环境中的变量数量会增长得非常大,以至于您不想在只对一个值感兴趣时看到显示的所有值。如果是这种情况,您可以使用该
echo
命令显示环境变量的当前值。
如何在 Linux 终端中执行此操作?
cha*_*aos 36
只是:
echo "$VARIABLENAME"
Run Code Online (Sandbox Code Playgroud)
例如对于环境变量$HOME
,使用:
echo "$HOME"
Run Code Online (Sandbox Code Playgroud)
然后打印类似于以下内容的内容:
/home/username
Run Code Online (Sandbox Code Playgroud)
编辑:根据Stéphane Chazelas的评论,如果您使用printenv
而不是echo
:
printenv HOME
Run Code Online (Sandbox Code Playgroud)
小智 13
通过执行:
printenv
您将看到所有环境变量。有关更多信息,您可以查看:
了解每个进程都有自己的一组环境变量很重要。
当一个进程调用fork()
系统调用,第二个进程(子)等同于第一(父)创建(此副本包括环境,它位于只是堆上方(或下方,这取决于你如何看待栈:-)
-但在 unix/linux 中,堆栈从高地址向下增长)。
通常,子进程随后将调用execve()
系统调用,该系统调用将丢弃其(虚拟)内存中的所有内容,并从指定二进制文件中的代码和数据部分重建它。
但是,当它重建堆栈时,它首先将传递给execve()
堆栈的环境和参数字符串(按此顺序)复制到堆栈中,然后再调用该main()
函数(crt0
在execve()
返回后的引导程序代码中完成了大量工作(到入口)二进制文件中指定的点))。
execve()
C 库中有系统调用的包装器,它们将传递当前环境(即父环境的副本),而不是调用者提供它(因此实际上子级将继承父级的环境) - 参见environ(7)
。
尝试运行(以 root 身份)命令ps axeww | less
...这将显示所有进程的环境!一个有趣的是进程 id 1(即init
进程 - 内核在启动时创建的第一个进程)。
如果您想查看特定进程的环境(并且您知道它是进程 ID),请尝试运行该命令cat /proc/<PID>/environ
(替换<PID>
为进程 ID)。
请注意,如果一个进程有足够的权限,它可以重写自己的堆栈,这会导致很难知道它的环境是什么——你会在 ps 输出中看到一些这样的守护进程。
但最后,所有这些华夫饼都归结为@chaos 上面所说的,如果您想查看 shell 进程中特定环境变量的当前值,只需使用(内置)命令echo "$<NAME>"
(替换<NAME>
为您感兴趣的环境变量)...请注意,在另一个进程中,相同的变量可能具有不同的值,或者根本不存在。