GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cuál es la mejor manera de detectar (a partir de un script) si el software está instalado?

Me he sentido frustrado antes con las diferencias en la salida del which Comando en diferentes plataformas (Linux vs. Solaris vx. OS X), con diferentes shells posiblemente también jugando en el asunto. type se ha sugerido como una mejor alternativa, pero ¿qué tan portátil sería?

En el pasado, he escrito funciones que analizan la salida de which y manejar los diferentes casos de uso con los que me he encontrado. Funcionan en todas las máquinas que uso, por lo que están bien para mis scripts personales, pero esto parece terriblemente poco confiable para el software que voy a publicar en algún lugar para que otros lo usen.

Para tomar solo un ejemplo posible, suponga que tengo que detectar a partir de un script si bash y zsh están disponibles en una máquina, y luego ejecutar un comando con zsh si está presente, y con bash si zsh no lo está y bash es suficiente. versión para no tener un error en particular. La mayor parte del resto de la secuencia de comandos podría ser Bourne Shell o Ruby o cualquier otra cosa, pero esta cosa en particular debe hacerse (AFAIK) con zsh o una versión reciente de bash.

¿Puedo contar con type estar disponible en todas las plataformas? ¿Hay alguna otra alternativa a which que puede responder fácil y consistentemente a la pregunta de si una pieza de software en particular está instalada?

(Si también quiere dar ideas específicamente relacionadas con el ejemplo que di, eso es genial, pero principalmente solo estoy preguntando sobre el caso general:cuál es la forma más confiable de averiguar si una cosa en particular está instalada en una máquina determinada ?)

Respuesta aceptada:

En el siglo XXI, especialmente si apunta a máquinas que probablemente tengan bash o zsh, puede contar con type estando disponible. (No existía en dispositivos extremadamente antiguos, como en la década de 1970 o principios de la de 1980). No puede contar con que su salida signifique algo, pero puede contar con que devolverá 0 si hay un comando con ese nombre y distinto de cero en caso contrario.

which no es estándar y no es confiable en la práctica. type es la alternativa recomendada. whereis sufre los mismos problemas que which y es menos común. whence es específico para ksh y zsh.

Cuando eso sea posible, sería más confiable probar la existencia de un comando y probar si su comportamiento parece razonable. Por ejemplo, pruebe la presencia de una versión adecuada de bash ejecutando bash -c 'somecommand' , por ejemplo

# Test for the `-v` operator (which appeared in bash 4.2)
if bash -c 'test -v HOME' 2>/dev/null; then …

Hoy en día, puede contar con casi todo en la versión 2 de la especificación Singe UNIX (excepto cosas exóticas como Fortran y SCCS, que son opcionales de todos modos). También puede contar con la mayor parte de la versión 3, pero aún no está completamente implementada en todas partes. El soporte de la versión 4 es más incompleto. Si va a leer estas especificaciones, le recomiendo leer la versión 3, que es mucho más legible y menos ambigua que la versión 2.

Relacionado:¿Cómo copiar el diseño de partición de un disco completo usando herramientas estándar?

Para ver ejemplos de cómo detectar las especificidades del sistema, consulte autoconf y configure scripts de varios programas.


Linux
  1. ¿Cómo detectar si el Shell está controlado desde Ssh?

  2. ¿Detectar si la tecla se presiona desde el script?

  3. ¿Qué sistema de archivos para respaldar es el mejor?

  4. Bash + ¿Cómo salir del script secundario y del script principal en ambas ocasiones?

  5. ¿La mejor manera de cancelar todos los trabajos de Slurm desde la salida del comando Shell?

¿La forma "adecuada" de probar si un servicio se está ejecutando en un script?

¿Cuál es la mejor manera de garantizar que solo se ejecute una instancia de un script Bash?

Ejecutar script bash desde URL

Cualquier forma de salir del script bash, pero sin salir de la terminal

¿Hay alguna forma de mostrar la notificación del script bash en Ubuntu?

¿Es posible recuperar el contenido de un script bash en ejecución desde la RAM?