Как проверить, есть ли у busybox команда?

Как проверить, есть ли у busybox команда?

В моем случае я хочу проверить, есть ли в busybox встроенная функция «md5sum».

Я сейчас делаю это:

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

Мне не удалось найти никакой информации о том, есть ли в busybox что-либо встроенное для программного запроса доступных функций.

Да, я могу составить список доступных апплетов, запустив его без аргументов, но попытка выполнить grep вывода приведет к ошибкам, и нет никакой гарантии, что grep будет доступен.

решение1

Спасибо за толчок, Мика. Это дало толчок моему творческому вдохновению.

Обновлено:

Протестировано на Bash 3/4, все встроенные функции, без зависимостей:

Переносимость: 100% совместимость только с Bash 3 и 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
}

Башизмов нет, протестировано на Dash:

Переносимость: Переносимо на все sh с 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
}

Никаких башизмов, grep -e вместо egrep (более переносимо), протестировано на Dash:

Переносимость: Переносимо на все sh с 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
}

Тестировать:

_busybox_has md5sum && echo yes || echo no

решение2

Если я ввожу команду # busyboxбез параметров, я получаю список возможных настроенных команд.

В зависимости от вашей среды вы можете затем разобрать эту строку. Grep упоминается, но за неимением этой возможности я бы подошел к ней через инструменты разбора строк моей среды:

Баш:

options=$('busybox');

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

если вы используете другой язык, обычно есть что-то подходящее.

решение3

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

(Протестировано с Busybox v1.35.0 в Debian 12.)

Функция оболочки, реализующая указанное выше решение:

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

Использование:

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

нет гарантии, grepбудет ли доступно

grepнастолько полезен, что было бы странно его не иметь. На всякий случай, следующая функция оболочки реализует _busybox_hasиспользование только busybox --listи возможностей POSIX sh(даже не [):

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

Связанный контент