【发布时间】: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