安卓 recovery 模式下用 adb shell 连接,运行自定义的 he.sh 失败,提示 not found :
# ./he.sh
/sbin/sh: ./he.sh: not found
he.sh 文件内容( Unix LF ):
```bash
echo "hello world!"
```
权限设置:
# ls -l *.sh
-rwxr-xr-x 1 root shell 32 Dec 18 06:04 he.sh
-rwxr-xr-x 1 root shell 1918 Aug 1 2008 wifi-cal.sh
wifi-cal.sh 是自带的,可以运行; he.sh 自己丢过去的,提示 not found 。
请问这是哪里出了问题?如何解决?
P.S. 自己扔进去的二进制文件设置对应的权限后可以运行。
找到问题根源了:这机子里处理 shell 的是 /system/bin/sh ,不是 bash - -!
难怪在 Linux 里运行好好的脚本扔进机子里就不行。一直以为 shell 脚本第一行只是声明这个是 shell 文件而已……
修正后:
#! /system/bin/sh
echo "hello world!"
# ./h4.sh
hello world!
谢谢各位。
#! /system/xbin/bash
a=8
b=32
c=4096
fs="/dev/block/mmcblk0p2"
echo "#COMMAND: mke2fs -L data-sd -t ext4 -b $c -E stride=$[$a*1024/$c],stripe-width=$[$b*1024*1024/$c],discard -O dir_index,^has_journal -F $fs"
2
yeyeye 2015-12-18 14:47:54 +08:00
发帖之前点下预览是好习惯……
发出来之后不对也可以马上去编辑,但是……你给自己回复一下,似乎就不能修改了吧 |
3
zztemp OP @yeyeye 在其他网站编辑时代码内的#要转义符, V2EX 预览异常,去掉后预览正常,但发出来却成了这样子。编辑过一次,再次编辑失败才回复的。
|
4
ttyant 2015-12-18 15:02:18 +08:00
哪来的 sh
|
5
des 2015-12-18 15:05:53 +08:00
!/system/bin/sh
echo "hello world!" |
6
des 2015-12-18 15:06:29 +08:00 1
少了个 #
#!/system/bin/sh echo "hello world!" |
9
402124773 2015-12-18 15:13:34 +08:00
!/bin/bash
改为!/system/bin/sh 看看 |
13
zztemp OP |
14
Arthur2e5 2015-12-19 15:32:24 +08:00 1
bash 里面用 `$[expr]` 是老掉牙的语法,强烈不推荐使用。直接用 `$((expr))` 就是,还属于 POSIX 。
另外 expr 里面引用变量不需要用 $,直接像写 C 一样 $((a*b+c)) 就可以了。你甚至可以用 $((a+=2)) 这种赋值。 |
15
Arthur2e5 2015-12-19 15:37:19 +08:00 1
> 另外 expr
我是说上述的 expr 代表的表达式。 > 你甚至可以用 $((a+=2)) 这种赋值。 顺便补一句好了,配上空命令 `:`(或者 `true` 也可以啦)可以抛弃执行结果,于是就有了这样的语句:`: $((a+=2)) $((b=a*a))`。 * * * shell 里面 sh 和 bash 的区别你自己说了一些,但是不全对。你可以看看: https://stackoverflow.com/questions/5725296/difference-between-sh-and-bash http://mywiki.wooledge.org/Bashism https://github.com/koalaman/shellcheck/wiki/SC2039 其中最后一个的 shellcheck.net 本身是一个在线(也提供离线版)的 shell 静态检查工具,对于你这种新手会很有用。 |