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用户是可写的...所以,现在只需将它设置为可写的东西(如果你正在运行脚本,则将其导出).
好吧,有一个明显但令人不快的解决方案:不要使用 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)
你的例子也符合我的预期。
| 归档时间: |
|
| 查看次数: |
1960 次 |
| 最近记录: |