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