最近经常鼓捣 Android 的 shell 脚本, 希望能简化各种清理, 备份和恢复操作等等, 于是遇到了各种各样的蛋疼问题, 姑且留个文纪念一下…
shell 常用方式 (sh my_script.sh)
- PC 端 adb shell (用的 Android 自带 shell, 目前系统一般是软链接到 /system/bin/toybox, 很渣的一个 shell, 各种奇葩问题均来源于此)
- 手机端使用终端直接运行 (用的终端软件自带的 shell, 一般是内置的 busybox, 大多数情况下没什么问题)
- 手机端使用 Tasker > Script > Run Shell (默认用的 Android 自带 shell, 建议手动指定为别的, 比如 busybox)
懒人版建议:
- 装个 busybox
- Tasker 或者 adb 里面要用 shell 的时候, 手动指定 PATH, 比如
# busybox 默认装在 /system/xbin
PATH=/system/xbin sh myscript.sh
.
蛋疼问题列表 (仅针对 Android 自带的渣渣 shell):
-
#!/bin/sh
在 Android 上似乎无效? 反正我不管写啥都无用, Android 自身的 sh 为 /system/bin/sh
-
空行问题
本来照理说 sh 脚本可以加任意空行的, 但是在我这, 如果用 adb shell 或手机终端, 空行之后的语句就全部不执行了, 而用 Tasker 就可以 – –
-
su
更加无语的问题, 如果以 root 身份执行 sh 脚本, 而 sh 脚本里面又包含了 su 语句, 则之后的语句又无效了… 依旧, 只在 adb shell 和 手机终端中出现, Tasker 一切正常
-
权限
又一个非常想问候 Android 祖宗的问题, 设计者的脑门绝对被门夹过: SD 卡文件默认权限为 075 (文件所有者无任何权限)
总之, 如果从 SD 卡复制文件到系统目录, 权限还会保持 075 状态, 并且如果是连同文件夹复制的, 目标文件夹也会因此变为 075, 必须另行 chmod, 然后, 又引出了 chmod 的蛋疼问题
-
chmod -R
多个递归功能会死啊? 反正 Android 的 chmod 是不支持递归的, 要肿么搞呢? 你得蛋疼无比的用此方式:
find /path_to_chmod | while read f; do chmod 755 $f; done
或者更加蛋疼无比的放弃递归, 手动对每个文件 chmod…
-
ln
符号链接本来是个很帅气的东西, 到 Android 上又不帅了, 比如:
rm -r /tmp/* # rm failed for /tmp/*, No such file or directory
为啥呢, 因为 Android 上的 /tmp 被链接到 /data/tmp, 而非文件夹, 而 Android 的 rm 发现 tmp 是个符号链接文件就认为没有 /tmp 这个目录了, 于是你得这么干:
cd /tmp rm -r ./*
over
转载请注明来自: http://zsaber.com/blog/p/20
既然都来了, 有啥想法顺便留个言呗? (无奈小广告太多, 需审核, 见谅)
如果要在脚本中su执行命令,可以用su -c啊(类似于sudo的样子?)
#!/bin/sh是无效的,因为没有这个目录和文件,默认的解析器是在/system/bin/sh,如有必要,可手动安装busybox里的ash或者bash