改进了deinspanjer提供的代码,我试图模仿noop命令,就像Chocolatey中的命令一样(choco update --noop / choco已过时)。
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更新,以获取实际上有可用更新的信息。
接下来,我循环浏览所有酒桶以显示其信息。因为我之前做过brew更新,所以现在提供的信息是未安装某些cask的最新版本。
在更新方法内部,我实际上解析了该特定行的info命令:
lookup | grep -B 3 'Not installed' | sed -e '/^http/d;/^Not/d;/:/!d' | cut -d ":" -f1
意思是:“只要您阅读“未安装”行,就在信息的上方提供三行。然后删除其中包含链接的任何行,同时删除其中包含“:”的行。
给定brew cask info命令的结构,我们最后得到一行(无版本信息,无应用程序URL),该行反映了也安装了该桶的实际名称。
酿造桶信息输出
在我的版本中,此信息现在已打印出来,因此您可以轻松查看哪些酒桶已过期并且可以更新。
在这一点上,我做了一个切换案例,因为现在可能没有足够的时间来更新内容。这取决于您的用例。对我来说,有时我只想看看有什么新功能(正在等待新版本,错误修正),但实际上没有时间更新内容,因为现在我不想关闭浏览器等。
因此,如果选择“是”,则将已清理的木桶名称列表提供给更新功能,其中对于每个确定为过时的木桶,将发出重新安装。
再次感谢deinspanjer,在尝试自己解决该问题时,我总是忘记事先发布brew更新,因此那里没有要实际解析的“未安装”行(我整个方法的基础)。
我希望这可以帮到你。