在安卓 recovery 里运行 shell 脚本失败,提示 sh 文件 not found - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
zztemp
V2EX    Linux

在安卓 recovery 里运行 shell 脚本失败,提示 sh 文件 not found

  •  
  •   zztemp 2015-12-18 14:24:53 +08:00 5815 次点击
    这是一个创建于 3653 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    第 1 条附言    2015-12-18 15:10:15 +08:00
    文件内容有#的,编辑格式出了问题:
    #! /bin/bash
    echo "hello world!"

    改为
    #! /system/bin/bash
    echo "hello world!"

    也不行。
    第 2 条附言    2015-12-18 21:45:53 +08:00

    找到问题根源了:这机子里处理 shell 的是 /system/bin/sh ,不是 bash - -!
    难怪在 Linux 里运行好好的脚本扔进机子里就不行。一直以为 shell 脚本第一行只是声明这个是 shell 文件而已……

    修正后:

    #! /system/bin/sh echo "hello world!" 
    # ./h4.sh hello world! 

    谢谢各位。

    第 3 条附言    2015-12-19 01:09:19 +08:00

    补充, sh 与 bash 是不同的两个环境, sh 较 bash 更为简陋。例如 sh 不支持${{$var1}+1}和变量引用{$var1},只能用$(($var1+1))。最终我找到 bash 所在的位置并导向了 bash 。

    #! /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" 
    15 条回复    2015-12-19 15:37:19 +08:00
    zztemp
        1
    zztemp  
    OP
       2015-12-18 14:44:38 +08:00
    he.sh 文件内容里有#的。 V2EX 的 markdown 对转义符处理得不太理想?
    yeyeye
        2
    yeyeye  
       2015-12-18 14:47:54 +08:00
    发帖之前点下预览是好习惯……

    发出来之后不对也可以马上去编辑,但是……你给自己回复一下,似乎就不能修改了吧
    zztemp
        3
    zztemp  
    OP
       2015-12-18 14:57:12 +08:00
    @yeyeye 在其他网站编辑时代码内的#要转义符, V2EX 预览异常,去掉后预览正常,但发出来却成了这样子。编辑过一次,再次编辑失败才回复的。
    ttyant
        4
    ttyant &bsp;
       2015-12-18 15:02:18 +08:00
    哪来的 sh
    des
        5
    des  
       2015-12-18 15:05:53 +08:00
    !/system/bin/sh
    echo "hello world!"
    des
        6
    des  
       2015-12-18 15:06:29 +08:00   1
    少了个 #

    #!/system/bin/sh
    echo "hello world!"
    zztemp
        7
    zztemp  
    OP
       2015-12-18 15:11:19 +08:00
    @ttyant 因为是标题, shell 文件名简写了
    zztemp
        8
    zztemp  
    OP
       2015-12-18 15:12:00 +08:00
    @des 有#,编辑格式时弄丢了。
    402124773
        9
    402124773  
       2015-12-18 15:13:34 +08:00
    !/bin/bash
    改为!/system/bin/sh 看看
    ynyounuo
        10
    ynyounuo  
       2015-12-18 15:29:40 +08:00   1
    @zztemp
    是你自己 MD 用得不对
    /t/244476
    ilotuo
        11
    ilotuo  
       2015-12-18 15:34:05 +08:00
    在 data 目录吗?
    我记得可以这样:
    cat s.sh > /system/bin/sh
    chzyer
        12
    chzyer  
       2015-12-18 16:11:23 +08:00
    看样子像是./he.sh 没找到?写绝对路径试试?
    zztemp
        13
    zztemp  
    OP
       2015-12-18 21:49:45 +08:00
    @des
    才注意你其实已经指出是 sh 而不是 bash
    谢谢~

    @402124773
    @ilotuo
    @chzyer
    已解决,见附言


    @ynyounuo
    原来可以在沙盒发帖,测试发现代码块之前需要有空行,语法不熟,哈哈,谢谢
    Arthur2e5
        14
    Arthur2e5  
       2015-12-19 15:32:24 +08:00   1
    bash 里面用 `$[expr]` 是老掉牙的语法,强烈不推荐使用。直接用 `$((expr))` 就是,还属于 POSIX 。

    另外 expr 里面引用变量不需要用 $,直接像写 C 一样 $((a*b+c)) 就可以了。你甚至可以用 $((a+=2)) 这种赋值。
    Arthur2e5
        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 静态检查工具,对于你这种新手会很有用。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5173 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 09:10 PVG 1:10 LAX 01:10 JFK 04:10
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86