5

我为 Android 制作的脚本有一个小问题。我无法让“EOF”在“mksh”中工作。它在 'sh' 和 'bash' 中运行良好,但由于 'mksh' 正在成为 Android 中最常用的,所以我真的需要它才能正常工作。

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

此示例将导致休闲错误

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

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

4

4 回答 4

10

问题来自于 /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 用户是可写的……所以,现在只需将其设置为对您可写的内容(如果您正在运行脚本,则将其导出)。

于 2013-03-14T18:23:42.930 回答
2

好吧,如果不愉快的话,有一个明显的解决方案:不要使用 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
$ 

您的示例也可以按我的预期工作。

于 2013-03-07T22:52:52.163 回答
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

于 2015-01-06T07:24:59.813 回答
0

从这篇文章

package=com.tayek.tablet.gui.android.cb7
cat <<EOF | adb -s 0a9196e8 shell
run-as $package
ls -l /data/data/$package
exit
exit
EOF
于 2016-05-29T22:43:19.963 回答