如何检查 busybox 是否有命令?

如何检查 busybox 是否有命令?

就我而言,我想看看 busybox 是否内置有“md5sum”。

我目前正在这样做:

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

我无法找到任何信息来表明 busybox 中是否内置有任何东西可以查询哪些功能可以通过编程获得。

是的,我可以通过不带参数运行它来列出可用的应用程序,但是尝试 grep 输出容易出错,并且无法保证 grep 是否可用。

答案1

谢谢你的鼓励,Micah。这让我的创意源源不断。

更新:

在 Bash 3/4 上测试,所有内置函数均无依赖项:

可移植性:仅与 Bash 3 和 Bash 4 100% 兼容

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 上测试:

可移植性:可通过 sed/egrep 在所有 sh 上移植

_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
}

没有 bashisms,使用 grep -e 代替 egrep (更便携),在 Dash 上测试:

可移植性:可通过 sed/grep -e 在所有 sh 上移植

_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

(在 Debian 12 中使用 Busybox v1.35.0 进行测试。)

实现上述解决方案的 shell 函数:

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

用法:

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

无法保证是否grep可用

grep非常有用,如果没有它,那将是一件很奇怪的事情。为了以防万一,以下 shell 函数_busybox_has仅使用busybox --listPOSIX 的 和 功能sh(甚至不是[)来实现:

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

相关内容