Bien, estoy un poco perplejo aquí.
Estoy inmerso en una inmersión profunda en BASH, con el fin de escribir algunos scripts de automatización para mi empleador. Además, divulgación completa aquí: soy un chico de la web; Hasta ahora he conocido SÓLO la CLI suficiente para operar git.
Mi problema es,aproximadamente la mitad del personal usa MacOS, la otra mitad usa GitBash, y parece que se admiten diferentes banderas (o, más relevantemente,nocompatible) en las dos instancias BASH diferentes. Otro enigma: con todos trabajando desde casa y el fin del mundo y todo eso, no puedo exigir de manera confiable a cada miembro de nuestro personal "cambiar a la distribución X"/"actualizar a la versión Y".
Ahora sé cómo comprobar si un programa determinado está instalado (aunque lo confieso: no tengo muy claro por qué uno es preferible al otro, y por favor: corríjanme si alguna de ellas es una forma terrible de manejar esto). en formas de:
type foo >/dev/null 2>&1 || { echo >&2 "COMMAND NOT FOUND"; }
...y...
[ -x "$(command -v foo)" ] || echo 'COMMAND NOT FOUND'
...pero en mi caso específico, AMBAS plataformas TIENEN foo
instaladas, pero, por ejemplo, solo MacOS tiene un indicador modificador -b
/ .--bar
Entonces, ¿cómo pruebo si se admite una CARACTERÍSTICA determinada de un comando?Cada vez que intento pasar una bandera a una de las pruebas, el programa que REALIZA la prueba parece creer que está dirigida a TI, la ignora por completo o comete un error.
¿Cómo puedo probar para ver si foo -b
/ foo --bar
es un comando válido/instalado/accesible?
Actualización/Respuesta
Dado que el consenso general presentado en las respuestas bien razonadas y honestamente excelentes que se reciben a continuación parece ser un híbrido de "no, no se puede", puntuado con "simplemente hay demasiados factores para poder extraer de manera confiable algo parecido a datos concluyentes y útiles". , Estoy cerrando la pregunta.
Mi intención aquí era determinar cuál era el enfoque correcto a emplear para verificar la presencia de una bandera potencialmente inexistente entre dos plataformas diferentes:conocidoplataformas, afortunadamente, en mi caso - y el tacto apropiado en este caso parecería ser el que estoy tomando actualmente:mantener dos scripts separados, uno para cada plataforma.
¡Gracias a todos los que se tomaron el tiempo de responder! Es muy apreciado.
Respuesta1
De una manera útil y confiable, probablemente no puedas. Básicamente necesitas probar cada comando individualmente para ver qué hace. (El comando "echo" es un caso particularmente malo de esto. Hay muchas variaciones).
Lo que puedes hacer es comprobar los números de versión y el sistema operativo.
Para BASH, intente
bash --version | head -1
o
bash_version="$( bash --version | head -1|sed -e 's/.* version //;s/ .*//' )"
o simplemente use el símbolo predefinido$BASH_VERSION
Para el sistema operativo, uname -s
es un buen comienzo y otras opciones pueden brindarle más detalles.
Una vez que los tenga, puede comenzar a escribir código condicional según sea necesario.
Habiendo dicho todo eso... para su caso específico de un foo
comando que puede o no tener una --bar
opción: averigüe qué hacen las dos versiones con líneas de comando coincidentes que de otro modo serían seguras de ejecutar. Por ejemplo, si ambas versiones foo
informan que la primera opción no es válida, intente escribir algo como:
output="$( foo --bar --somethingtotallyinvalid 2>&1 )"
y luego descubrir qué hay en la salida variable. Por supuesto, en este caso, es probable que sea la lista de opciones válida. Si es así, podrías considerar:
output="$( foo --somethingtotallyinvalid 2>&1 | grep -e --bar )"