我为 Android 制作的脚本有一个小问题。我无法让“EOF”在“mksh”中工作。它在 'sh' 和 'bash' 中运行良好,但由于 'mksh' 正在成为 Android 中最常用的,所以我真的需要它才能正常工作。
cat <<EOF
... lines here ...
EOF
此示例将导致休闲错误
无法创建临时文件/sqlite_stmt_journals/mksh。(随机):没有这样的文件或目录
我见过其他人有这个问题,但没有真正的解决方案。
问题来自于 /sqlite_stmt_journals曾经存在并且是一个世界可写的粘性目录,就像 /tmp 在普通的 Unix boxen 中一样,所以当我将 mksh 添加到 Android 时,我将它用作标准 TMPDIR。
最近的 Android 安全策略完全禁止全局可写目录。
我们(Android 团队和我)意识到了这个问题,但还没有提出好的解决方案;需要先创建“用户”主目录,然后才能(自动)使用它们,但一位 Google 员工告诉我他们有一些东西在队列中。
在此之前,请将 TMPDIR 设置为您的用户可写的内容。
这是 Android 环境的问题,而不是 mksh 本身的问题。
@Julian Fondren:您的 Android 设备可能来自该目录仍然存在的时候。
在 AOSP git master 中,默认的 TMPDIR 是 /data/local,它至少对 root 用户是可写的……所以,现在只需将其设置为对您可写的内容(如果您正在运行脚本,则将其导出)。
好吧,如果不愉快的话,有一个明显的解决方案:不要使用 HERE 文档;只需将每一行回显到一个临时文件。所以你的例子变成:
echo ... first line ... > $tmpfile
echo ... subsequent lines ... >> $tmpfile
cat $tmpfile
rm $tmpfile
编辑:等等,什么?当然看起来 HERE 文档对我来说在 mksh 上工作得很好。在库存 Kindle Fire HD 上使用 mksh R39 会发生以下情况(不要介意 perl):
$ perl <<FOO
print "hi\n"
FOO
hi
$
您的示例也可以按我的预期工作。
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
从这篇文章:
package=com.tayek.tablet.gui.android.cb7
cat <<EOF | adb -s 0a9196e8 shell
run-as $package
ls -l /data/data/$package
exit
exit
EOF