如何检查当前运行的 shell 是不是是 BusyBox

Posted

技术标签:

【中文标题】如何检查当前运行的 shell 是不是是 BusyBox【英文标题】:How to check if currently running shell is BusyBox如何检查当前运行的 shell 是否是 BusyBox 【发布时间】:2014-09-12 23:14:29 【问题描述】:

我尝试了不同的变体

echo $0
echo $shell
echo $SHELL
ps -p $$

但它们都不能提供独特的输出。我可以做这样的事情,但它是丑陋和骇人听闻的:

if ls --help 2>&1 | grep BusyBox; then
    echo "it is BusyBox"
else
    echo "it is NOT BusyBox"
fi

【问题讨论】:

我发现没有准确的方法可以做到这一点。你最好的运气是***.com/questions/3327013/…。和@Vality 的回答。问题:它只意味着在 Linux 系统中运行吗? 那我不得不放弃了,至少现在我知道没有更好的办法了。是的,我只在 Linux 上需要它,添加了适当的标签。 如果只适用于Linux,我可以提出另一个建议。 【参考方案1】:

另一种需要Linux和readlink的方式:

#!/bin/ash
exe=`exec 2>/dev/null; readlink "/proc/$$/exe"`
case "$exe" in
*/busybox)
    echo "It's a busybox shell."
    ;;
esac

【讨论】:

【参考方案2】:

我个人比较喜欢:

if ps ax -o pid,comm | grep `echo $$` | grep busybox ; then
    echo "it is BusyBox"
fi

这是一个公平的检查,以确保您正在运行busybox shell。

这是通过让 ps 生成一个 pid 与程序名称的列表,然后找到我们的 pid 并检查程序名称是否包含busybox。

【讨论】:

BusyBox 版本的 ps 似乎不支持参数。 @svlasov 奇怪,我的busybox似乎可以使用它,它只支持-o-T。 (我已经在我自己的运行 BusyBox v1.22.1 的系统上测试了该命令。)也许您需要更新?你的 BusyBox 很旧吗? 我有 v1.20.2 但我不确定是否可以安装更新的版本。 @svlasov 您可能会使用 /bin/ps 而不是 ps 来强制它不使用内置的。然后您可以进行错误检查,因此如果 ps 不存在,它将假定为busybox。但是,您使用的是什么发行版?许多提供最新的busybox。 这是 TI 的 Sitara 板。我的 /bin/ps 是 /bin/busybox 的符号链接。碰巧我可以运行完整的 bash 或 zsh,因此依赖文件检查是不准确的。【参考方案3】:

可能不完美,但这是我检查的方式:

test -h /bin/ls # busybox or other single binary system
test -h /bin/ls && test `readlink /bin/ls` = busybox # it is busybox

【讨论】:

以上是关于如何检查当前运行的 shell 是不是是 BusyBox的主要内容,如果未能解决你的问题,请参考以下文章

umount 提示 device is busy

linux shell出现【bad:interpreter:text file busy】

通过ansible模块的服务状态(不是通过“shell”或“c ommand”)

如何检查传递给 shell 脚本的参数是不是不是整数?

C++:如何检查外部程序是不是正在运行?

如何使用 shell 脚本检查 MySQL 数据库中是不是存在表?