我创建了一个设置新mac的ruby脚本。
除此之外,它还会创建.bash_profile
,.gitconfig
并配置各种系统设置,例如将完整的POSIX路径显示为Finder窗口标题(超级有用)。
主要是我在反引号中运行命令,例如`defaults write com.apple.finder _FXShowPosixPathInTitle -bool true`
前面提到的完整POSIX路径作为Finder窗口标题技巧。
这一切都很好。
我想要做的是让这个ruby脚本运行Homebrew安装程序。 bash命令是:
$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
然而,使用反引号调用时这并不起作用。
所以我的问题是如何在ruby脚本中运行另一个ruby脚本(Homebrew安装程序)?
更具体地说,我将如何启动基于Web的交互式Homebrew安装程序(您必须至少按一次return
)来自ruby脚本并将其输出显示在终端中?
我知道我可以将此全部重写为bash
脚本,但我真的宁愿将其全部保留在ruby中。
答案 0 :(得分:2)
让我们分解$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
实际做的事情:
$()
包围,因此它执行命令并将输出传递给ruby。-e
标志指示Ruby从命令行执行脚本,而不是加载指定的文件。由于我们知道它是一个ruby脚本,我们可以执行以下操作:
Net::HTTP
或其他一些ruby库,下载自制软件安装文件。eval()
或以其他方式执行自制的ruby脚本。当然,eval()
是危险的,特别是对于不受信任的输入,但是您已经基本上使用提供的安装命令在脚本上运行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)