如何显示环境变量的当前值?

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)

  • 另请注意,如果有多个同名的环境条目(好吧,这是一个病态的案例),您将获得哪一个取决于 shell(通常是第一个或最后一个)。`printenv VAR` 将全部显示它们(至少对于 GNU 实现而言)。 (5认同)
  • 您忘记了引号(除非您暗示的是 zsh 或 rc/es 语法)。`echo` 是一个糟糕的命令选择,因为它可以转换变量的内容。它将以相同的名称输出 shell 参数的内容。例如,如果使用 Bourne shell 或对于像 `1`、`*` 这样的环境变量,这不一定相同。并且您不能将这种方法用于名称作为 shell 变量名称无效的环境变量。 (4认同)

小智 13

通过执行:

printenv

您将看到所有环境变量。有关更多信息,您可以查看:

https://www.digitalocean.com/community/tutorials/how-to-read-and-set-environmental-and-shell-variables-on-a-linux-vps

  • 为了接近实际回答问题,`printenv ` *`variablename`* 将仅显示命名变量;例如,`printenv HOME` 将做与`echo "$HOME"` 大致相同的事情。 (2认同)

Mur*_*sen 5

了解每个进程都有自己的一组环境变量很重要。

当一个进程调用fork()系统调用,第二个进程()等同于第一()创建(此副本包括环境,它位于只是堆上方(或下方,这取决于你如何看待栈:-)-但在 unix/linux 中,堆栈从高地址向下增长)。

通常,子进程随后将调用execve()系统调用,该系统调用将丢弃其(虚拟)内存中的所有内容,并从指定二进制文件中的代码和数据部分重建它。

但是,当它重建堆栈时,它首先将传递给execve()堆栈的环境和参数字符串(按此顺序)复制到堆栈中,然后再调用该main()函数(crt0execve()返回后的引导程序代码中完成了大量工作(到入口)二进制文件中指定的))。

execve()C 库中有系统调用的包装器,它们将传递当前环境(即父环境的副本),而不是调用者提供它(因此实际上子级将继承父级的环境) - 参见environ(7)

尝试运行(以 root 身份)命令ps axeww | less...这将显示所有进程的环境!一个有趣的是进程 id 1(即init进程 - 内核在启动时创建的第一个进程)。

如果您想查看特定进程的环境(并且您知道它是进程 ID),请尝试运行该命令cat /proc/<PID>/environ(替换<PID>为进程 ID)。

请注意,如果一个进程有足够的权限,它可以重写自己的堆栈,这会导致很难知道它的环境是什么——你会在 ps 输出中看到一些这样的守护进程。

但最后,所有这些华夫饼都归结为@chaos 上面所说的,如果您想查看 shell 进程中特定环境变量的当前值,只需使用(内置)命令echo "$<NAME>"(替换<NAME>为您感兴趣的环境变量)...请注意,在另一个进程中,相同的变量可能具有不同的值,或者根本不存在。