【问题标题】:Android shell using busybox commands as defaultAndroid shell 默认使用busybox命令
【发布时间】:2015-11-08 15:02:03
【问题描述】:

我在 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 处理之前以某种方式从标准输入读取?

编辑 2

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

busybox <<EOF
echo "hai";
EOF

这个可以用吗?

更新

我已经开始使用busyboxes ash shell,它可以完成我想做的所有事情。显然,在命令被传递到 shell 之前无法拦截它们。

【问题讨论】:

  • 您能否利用一个名为echo 的指向busybox 的符号链接,如果执行,将执行busybox echo?将所有此类链接放在一个已知目录中,然后将该目录放在PATH 的前面。
  • 我宁愿避免创建新的符号链接,因为空间是有限的资源。我读到了busyboxes 自己的sh 小程序。好像是灰烬?该外壳会通过外部命令自动调用busybox吗?还是我应该开始编写自己的 shell 环境? :P
  • 我认为这是正确的。我对busybox不是很熟悉。我以为它只是一套工具的名称,而不是命令本身。
  • @BonBon 我认为busybox ash 实际上会将您放入一个外壳,该外壳将尽可能调用busybox 函数,如果不是,则退回到PATH 上的二进制文件。你甚至可以写你的脚本,第一行是#!/bin/busybox ash。运行时,整个脚本将被busybox解释。
  • 另一个进程无法“拦截”通过标准输入传递给外壳(或任何程序)的命令——这将是严重的安全违规。你唯一能做的就是做一个包装器,它解释给定的命令并决定如何运行它们——但你已经在你的问题中考虑了这一点。

标签: android bash shell stdin busybox


【解决方案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"

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

【讨论】:

  • 感谢您的回答,我终于可以将此问题标记为已回答。最后,我实际上制作了 bash 和 busybox 的自定义构建,并将它们添加到我的安装中。现在一切都使用一个或另一个运行,问题就解决了。
猜你喜欢
  • 1970-01-01
  • 2012-01-10
  • 2017-11-27
  • 1970-01-01
  • 2017-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-02
相关资源
最近更新 更多