改进了 deinspanjer 提供的代码,我尝试模仿一个 noop 命令,就像来自 Chocolatey 的那个(choco update --noop / choco outdated)。
https://git.io/vgjiL
#!/bin/sh
fetch(){
echo "Removing brew cache"
rm -rf "$(brew --cache)"
echo "Running brew update"
brew update
}
lookup() {
for c in $(brew cask list); do
brew cask info $c
done
}
update(){
var=$( lookup | grep -B 3 'Not installed' | sed -e '/^http/d;/^Not/d;/:/!d' | cut -d ":" -f1)
if [ -n "$var" ]; then
echo "The following installed casks have updates avilable:"
echo "$var"
echo "Install updates now?"
select yn in "Yes" "No"; do
case $yn in
"Yes") echo "updating outdated casks"; break;;
"No") echo "brew cask upgrade cancelled" ;return;;
*) echo "Please choose 1 or 2";;
esac
done
for i in $var; do
echo "Uninstalling $c"; brew cask uninstall --force "$i"; echo "Re-installing $i"; brew cask install "$i"
done
else
echo "all casks are up to date"
fi
}
fetch
update
正如大家所见,我使用的是模块化方法,因为我的用例略有不同。我不想坐在我的电脑前为我安装的每个应用程序输入是/否。虽然没有真正的升级木桶的方法(只是重新安装最新版本),但我首先进行 brew update 以获得实际可用更新的信息。
接下来,我循环浏览所有酒桶以显示它们的信息。因为我之前做过brew update,所以现在提供了一些cask的最新版本没有安装的信息。
在我的更新方法中,我实际上解析了该特定行的 info 命令:
lookup | grep -B 3 'Not installed' | sed -e '/^http/d;/^Not/d;/:/!d' | cut -d ":" -f1
这意味着:“在您阅读“未安装”行时提供上述 3 行信息。然后删除其中包含链接的任何行,同时删除其中包含“:”的行。 "
鉴于 brew cask info 命令的结构,我们最终得到一行(没有版本信息,没有应用 URL),它反映了安装时使用的 cask 的实际名称。
brew cask info output
在我的版本中,此信息现在已打印出来,因此人们可以轻松查看哪些木桶已过时并可以更新。
此时我做了一个 switch case,因为现在可能没有足够的时间来更新东西。这取决于您的用例。对我来说,有时我只是想看看有什么新东西(等待新版本、错误修复),但实际上没有时间更新,因为现在我不想关闭浏览器等。
因此,如果选择“是”,则将已清理的木桶名称列表提供给更新功能,其中对于确定为过期的每个木桶发出重新安装。
再次感谢 deinspanjer,在尝试为自己解决这个问题时,我总是忘记提前发出 brew update 所以没有“未安装”行来实际解析(我整个方法的基础)。
我希望这会有所帮助。