
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 # busybox
sin 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
grep
estará disponible
grep
Es tan útil que sería una peculiaridad no tenerlo. Por si acaso, la siguiente función de shell se implementa _busybox_has
utilizando solo busybox --list
las 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 )
}