就我而言,我想看看 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 --list
POSIX 的 和 功能sh
(甚至不是[
)来实现:
_busybox_has () {
busybox --list | ( while IFS= read -r line; do
case "$line" in
"$1") return 0
;;
esac
done
return 1 )
}