busybox にコマンドがあるかどうかを確認するにはどうすればよいですか?

busybox にコマンドがあるかどうかを確認するにはどうすればよいですか?

私の場合、busybox に「md5sum」が組み込まれているかどうかを確認したいと思います。

現在、私はこれを行っています:

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

プログラムで利用可能な機能を照会するための機能が busybox に組み込まれているかどうかについては、情報を見つけることができませんでした。

はい、引数なしで実行することで利用可能なアプレットを一覧表示できますが、出力を grep しようとするとエラーが発生しやすくなり、grep が利用可能かどうかは保証されません。

答え1

後押ししてくれてありがとう、ミカ。おかげで創造力が湧いてきました。

更新しました:

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
}

バシズムなし、egrep の代わりに grep -e (より移植性が高い)、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 でテスト済み。)

上記のソリューションを実装するシェル関数:

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

使用法:

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

grep利用可能かどうかは保証されません

grepは非常に便利なので、これがないと不便です。念のため、次のシェル関数はPOSIX の と の機能_busybox_hasだけを使用して実装しています( も使用していません)。busybox --listsh[

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

関連情報