it-swarm-es.com

¿Cómo pruebo para ver si existe una aplicación en $ PATH?

Estoy tratando de escribir todos mis scripts de sh startup/env para que funcionen con tanto DRY y tanto: "funciona en cada * nix lo clono en ", como sea posible. Esto significa asegurarme de que si intento ejecutar un código que no está ahí, el código falla correctamente. Con ese fin, necesito poder probar si existen programas. Sé cómo probar si existe un archivo, pero no estoy seguro de cómo probar para ver si una aplicación es ejecutable dentro de la ruta. Prefiero usar $ PATH, ya que algunos de estos necesitan funcionar en Arch, ubuntu y centos. Algunos pueden estar instalados en mi homedir, en sistemas donde no tengo root, otros pueden no estar instalados y otros aún pueden estar instalados en las rutas del sistema.

19
xenoterracide

Utilice type commandname . Esto devuelve verdadero si commandname es algo ejecutable: alias, función, comando integrado o externo (buscado en $PATH). Alternativamente, use command commandname que devuelve verdadero si commandname es un comando incorporado o externo (buscado en $PATH).

exists () {
  type "$1" >/dev/null 2>/dev/null
}

Hay algunas variantes de sh (definitivamente pre-POSIX; conozco /bin/sh bajo OSF1 ≤3.xy algunas versiones de Almquist Shell que se encuentran en las primeras versiones de NetBSD y algunas distribuciones de Linux del siglo XX) donde type siempre devuelve 0 o no existe. No creo que ningún sistema se haya enviado con estos este milenio. Si alguna vez los encuentra, aquí tiene una función que puede usar para buscar en $PATH manualmente:

exists () { (
    IFS=:
    for d in $PATH; do
      if test -x "$d/$1"; then return 0; fi
    done
    return 1
) }

Esta función es generalmente útil si desea excluir incorporados y funciones y buscar el nombre en $PATH. La mayoría de las conchas tienen una función incorporada para esto, command -v , aunque es una adición relativamente reciente a POSIX (sigue siendo opcional a partir de POSIX: 2004). Es básicamente una versión fácil de programar de type: imprime la ruta completa de un ejecutable en $PATH, el nombre básico de una función o incorporada, y una definición de alias para un alias.

exists_in_path () {
  case $(command -v -- "$1") in
    /*) return 0;;
    alias\ *) return 1;; # alias
    *) return 1;; # built-in or function
  esac
}

Ksh, bash y zsh también tienen type -p para buscar solo ejecutables en $PATH. Tenga en cuenta que en bash, el estado de retorno de type -p foo es 0 si foo es una función incorporada; si desea probar un ejecutable en $PATH, debe verificar que la salida no esté vacía. type -p no está en POSIX; por ejemplo, la ceniza de Debian (que es /bin/sh en Ubuntu) no lo tiene.

Si solo está buscando programas externos, también puede usar which. No sé qué tan portátil es eso.

1
Kim