我正在尝试在 shell 脚本中自动将 Homebrew 添加到我的路径中,但是这两行不会在我的 shell 脚本中进行计算:
#!/bin/sh
eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"
第二行代码运行[home]brew
程序论证shellenv
。它回显几个环境变量来设置然后对其进行评估。第一行只是将第二行添加到我的~/.profile
sobrew
的 PATH 中,该路径是在每个 shell 中设置的。
我注意到这个语句在我的 shell 脚本中不起作用,但当我将其输入终端时它就会发生。可能是什么原因造成的?
我尝试运行在 shell 脚本中安装 Homebrew 后指示我运行的命令,并得到相同的行为。
类似的问题:
答案1
运行脚本会创建一个本地环境,该环境继承自调用环境,脚本在其中执行,并最终在脚本终止时被销毁。
我首先假设通过“不评估”和“不工作”,您观察到该brew shellenv
命令在运行脚本时似乎没有输出任何内容,因此您相信环境在脚本中未正确初始化以与 Homebrew 一起使用。 (注意:在问题经过进一步澄清更新后,这种解释可能不太正确。请参阅下面的分隔符之后。)
brew shellenv
如果必要的变量尚未具有正确的值,则该命令仅输出为 Homebrew 设置适当的环境变量的 shell 命令。
您获得的文档brew help shellenv
准确地解释了该命令的作用。以下内容来自 macOS 系统,但在 Linux 上可能会有类似的读法(我的重点是添加的):
用法:
brew shellenv
打印出口报表。在 shell 中运行时,此 Homebrew 安装将添加到您的
PATH
、MANPATH
和INFOPATH
.变量
HOMEBREW_PREFIX
,HOMEBREW_CELLAR
和HOMEBREW_REPOSITORY
也被导出以避免多次查询它们。为了帮助保证幂等性,当 Homebrewbin
和sbin
目录分别位于您的文件中的第一个和第二个时,此命令不会产生输出。PATH
。考虑将此命令的输出的评估添加到您的点文件(例如~/.profile
、~/.bash_profile
或~/.zprofile
):eval "$(brew shellenv)"
PATH
可能发生的情况是,您的脚本在变量已包含bin
和目录的环境中执行sbin
,如上面的文本所述。
如果您尝试让脚本更改调用 shell 的环境,则应该使用.
或source
来运行脚本,这将导致文件中的命令在当前的环境(这也意味着#!
- 行将被忽略)。
关于这一点,另请参见