Android shell 默认使用 busybox 命令

问题描述 投票:0回答:2

我正在 android 上运行一个脚本,并努力使其尽可能可移植,所有命令都使用 busybox。我目前是如何设置它的,每个命令都有一个名称相同的函数,所以它将这些命令转换为使用 busybox,就像这样:

echo () {
busybox echo $1 $2 $3 $4 $5
}
echo "hai"

由于必须为每个命令完成此操作,因此它在脚本中占用了大量空间。这就是为什么我试图找出一种方法来强制 shell 默认使用 busybox 而不是 /system/bin 或 /system/xbin。 这可以通过修改 PATH 变量来实现吗?或者我可以使用 shell 中内置的环境变量吗?

或者我应该这样做吗?:

bs () {
busybox $@
}

bs echo "Some text"

(我想尽可能避免这种情况,因为它会降低可读性)

编辑

我可以启动一个循环的后台进程,当它检测到一个命令被传递给 shell 进程时,它会停止这个并将它传递给 busybox 吗?在 shell 处理它之前以某种方式从 stdin 读取?

编辑2

所以我想像这样将命令重定向到 busybox:

busybox <<EOF
echo "hai";
EOF

这能以某种方式使用吗?

更新

我已经开始使用 busyboxes ash shell,它可以做我想做的一切。显然,在将命令传递给 shell 之前,无法拦截命令。

android bash shell stdin busybox
2个回答
1
投票

使用shell内置的‘别名’(Alias Substitution, Shell Command Language, IEEE Standard 1003.1 (2013) )方法。 例如:

alias vi="busybox vi"
vi readme.txt

将用“busybox vi”替换单词“vi”,然后 shell 将处理

busybox vi readme.txt

因为它是一个简单的替换,所以所有参数都被保留并传递给被替换的命令。

您还可以像这样将默认参数添加到替换中:

alias fbset="busybox fbset -fb /dev/graphics/fb0"

之后不再需要指定帧缓冲区 - 它已为您添加。通常程序会将最后指定的参数作为活动参数,因此如果您确实需要指定另一个帧缓冲区(在上面的示例中),它将忽略别名中提供的那个。


0
投票

只需运行 busybox 中包含的 sh 的所有命令 它被配置为调用所有 busybox 实用程序,如 sed、awk、sort、wc 等。

所以你只需调用:

$busybox sh

所有子命令都是busybox版本

这里是 busybox help of running without arguments 的参考

此构建中的外壳 被配置为在没有 $PATH 搜索的情况下运行内置实用程序。 您不需要为每个实用程序安装到 busybox 的链接。 要运行外部程序,请使用完整路径(/sbin/ip 而不是 ip)。

© www.soinside.com 2019 - 2024. All rights reserved.