Android Shell EOF

时间:2013-03-07 22:41:16

标签: android linux shell mksh

我为Android制作的脚本存在一个小问题。我无法接缝让'EOF'在'mksh'中工作。它在'sh'和'bash'中工作得很好,但是因为'mksh'是Android中最常用的,所以我真的需要它才能工作。

cat <<EOF
  ... lines here ...
EOF

此示例将导致延迟错误

  

无法创建临时文件/sqlite_stmt_journals/mksh.(random):没有这样的文件或目录

我见过其他人这个问题,但没有真正的解决方案。

4 个答案:

答案 0 :(得分:10)

问题来自/ sqlite_stmt_journals 用于存在并且是一个世界可写的粘性目录,就像/ tmp在普通的Unix boxen中一样,所以当我添加mksh时我用它作为标准的TMPDIR机器人。

最近的Android安全策略完全禁止全球可写目录。

我们(Android团队和我)已经意识到了这个问题,但尚未提出好的解决方案; “用户”主目录需要在(自动)使用之前创建,但Google员工告诉我他们在队列中有一些东西。

在此之前,将TMPDIR设置为可供用户写入的内容。

这是Android环境的问题,而不是mksh本身。

@Julian Fondren:您的Android设备可能来自该目录仍然存在。

在AOSP git master中,默认的TMPDIR是/ data / local,至少对root用户来说是可写的...所以,现在只需将它设置为可写的东西(如果你正在运行脚本,则将其导出)。

答案 1 :(得分:2)

嗯,这是一个明显的令人不快的解决方案:不要使用HERE文档;只需将每一行回显到一个临时文件。所以你的例子就变成了:

echo ... first line ... > $tmpfile
echo ... subsequent lines ... >> $tmpfile
cat $tmpfile
rm $tmpfile
编辑:等等,什么?当然看起来HERE文档在mksh上工作得很好。 mksh R39在Kindle Fire HD股票上发生以下情况(不介意perl):

$ perl <<FOO
print "hi\n"
FOO
hi
$ 

你的例子也像我期望的那样有效。

答案 2 :(得分:1)

1)如果您拥有root权限:

当你打开android shell时,如果你拥有该设备的root权限,那么以root用户身份运行adb。

adb root

而不仅仅是

adb shell

这将解决您的问题。

2)如果您可以在Android设备中修改sh二进制文件然后进行修改,以便它将找到路径

/data/local/tmp/

/data/local/atvc/  // In Motorola’s android device.

上面的目录具有shell用户的读/写/执行权限。

3)安装Busybox并以 Busybox cat <<EOF

运行

答案 3 :(得分:0)

来自post

package=com.tayek.tablet.gui.android.cb7
cat <<EOF | adb -s 0a9196e8 shell
run-as $package
ls -l /data/data/$package
exit
exit
EOF