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
}

bashism 없음, 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 없음, 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_hasjust 및 기능을 사용하여 구현합니다 ( 는 아님 ).busybox --listsh[

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

관련 정보