Android Shell EOF

Dan*_*l B 5 linux shell android mksh

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

cat <<EOF
  ... lines here ...
EOF
Run Code Online (Sandbox Code Playgroud)

此示例将导致延迟错误

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

我已经看到其他人有这个问题,但没有真正的解决方案.

mir*_*los 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用户是可写的...所以,现在只需将它设置为可写的东西(如果你正在运行脚本,则将其导出).


Jul*_*ren 2

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

echo ... first line ... > $tmpfile
echo ... subsequent lines ... >> $tmpfile
cat $tmpfile
rm $tmpfile
Run Code Online (Sandbox Code Playgroud)

编辑:等等,什么?当然,对我来说,HERE 文档在 mksh 上工作得很好。在库存 Kindle Fire HD 上使用 mksh R39 时会发生以下情况(不要介意 perl):

$ perl <<FOO
print "hi\n"
FOO
hi
$ 
Run Code Online (Sandbox Code Playgroud)

你的例子也符合我的预期。