Wie überprüfe ich, ob die Busybox einen Befehl hat?

Wie überprüfe ich, ob die Busybox einen Befehl hat?

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, # busyboxerhalte 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 grepVerfügbarkeit

grepist so nützlich, dass es eine Besonderheit wäre, es nicht zu haben. Nur für den Fall implementiert die folgende Shell-Funktion _busybox_hasnur busybox --listund 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 )
}

verwandte Informationen