通过bash验证Homebrew扩展(cask)是否已安装

3
我正在编写一段脚本以自动设置 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 是否在这种情况下有用的信息? - Etan Reisner
@EtanReisner brew info cask 返回 Error: No available formula for cask。 我可以使用什么工具在 bash 中解析输出吗? - Mike Rylander
3
一个没有任何反馈的负面评价并不能帮助任何人提高问题的质量。 - Mike Rylander
@EtanReisner,问题在于cask无法安装,而不是没有被安装。解决方法涉及修复目录权限。 - Mike Rylander
那么,接下来应该重新安装cask,对吗?你可以检查这些权限问题并修复它们(或询问如何修复它们和安装cask)。这样就可以避免这种需要(虽然很明显也可以通过这种方式处理)。 - Etan Reisner
显示剩余4条评论
2个回答

3
鉴于 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命令产生的错误,而不是使用重定向。

1
不错,但是如果测试需要完全无声,则应该使用&>/dev/null来在测试成功的情况下也消除_stdout_输出。 - mklement0

2

这似乎是有效的:

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

使用grep -q可能比重定向输出更好,但是使用brew本身的返回状态甚至更好。 - Etan Reisner
@EtanReisner 我之前尝试过 brew ... | grep -q ...,但如果它没有被安装,你会得到一个"broken pipe"错误。所以,就像你说的那样,我猜你可以放弃 grep 并使用退出状态,但你仍然需要进行stderr重定向。 - Mark Setchell
是的,如果没有 grep,你需要使用重定向。但是,除非环境中有某些忽略了 SIGPIPE(或者 brew 通常不能正确处理 SIGPIPE),否则不应该出现破损的管道。请参见 https://dev59.com/5o_ea4cB1Zd3GeqPUeaH(以及我的评论中的链接)以获取有关该主题的一些讨论。 - Etan Reisner
2
@EtanReisner,请继续提出你的建议答案——它比我的好。 - Mark Setchell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接