
In meinem Fall möchte ich sehen, ob Busybox „md5sum“ integriert hat.
Ich mache derzeit Folgendes:
$ echo | busybox md5sum &>/dev/null && echo yes || echo no
Ich konnte keine Informationen darüber finden, ob in Busybox eine Funktion integriert ist, mit der man programmgesteuert abfragen kann, welche Funktionen verfügbar sind.
Ja, ich kann die verfügbaren Applets auflisten, indem ich es ohne Argumente ausführe, aber der Versuch, die Ausgabe zu greppen, wäre fehleranfällig und es gibt keine Garantie, ob grep verfügbar sein wird.
Antwort1
Danke für den Anstoß, Micah. Das hat meine Kreativität angeregt.
Aktualisiert:
Getestet auf Bash 3/4, alles integriert, keine Abhängigkeiten:
Portabilität: 100 % kompatibel nur mit Bash 3 und 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
}
Keine Bashismen, getestet auf Dash:
Portabilität: Portabel auf allen sh mit 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
}
Keine Bashismen, grep -e statt egrep (portabler), getestet auf Dash:
Portabilität: Portabel auf allen sh mit 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
}
Zu testen:
_busybox_has md5sum && echo yes || echo no
Antwort2
Wenn ich ohne Parameter eingebe, # busybox
erhalte ich eine Liste der möglichen konfigurierten Befehle.
Abhängig von Ihrer Umgebung könnten Sie diesen String dann analysieren. Grep wird erwähnt, aber da diese Option nicht vorhanden ist, würde ich es über die String-Analysetools meiner Umgebung angehen:
bash:
options=$('busybox');
if [[ $options == *command* ]]
then
echo "It's there!";
fi
Wenn Sie eine andere Sprache verwenden, gibt es normalerweise etwas Passendes.
Antwort3
busybox --list | busybox grep -qF md5sum && echo yes || echo no
(Getestet mit Busybox v1.35.0 in Debian 12.)
Eine Shell-Funktion, die die obige Lösung implementiert:
_busybox_has () { busybox --list | busybox grep -qxF "$1"; }
Verwendung:
_busybox_has md5sum && echo yes || echo no
_busybox_has kitchensink && echo yes || echo no
Es gibt keine Garantie für die
grep
Verfügbarkeit
grep
ist so nützlich, dass es eine Besonderheit wäre, es nicht zu haben. Nur für den Fall implementiert die folgende Shell-Funktion _busybox_has
nur busybox --list
und Funktionen des POSIX sh
(nicht einmal [
):
_busybox_has () {
busybox --list | ( while IFS= read -r line; do
case "$line" in
"$1") return 0
;;
esac
done
return 1 )
}