我使用Homebrew Cask在OS x上安装应用程序,如何升级所有已安装的Cask ?


当前回答

我认为使用

brew cask reinstall `brew cask outdated`

会成功的。这也将有助于删除应用程序的以前版本,并安装新版本。

其他回答

升级所有未标记为“可自动升级”的桶

brew upgrade --cask

升级所有桶(“可自动升级”和“不可自动升级”)

brew upgrade --cask --greedy

买过时的酒桶:

酿酒桶过时了

升级桶:

酿造桶重新安装过时的桶

演示脚本:

$ cat ~/bin/brew_cask_upgrade.sh
#!/bin/bash
red=$(tput setaf 1)
# green=$(tput setaf 2)
reset=$(tput sgr0)

(set -x; brew update;)

for cask in $(brew cask outdated | awk '{print $1}')
do
    echo "${red}update ${cask} ...${reset}."
    (set -x; brew cask install --force "$cask";)
done

echo "${red}brew clean up ...${reset}"
(set -x; brew cask cleanup;)
echo "${red}brew clean up done.${reset}"

酿造升级—酒桶$(酿造列表—酒桶)

Bash脚本升级包

受到帕斯卡答案的启发

#!/usr/bin/env bash

(set -x; brew update;)

(set -x; brew cleanup;)
(set -x; brew cask cleanup;)

red=`tput setaf 1`
green=`tput setaf 2`
reset=`tput sgr0`

casks=( $(brew cask list) )

for cask in ${casks[@]}
do
    version=$(brew cask info $cask | sed -n "s/$cask:\ \(.*\)/\1/p")
    installed=$(find "/usr/local/Caskroom/$cask" -type d -maxdepth 1 -maxdepth 1 -name "$version")

    if [[ -z $installed ]]; then
        echo "${red}${cask}${reset} requires ${red}update${reset}."
        (set -x; brew cask uninstall $cask --force;)
        (set -x; brew cask install $cask --force;)
    else
        echo "${red}${cask}${reset} is ${green}up-to-date${reset}."
    fi
done

它的作用

更新酿造/酿造桶,清理 读酒桶清单 检查酿造桶信息的最新版本 如果可用,请安装新版本(并删除所有旧版本!)

来源:https://gist.github.com/atais/9c72e469b1cbec35c7c430ce03de2a6b

对不耐烦的人说一句:

curl -s https://gist.githubusercontent.com/atais/9c72e469b1cbec35c7c430ce03de2a6b/raw/36808a0544628398f26b48f7a3c7b309872ca2c6/cask_upgrade.sh | bash /dev/stdin

保存为/usr/local/bin/桶-upgrade,以便稍后在本地以桶-upgrade的形式运行

改进了deinspanjer提供的代码,我尝试模仿一个noop命令,很像来自chocolatey的命令(choco update——noop / choco obsolete)。

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

可以看到,我使用的是模块化方法,因为我的用例略有不同。我不想坐在我的电脑前,对我安装的每个应用程序都输入是/否。虽然没有真正的升级桶的方法(只是重新安装最新版本),我首先做酿造更新的信息,有实际更新可用。

接下来,我循环遍历所有桶以显示它们的信息。因为我之前做了酿造更新,现在提供了一些桶的最新版本没有安装的信息。

在我的update方法中,我实际上为特定的行解析了info命令:

lookup  | grep -B 3 'Not installed' | sed -e '/^http/d;/^Not/d;/:/!d'  | cut -d ":" -f1

这句话的意思是:“当你读到“未安装”这一行时,给出上面3行信息。然后删除任何有链接的行,也删除有“:”的行。”

考虑到brew cask info命令的结构,我们最终得到一行(没有版本信息,没有应用程序URL),它反映了它安装的桶的实际名称。

酿造桶信息输出

在我的版本中,这些信息现在被打印出来,所以人们可以很容易地看到哪些木桶过时了,并可以更新。

在这里我做了一个切换的例子,因为现在可能没有足够的时间来更新东西。这取决于您的用例。对我来说,我有时只是想看看有什么新的(等待一个新版本,一个错误修复),但实际上没有时间更新东西,因为现在我不想关闭我的浏览器等。

因此,如果有人选择“是”,则将已清理的桶名列表提供给更新函数,其中对于每个被确定为过期的桶,将发布重新安装。

再次感谢deinspanjer,当我试图为自己解决这个问题时,我总是忘记事先发布brew更新,所以没有“未安装”行来实际解析(这是我整个方法的基础)。

我希望这对你们有帮助。