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 · 5306 次点击
    这是一个创建于 3264 天前的主题,其中的信息可能已经有所发展或是发生改变。

    安卓 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  
       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   ·   实用小工具   ·   6075 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 02:40 · PVG 10:40 · LAX 18:40 · JFK 21:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.