从 ruby 脚本中安装 Homebrew

Install Homebrew from within a ruby script

我创建了一个 ruby 脚本来设置一个新的 mac。

除其他外,它还创建了 .bash_profile.gitconfig 并配置了各种系统设置,例如显示完整的 POSIX 路径作为 Finder window 标题(超级有用).

大多数情况下,我 运行 在反引号中使用命令,例如 `defaults write com.apple.finder _FXShowPosixPathInTitle -bool true` 前面提到的完整 POSIX 路径作为 Finder window 标题技巧。

一切正常。

我想做的是让这个 ruby 脚本 运行 也包含 Homebrew 安装程序。 bash 命令是:

$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

然而,这在使用反引号调用时不起作用。

所以我的问题是如何从 ruby 脚本中 运行 另一个 ruby 脚本(Homebrew 安装程序)?

更具体地说,我将如何从 ruby 脚本中启动基于 Web 的交互式 Homebrew 安装程序(好吧,你必须至少按一次 return),并将其输出显示在航站楼?

我知道我可以将其全部重写为 bash 脚本,但我真的宁愿将其全部保留在 ruby.

让我们来分解一下$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"实际做了什么:

  1. 通过 curl 下载自制程序安装 ruby 文件。由于命令被 $() 包围,它执行命令并将输出传递给 ruby.
  2. 通过Ruby执行脚本。 -e 标志指示 Ruby 从命令行执行脚本而不是加载指定文件。

因为我们知道这是一个 ruby 脚本,所以我们可以执行以下操作:

  1. 使用 Net::HTTP 或其他一些 ruby 库,下载自制程序安装文件。
  2. eval() 或以其他方式执行自制 ruby 脚本。

当然,eval() 是危险的,尤其是对于不受信任的输入,但您基本上已经 运行 使用提供的安装命令对脚本进行评估。

脚本形式为:

require 'net/http'

homebrew_uri = URI('https://raw.githubusercontent.com/Homebrew/install/master/install')
homebrew_script = Net::HTTP.get(homebrew_uri)
eval(homebrew_script)