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=value
并eval
在当前 shell 中运行它们,从而将这些变量设置为所需的值。
来自help eval
bash:
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
命令。
需要注意的是,如果它已经加载到会话中,则不会输出任何内容。