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


0

В моем случае я хочу посмотреть, есть ли в 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:

Портативность: переносная на все ш с сед / эгреп

_busybox_has() {
   busybox 2>/dev/null >/dev/null ||
      return 1

   # Sanitize searches for '[' and '[['
   a=$(echo $1 | sed 's/[[]/\\[/g')

   busybox | egrep -oq "[[:space:]]($a)([,]|$)" ||
      return 1
}

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

Портативность: Портативная на всех ш с sed / grep -e

_busybox_has() {
   busybox 2>/dev/null >/dev/null ||
      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

0

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

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

Баш:

options=$('busybox');

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

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


Да, я знаю об этом. Смотрите последний абзац моего вопроса.
Zhro

Справедливо. Вы можете разделить по пробелам, в зависимости от вашей среды, и тщательно проверить возвращаемый список - вы пишете сценарий оболочки?
Micah

Это правда. Но мой текущий обходной путь уже тонкий, и все встроено в bash (эхо). Я не думаю, что в этом случае будет лучше зацикливание выходной строки без аргументов.
Zhro

Обновлено с более подходящим примером bash.
Micah

*command* не будет лучшим решением. Для сопоставления мне понадобится регулярное выражение, которое будет работать, я полагаю. Может быть, поместив его в функцию вроде: _busybox_builtin (), которая возвращает 0/1. .. На самом деле, мне нравится твоя идея все больше и больше сейчас, когда я обдумываю ее. Я думал, что мне понадобится регулярное выражение, но мне нужно только сопоставить ',' и ''.
Zhro
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.