Como verificar se o busybox possui um comando?

Como verificar se o busybox possui um comando?

No meu caso, quero ver se o busybox possui "md5sum" integrado.

Atualmente estou fazendo isso:

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

Não consegui encontrar nenhuma informação sobre se há algo embutido no busybox para consultar quais recursos estão disponíveis programaticamente.

Sim, posso listar os miniaplicativos disponíveis executando-os sem argumentos, mas tentar executar o grep na saída seria propenso a erros e não há garantia se o grep estará disponível.

Responder1

Obrigado pelo empurrão, Micah. Isso fez minha criatividade fluir.

Atualizada:

Testado no Bash 3/4, todos integrados, sem dependências:

Portabilidade: 100% compatível apenas com Bash 3 e 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
}

Sem bashismos, testado no Dash:

Portabilidade: Portátil em todos os sh com 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
}

Sem bashismos, grep -e em vez de egrep (mais portátil), testado no Dash:

Portabilidade: Portátil em todos os sh com 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
}

Testar:

_busybox_has md5sum && echo yes || echo no

Responder2

Se eu digitar # busyboxsem parâmetros, recebo uma lista de comandos configurados possíveis.

Dependendo do seu ambiente, você poderá analisar essa string. Grep é mencionado, mas na falta dessa opção, eu o abordaria por meio das ferramentas de análise de strings do meu ambiente:

festa:

options=$('busybox');

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

se você estiver usando outro idioma, geralmente há algo apropriado.

Responder3

busybox --list | busybox grep -qF md5sum && echo yes || echo no

(Testado com Busybox v1.35.0 no Debian 12.)

Uma função shell que implementa a solução acima:

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

Uso:

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

não há garantia se grepestará disponível

grepé tão útil que seria uma peculiaridade não tê-lo. Por precaução, a seguinte função shell implementa _busybox_haso uso de just busybox --liste recursos do POSIX sh(nem par [):

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

informação relacionada