【问题标题】:Verify via bash that a Homebrew extenshion (cask) is installed通过 bash 验证是否安装了 Homebrew 扩展(木桶)
【发布时间】:2016-01-10 10:13:06
【问题描述】:

我正在编写一个脚本来自动在 Mac 上设置开发环境,但是我在某些人的 Mac 上遇到了一个问题,其中 cask(Homebrew 扩展)没有安装。有没有办法可以检查 bash 中是否安装了 cask?

理想情况下,我正在寻找类似的东西:

if caskIsInstalled then
    # do stuff...
fi

我已经能够使用type 命令验证 brew 本身是否已安装,但我无法找到验证 cask 的方法。

if ! type "brew" > /dev/null; then
    echo "Failed to install Homebrew"
    # do stuff...
fi

【问题讨论】:

  • 尝试安装它?查看brew list 的输出?看看brew info cask 在这种情况下是否说了什么有用的东西?
  • @EtanReisner brew info cask 返回Error: No available formula for cask。有什么东西可以用来解析 bash 中的输出吗?
  • 投反对票,没有任何关于原因的反馈,无助于任何人提高问题的质量。
  • 安装后返回什么?在这两种情况下它返回什么退出状态?理想情况下,它会在安装时返回0,在安装时返回非零值,您可以直接使用它。
  • @EtanReisner 这就是它的行为方式。谢谢,我没想到要检查返回码。我将能够想出一些东西。

标签: macos bash homebrew


【解决方案1】:

这似乎有效:

if brew info brew-cask | grep "brew-cask" >/dev/null 2>&1 ; then 
   echo cask is installed
fi

【讨论】:

  • grep -q 可能比重定向输出更好,但使用brew 本身的返回状态甚至更好。
  • @EtanReisner 我实际上尝试了brew ... | grep -q ...,但如果没有安装,你会得到一个损坏的管道错误。所以,正如你所说,我想你可以处理 grep 并使用退出状态,但你仍然需要 stderr 重定向。
  • 是的,没有grep 你需要重定向。除非在环境中忽略了 SIGPIPE(或者我认为 brew 通常不能正确处理 SIGPIPE),否则你不应该得到一个损坏的管道。有关该主题的一些讨论,请参阅stackoverflow.com/q/33020759/258523(以及我评论中的链接)。
  • @EtanReisner 请继续提出您建议的答案 - 它比我的要好。
【解决方案2】:

鉴于brew 在安装包时会返回一个正常的退出状态而不是在安装包时返回一个正常的退出状态,因此可以完全避免需要管道和grep

if ! brew info brew-cask &>/dev/null; then
    : Do something because cask is not installed
else
    : Do something when cask is installed
fi

如果brew 有一个-q/--quiet 选项可以消除您在卸载的包上使用info 时遇到的错误,那么可以使用它来代替重定向。

【讨论】:

  • 很好,不过如果测试要完全静默,&>/dev/null 也应该用于静默 stdout 输出以防测试成功。
猜你喜欢
  • 2015-11-05
  • 2019-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-26
  • 2013-11-13
  • 2011-01-31
相关资源
最近更新 更多