如何在我的Android设备上运行BASH脚本?

23

我相同的BASH脚本在Fedora/CentOS上运行正常。

但是我正在测试一个Android eee pad transformerenter image description here

我可以访问终端并编写了一个小测试脚本。但它无法正常工作,我应该如何修复它?我做错了什么吗?

/data/data/berserker.android.apps.sshdroid/home $ cat test.sh 
#!/bin/bash
var=`ifconfig -a`;
echo $var;

/data/data/berserker.android.apps.sshdroid/home $ chmod +x test.sh 
/data/data/berserker.android.apps.sshdroid/home $ ./test.sh 
sh: ./test.sh: not found
/data/data/berserker.android.apps.sshdroid/home $ uname -a
Linux localhost 2.6.36.3-00004-g069b8b5 #1 SMP PREEMPT Wed May 11 22:14:22 CST 2011 armv7l GNU/Linux

/data/data/berserker.android.apps.sshdroid/home $ bash ./test.sh 
sh: bash: Permission denied

/data/data/berserker.android.apps.sshdroid/home $ ls -l /bin/bash
ls: /bin/bash: No such file or directory

/data/data/berserker.android.apps.sshdroid/home $ find / -name "bash"
find: /config: Permission denied
lots more.......
find: /proc/595/task/598/fd: Permission denied
......
find: /data: Permission denied
find: /root: Permission denied

跟进:

这是我的脚本,现在已经可用:

#!/bin/sh
echo "hello wassup, run me simply as './test.sh'";

or

#!/bin/bash
echo "hello wassup, run me using 'sh ./test.sh'";

@Ocaso Protal:请看上面,所有内容都已经透明地粘贴了。 - user285594
我离成为安卓专家还有很长的路要走,但这可能是由于内存占用问题和使用微型shell以节省闪存和RAM空间。ls -l /bin/bash显示什么?它是符号链接吗?如果是,符号链接的目标是什么?我认为/bin/bash是指向一个不完全符合bash标准的shell的符号链接。 - f4m8
1
你尝试过简单的“sh”脚本吗?使用/bin/sh而不是/bin/bash,看看会发生什么。可能是因为Android没有适当的Bash实现。 - Aleks G
chmod在某些Android发行版上不接受+x。尝试使用chmod 777。 - KZ.
6个回答

31

在 Android 中,Shell 位于 /system/bin/sh 而不是大多数类 Unix 系统中的 /bin/sh。因此,即使您将 #!/bin/bash 更改为 #!/bin/sh,它也无法正常工作。您需要使用 #!/system/bin/sh

Android 不是 GNU/Linux 发行版,因此不能期望所有在 GNU/Linux 上运行的脚本也能在 Android 上运行。


4
这个信息是不正确的。我只是把脚本修改成 #!/bin/sh,然后它就可以工作了。 - user285594
1
目前我正在使用 #!/bin/sh,它可以正常工作。但是如果像@Asten所提到的那样执行 $sh ./test.sh 也是可以的。 - user285594
我尝试使用 #!/bin/sh,但我的第一个命令 su 没有起作用。修改为 #!/system/bin/sh,然后我得到了 root 授权提示! - FreeSoftwareServers

11

也许当使用脚本调用解释器时,它会起作用?

$ bash ./test.sh

我看到尽管指定了#!/bin/bash,但错误是由sh发布的 - 可能它做错了。

更新

$ sh ./test.sh

1
似乎没有Bash解释器,默认使用sh。请尝试使用它:$ sh ./test.sh。此外,您所使用的Shell解释器可能没有像Bash中那样的功能。 - ASten
但我想要使用BASH。就像在Fedora/Centos中使用的方式一样。 - user285594
尝试使用$符号在bash中查找它。 - ASten
谢谢,我暂时使用你的方法 $sh ./test.sh 或者我也可以将上面的行改为 /bin/sh,这样至少能工作。但是安卓需要这样做真的很烦人。 - user285594

5
大多数Android设备没有安装bash解释器。如果您确实需要在Linux和Android上运行脚本,可以尝试使用BusyBox,但这将需要root您的设备(可能会使您的保修失效)。即使如此,我也不知道ifconfig实用程序是否包含在BusyBox中。
我强烈建议使用Android SDK编写应用程序来完成您想要完成的任务。

你的意思是,在我的Fedora/CentOS上使用Android SDK来远程连接Android系统么? - user285594
1
不,我的意思是在Fedora/CentOS上使用bash脚本来完成你正在做的事情。使用Java\C\C++和Android SDK在Android上复制该功能。 - Wesley Wiser

3
正如所述,Android操作系统(包括4.0)不包含BASH解释器(只有shell)。虽然BusyBox是一个很好的工具,但我认为它只是一个单一的可执行文件,结合了常见UNIX实用程序的削减功能以减小体积,但实际上并不包括BASH解释器。
如果需要Android编译版本的BASH解释器,请参考此论坛帖子: http://forum.xda-developers.com/showthread.php?t=537827

1
你可以安装Busybox,它提供了许多实用程序,如awk、file等,并且终端模拟器
  1. 创建一个带有#!/system/bin/sh作为第一行(shebang)的shell文件
  2. 现在将已完成的脚本放置在/system/xbin/system/bin下,并从终端模拟器中运行它

这些信息摘自这篇文章:如何在Android设备上运行shell脚本


0

让bash脚本运行只是其中最小的问题。问题在于如何在不打开终端模拟器并键入脚本路径的情况下执行它。唯一的方法是使用TCL/TK:

1-) 在https://www.androwish.org/home/home下载并安装AndroWish
2-) 从Google商店安装Busybox

编写一个启动器:

launcher.tcl

#!/usr/bin/wish
exec sh /storage/sdcard0/yourscript.sh
exit 0

yourscript.sh

#!/system/bin/sh
[...]

通过输入以下命令,将桌面快捷方式添加到 AndroWish 终端: borg shortcut add "MyScript" file://mnt/sdcard/launcher.tcl


似乎为了运行一个shell脚本安装TCL/TK需要很大的努力。 - Robert
这基本上取决于您每天需要运行相同脚本的频率,如果可以手动完成,那就手动完成吧。但AndroWish是一个APK。 - Pedro Albanese

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接