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

9

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

En el pasado, he escrito funciones que analizan la salida whichy manejan los diferentes casos de uso con los que me he encontrado. Funcionan en 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, supongamos que tengo que detectar desde 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 es y bash es suficiente versión para no tener un error particular. La mayor parte del resto del script podría ser Bourne shell o Ruby o cualquier otra cosa, pero esto debe hacerse (AFAIK) con zsh o una versión reciente de bash.

¿Puedo contar con typeestar disponible en todas las plataformas? ¿Hay alguna otra alternativa a la whichque pueda responder fácil y consistentemente la pregunta de si está instalado un software en particular?

(Si también desea 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? ?)

iconoclasta
fuente

Respuestas:

10

En el siglo XXI, especialmente si está apuntando a máquinas que probablemente tengan bash o zsh, puede contar con typeestar disponible. (No existía en unidades extremadamente antiguas, como en la década de 1970 o principios de 1980). No puede contar con que su salida signifique nada, pero puede contar con que devuelva 0 si hay un comando con ese nombre y distinto de cero

whichno es estándar y no es confiable en la práctica . typeEs la alternativa recomendada. whereissufre los mismos problemas whichy es menos común. whencees específico de 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', p. Ej.

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

Hoy puede contar con casi todo en la versión 2 de la especificación Singe UNIX (a excepción de cosas exóticas como Fortran y SCCS, que de todos modos son opcionales). También puede contar con la mayoría de la versión 3 , pero esto aún no está completamente implementado 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.

Para obtener ejemplos sobre cómo detectar las especificidades del sistema, consulte autoconf y configurescripts de varios programas.

Consulte también Recursos para la programación de shell portátil para obtener más consejos.

Gilles 'SO- deja de ser malvado'
fuente
Esto podría beneficiarse de una expansión para comentar sobre las técnicas comúnmente recomendadas usando hashy command -v.
Caleb
@Caleb Para el propósito de esta pregunta, no veo un beneficio de command -vmás type, todo lo que necesitamos es un resultado booleano. ¿A qué "técnicas comúnmente recomendadas usando hash" se refiere?
Gilles 'SO- deja de ser malvado'