命令 eval "$(/opt/homebrew/bin/brew shellenv)" 实际上是做什么的?

命令 eval "$(/opt/homebrew/bin/brew shellenv)" 实际上是做什么的?

Homebrew 要求我们添加eval $(/opt/homebrew/bin/brew shellenv)~/.zprofile.这实际上评估了什么以及它实现了什么?

我对 shell 脚本有点陌生。我知道$var用于引用名为 var 的变量,但仅此而已。在里面放置路径是什么意思$()?这里还有shellenv一个论证,它意味着什么?

答案1

$()命令替换。它执行括号内的命令并返回该命令的输出。

它通常用于将程序的输出放入变量中。例如

$ month=$(date +%m)
$ echo $month
02

或者使用一个程序的输出作为另一个程序的参数,例如

$ printf '%s\n' $(date +%B)
February

(好吧,是的,printf这是一个人为的例子,因为仅仅运行date +%B就会产生相同的输出......但它确实演示了它是如何工作的)。

括号内的命令可以根据您的需要简单或复杂,从单个程序到长管道命令。例如,我经常使用如下命令从 Debian 系统中删除旧的内核软件包:

apt-get purge $(dlocate -k | grep '6\.0\.0-[245]')

顺便说一句,您可能还会看到使用反引号 (`) 的脚本。这是一种旧的、过时的命令替换形式,由于遗留原因而受到支持,但不应在新脚本中使用。

与 一起使用时eval,它会导致您的 shell 执行输出。在这种情况下,运行/opt/homebrew/bin/brew shellenv会返回一堆文本,例如var=valueeval在当前 shell 中运行它们,从而将这些变量设置为所需的值。

来自help evalbash:

eval:eval [arg ...]

将参数作为 shell 命令执行。

将 ARG 组合成单个字符串,使用结果作为 shell 的输入,并执行生成的命令。

退出状态:返回命令的退出状态,如果命令为空,则返回成功。

尝试/opt/homebrew/bin/brew shellenv单独运行看看它会产生什么输出。

答案2

它导出brew 工作所需的环境变量。例如,如果我在没有的情况下运行它eval,那么这就是它在 Fish shell 中的输出:

$ /opt/homebrew/bin/brew shellenv

set -gx HOMEBREW_PREFIX "/opt/homebrew";
set -gx HOMEBREW_CELLAR "/opt/homebrew/Cellar";
set -gx HOMEBREW_REPOSITORY "/opt/homebrew";
set -q PATH; or set PATH ''; set -gx PATH "/opt/homebrew/bin" "/opt/homebrew/sbin" $PATH;
set -q MANPATH; or set MANPATH ''; set -gx MANPATH "/opt/homebrew/share/man" $MANPATH;
set -q INFOPATH; or set INFOPATH ''; set -gx INFOPATH "/opt/homebrew/share/info" $INFOPATH;

然后eval实际执行这些set命令。

需要注意的是,如果它已经加载到会话中,则不会输出任何内容。

相关内容