我为Android制作的脚本存在一个小问题。我无法接缝让'EOF'在'mksh'中工作。它在'sh'和'bash'中工作得很好,但是因为'mksh'是Android中最常用的,所以我真的需要它才能工作。
cat <<EOF
... lines here ...
EOF
此示例将导致延迟错误
无法创建临时文件/sqlite_stmt_journals/mksh.(random):没有这样的文件或目录
我见过其他人这个问题,但没有真正的解决方案。
答案 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