¿Cómo comprobar si Busybox tiene un comando?

¿Cómo comprobar si Busybox tiene un comando?

En mi caso, quiero ver si Busybox tiene incorporado "md5sum".

Actualmente estoy haciendo esto:

$ echo | busybox md5sum &>/dev/null && echo yes || echo no

No he podido encontrar ninguna información sobre si hay algo integrado en Busybox para consultar qué funciones están disponibles mediante programación.

Sí, puedo enumerar los subprogramas disponibles ejecutándolos sin argumentos, pero intentar grep la salida sería propenso a errores y no hay garantía de si grep estará disponible.

Respuesta1

Gracias por el empujón, Micah. Hizo fluir mi creatividad.

Actualizado:

Probado en Bash 3/4, todas las funciones integradas, sin dependencias:

Portabilidad: 100% compatible solo con Bash 3 y Bash 4

function _busybox_has() {
   builtin command -v busybox >/dev/null ||
      return 1
   
   # Sanitize searches for '[' and '[['
   a=$1
   a=${a//[/\\[}
   
   [[ $(busybox) =~ [[:space:]]($a)([,]|$) ]] ||
     return 1
}

Sin bashismos, probado en Dash:

Portabilidad: Portátil en todos los sh con sed/egrep

_busybox_has() {
   busybox >/dev/null 2>&1 ||
      return 1
   
   # Sanitize searches for '[' and '[['
   a=$(echo "$1" | sed 's/[[]/\\[/g')
   
   busybox | egrep -oq "[[:space:]]($a)([,]|$)" ||
      return 1
}

Sin bashismos, grep -e en lugar de egrep (más portátil), probado en Dash:

Portabilidad: portátil en todos los sh con sed/grep -e

_busybox_has() {
   busybox >/dev/null 2>&1 ||
      return 1
   
   # Sanitize searches for '[' and '[['
   a=$(echo "$1" | sed 's/[[]/\\[/g')
   
   busybox | grep -oqe "[[:space:]]\($a\)\([,]\|\$\)" ||
      return 1
}

Probar:

_busybox_has md5sum && echo yes || echo no

Respuesta2

Si escribo # busyboxsin parámetros, obtengo una lista de comandos configurados que son posibles.

Dependiendo de su entorno, podría analizar esta cadena. Se menciona Grep, pero al carecer de esa opción, lo abordaría a través de las herramientas de análisis de cadenas de mi entorno:

intento:

options=$('busybox');

if [[ $options == *command* ]]
then
  echo "It's there!";
fi

Si estás usando otro idioma, normalmente hay algo apropiado.

Respuesta3

busybox --list | busybox grep -qF md5sum && echo yes || echo no

(Probado con Busybox v1.35.0 en Debian 12.)

Una función de shell que implementa la solución anterior:

_busybox_has () { busybox --list | busybox grep -qxF "$1"; }

Uso:

_busybox_has md5sum && echo yes || echo no
_busybox_has kitchensink && echo yes || echo no

no hay garantía de si grepestará disponible

grepEs tan útil que sería una peculiaridad no tenerlo. Por si acaso, la siguiente función de shell se implementa _busybox_hasutilizando solo busybox --listlas características y de POSIX sh(ni siquiera [):

_busybox_has () {
busybox --list | ( while IFS= read -r line; do
   case "$line" in
      "$1") return 0
         ;;
   esac
done
return 1 )
}

información relacionada