Detectar si el paquete homebrew está instalado

104

Estoy a punto de escribir un script de shell para detectar si hay varios paquetes homebrew instalados en el sistema. ¿Hay alguna forma de usar un comando de preparación para lograr eso?

Intenté usar el código de salida de brew install <formula> --dry-run. Pero esto crea el paquete si falta.

iltempo
fuente
brew --cellar "$formula" >/dev/null 2>&1 --cellar formula: Display the location in the cellar where formula would be installed, without any sort of versioned directory as the last path. brew man page ; Me hubiera encantado darlo como respuesta
166_MMX
if [ ! -x "$(command -v PKG_EXEC)" ]; then # package not installed fi
JBallin

Respuestas:

165

Puedes usar

brew ls --versions myformula

para generar las versiones instaladas de la fórmula respectiva. Si la fórmula no está instalada, la salida estará vacía.

Cuando use una versión reciente de homebrew, con la que puede obtener brew update, puede ejecutar esto (gracias Slaven):

if brew ls --versions myformula > /dev/null; then
  # The package is installed
else
  # The package is not installed
fi

Dicho esto, probablemente sea una buena idea verificar la existencia de la herramienta y no solo verificar el paquete homebrew respectivo (por ejemplo, buscando el ejecutable en $PATH). La gente tiende a instalar herramientas en una gran cantidad de formas en la práctica, y el homebrew es solo una de ellas.

Holger solo
fuente
6
Desde github.com/Homebrew/brew/commit/… es suficiente verificar el código de salida: si la fórmula no está instalada, se devuelve falso (1).
Slaven Rezic
Entonces, si ejecuto if macchanger --help > /dev/null; then, ¿comprobará si macchangerestá instalado?
anónimo
@KeeganKuhn Si eso tuvo éxito, entonces macchangerestá en el shell actual $PATH. Si falla, no está disponible en la RUTA o no está instalado.
Holger Just
2
@Keegan Kuhn: si realmente solo desea verificar si una aplicación está en la RUTA (sin ejecutarla), puede usar which -s. La -sopción (silenciosa) se documenta como "-s Sin salida, solo devuelve 0 si se encuentra alguno de los ejecutables, o 1 si no se encuentra ninguno". El uso adecuado es algo así comowhich macchanger || echo "macchanger not on PATH"
Jeffrey Aguilera
7

¿Qué pasa?

for pkg in macvim ngrep other needed packages; do
    if brew list -1 | grep -q "^${pkg}\$"; then
        echo "Package '$pkg' is installed"
    else
        echo "Package '$pkg' is not installed"
    fi
done
Johannes Weiss
fuente
Sus soluciones no funcionan con alguna fórmula versionada como la python@3que está instalada (y listada) como python3.
Daniele Orlando
1
# install if we haven't installed any version
brew ls --versions $lib || brew install $lib
# install if we haven't installed latest version
brew outdated $lib || brew install $lib
timotheecour
fuente
1

Dos líneas más fáciles: paso uno, asegúrese de que esté instalado

$ realpath . || brew install coreutils

Esto imprimirá la ruta real del directorio actual, si no, lo instalará. Y no fallará ni siquiera el camino real no encontrado.

Paso dos, llámelo en su código real:

$ realpath ${someDir}
ForeverYang
fuente
Esta es una solución sencilla para una herramienta específica. No es una solución genérica.
iltempo