命令输出评估在 Bash 脚本中不起作用

命令输出评估在 Bash 脚本中不起作用

我正在尝试在 shell 脚本中自动将 Homebrew 添加到我的路径中,但是这两行不会在我的 shell 脚本中进行计算:

#!/bin/sh
eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"

第二行代码运行[home]brew程序论证shellenv。它回显几个环境变量来设置然后对其进行评估。第一行只是将第二行添加到我的~/.profilesobrew的 PATH 中,该路径是在每个 shell 中设置的。

我注意到这个语句在我的 shell 脚本中不起作用,当我将其输入终端时它就会发生。可能是什么原因造成的?

我尝试运行在 shell 脚本中安装 Homebrew 后指示我运行的命令,并得到相同的行为。

类似的问题:

答案1

运行脚本会创建一个本地环境,该环境继承自调用环境,脚本在其中执行,并最终在脚本终止时被销毁。

我首先假设通过“不评估”和“不工作”,您观察到该brew shellenv命令在运行脚本时似乎没有输出任何内容,因此您相信环境在脚本中未正确初始化以与 Homebrew 一起使用。 (注意:在问题经过进一步澄清更新后,这种解释可能不太正确。请参阅下面的分隔符之后。)

brew shellenv如果必要的变量尚未具有正确的值,则该命令仅输出为 Homebrew 设置适当的环境变量的 shell 命令。

您获得的文档brew help shellenv准确地解释了该命令的作用。以下内容来自 macOS 系统,但在 Linux 上可能会有类似的读法(我的重点是添加的):

用法:brew shellenv

打印出口报表。在 shell 中运行时,此 Homebrew 安装将添加到您的PATHMANPATHINFOPATH.

变量HOMEBREW_PREFIX,HOMEBREW_CELLARHOMEBREW_REPOSITORY也被导出以避免多次查询它们。为了帮助保证幂等性,当 Homebrewbinsbin目录分别位于您的文件中的第一个和第二个时,此命令不会产生输出。PATH。考虑将此命令的输出的评估添加到您的点文件(例如~/.profile~/.bash_profile~/.zprofile):eval "$(brew shellenv)"

PATH可能发生的情况是,您的脚本在变量已包含bin和目录的环境中执行sbin,如上面的文本所述。


如果您尝试让脚本更改调用 shell 的环境,则应该使用.source来运行脚本,这将导致文件中的命令在当前的环境(这也意味着#!- 行将被忽略)。

关于这一点,另请参见

相关内容