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

Osb*_*dge 16 shell homebrew syntax macos

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

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

cas*_*cas 12

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

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

$ month=$(date +%m)
$ echo $month
02
Run Code Online (Sandbox Code Playgroud)

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

$ printf '%s\n' $(date +%B)
February
Run Code Online (Sandbox Code Playgroud)

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

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

apt-get purge $(dlocate -k | grep '6\.0\.0-[245]')
Run Code Online (Sandbox Code Playgroud)

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

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

来自help evalbash:

eval:eval [arg ...]

将参数作为 shell 命令执行。

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

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

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

  • @Osbridge `brew shellenv` 在某些情况下根本不给出任何输出,这是由 `brew help shellenv` 解释的(在最近的答案中提到:[命令输出评估在 Bash 脚本中不起作用](https://unix.stackexchange. com/a/735710))。 (2认同)