Android 那蛋疼的 shell

By | 2015-05-01

最近经常鼓捣 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

既然都来了, 有啥想法顺便留个言呗? (无奈小广告太多, 需审核, 见谅)

2 thoughts on “Android 那蛋疼的 shell

  1. 永远的萌新

    如果要在脚本中su执行命令,可以用su -c啊(类似于sudo的样子?)

    Reply
  2. 永远的萌新

    #!/bin/sh是无效的,因为没有这个目录和文件,默认的解析器是在/system/bin/sh,如有必要,可手动安装busybox里的ash或者bash

    Reply

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注