技术解析

在安卓 recovery 里运行 shell 脚本失败,提示 sh 文件 not found
0
2021-07-06 04:11:10
idczone

安卓 recovery 模式下用 adb shell 连接,运行自定义的 he.sh 失败,提示 not found :

# ./he.sh
/sbin/sh: ./he.sh: not found

he.sh 文件内容( Unix LF ):
```bash

!/bin/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. 自己扔进去的二进制文件设置对应的权限后可以运行。


he.sh 文件内容里有V2EX 的 markdown 对转义符处理得不太理想?

发帖之前点下预览是好习惯……
发出来之后不对也可以马上去编辑,但是……你给自己回复一下,似乎就不能修改了吧

在其他网站编辑时代码内的V2EX 预览异常,去掉后预览正常,但发出来却成了这样子。编辑过一次,再次编辑失败才回复的。

哪来的 sh

!/system/bin/sh
echo "hello world!"

少了个
echo "hello world!"

因为是标题, shell 文件名简写了

有#,编辑格式时弄丢了。

!/bin/bash
改为!/system/bin/sh 看看


是你自己 MD 用得不对
/t/244476

在 data 目录吗?
我记得可以这样:
cat s.sh > /system/bin/sh

看样子像是./he.sh 没找到?写绝对路径试试?


才注意你其实已经指出是 sh 而不是 bash
谢谢~



已解决,见附言


原来可以在沙盒发帖,测试发现代码块之前需要有空行,语法不熟,哈哈,谢谢

bash 里面用 `$[expr]` 是老掉牙的语法,强烈不推荐使用。直接用 `$((expr))` 就是,还属于 POSIX 。
另外 expr 里面引用变量不需要用 $,直接像写 C 一样 $((a*b+c)) 就可以了。你甚至可以用 $((a+=2)) 这种赋值。

> 另外 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 静态检查工具,对于你这种新手会很有用。

数据地带为您的网站提供全球顶级IDC资源
在线咨询
专属客服