- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
Android 在线文档 Android Debug Bridge说“亚行提供了一个灰壳”。果然,如果我 adb shell
到 AVD 模拟器,我会得到 ash,它基本上是一个精简的 Bourne shell。
但是,如果我连接到几个远程设备,一个是 HTC 电话,另一个是 ASUS Transformer Prime 平板电脑,它们都有一个版本的 Korn shell,它提供:KSH_VERSION='@(# )MIRBSD KSH R39 2010/08/24'
。虽然 MIRBSD KSH 不是成熟的 AT&T Korn shell,但它仍然比 ash 强大很多。
模拟器正在运行 Jelly Bean,并且两个设备都在使用 ICS。做更多的挖掘,看起来 ash 在 Gingerbread 中,但 mirbsd ksh 在 Honeycomb 中。
那么,有人可以确认 Android 在线文档有误,并且模拟器运行的是过时的 shell 吗?还是供应商正在实现他们自己的?
最佳答案
我是 mksh(The MirBSD Korn Shell)的作者,并且在已经为 Android 1.5 进行了 mksh 的实验性构建之后,大约在 1.6 时间提交了它以包含在 Android 中。
虽然 Android-x86 很早就使用了它,但它花了很长时间才被接受。起初我们有一个可配置的开关,电路板配置将决定是使用 ash 还是 mksh;谷歌同意一台设备只能装一个。大约在准备 2.4(从未发布)时,硬件板配置使用 mksh,而模拟器配置使用 ash,以确保不引入 mksh-specific,以防他们想要或需要返回到灰。 2.4一直没有发布,不知道3.0系列用的是什么,但是Android 4.0 mksh是它的标准系统shell。
mksh 甚至得到了 Geremy Condra 的安全审查,我们(AOSP/Google 人员和我)定期推送代码更新。有趣的事实:他们最初根本不打算在手机上运送外壳,但同意运送 mksh,因为那时他们已经运送了带有外壳的设备,所以它成为了已发布的 API。 Android 开发人员喜欢 mksh 的 #1 功能是 tab 补全。
现在看在线文档,似乎他们删除了 ash 引用。他们现在只是没有明确说明哪个 shell 可用。 (他们确实同意链接到在线文档中的 mksh 主页——我为此提交了一个补丁——这样用户就可以使用 RTFM 并提供错误报告和其他反馈。)
关于Android adb shell - ash 还是 ksh?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11950131/
我想知道为什么下面的小脚本现在可以工作。 我在/data 目录下创建了 dfFile 但脚本没有打印 if 语句中的表达式。 #!/bin/ksh DATAFILE="/data/dfFile" ec
这个问题不太可能帮助任何 future 的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况有关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,visit
我正在编写一个简单的 ksh 脚本。我必须检查字符串是否为空。怎么做呢?这就是我所拥有的: findRes=`find . -name believe | xargs grep -q "ser"` i
首先介绍一点背景知识:我们有 9 个 JVM 服务器,它们输出日志文件,我不断地解析这些日志文件以查找何时发生错误。日志每 5-10 分钟滚动一次,但文件名不会更改。我使用 SupperPutty 打
当脚本由 ksh 提供时,它如何确定它的路径? IE。 $ ksh ". foo.sh" 我已经在 stackoverflow 和其他地方发布的 BASH 中看到了非常好的方法,但还没有找到 ksh
我在某处读到 ksh 的数组支持 += 来追加新元素,但我试过了,它不起作用: [ksh] # arr=(a b c d) [ksh] # arr+=e [ksh] # echo ${arr[*]}
在我的 ksh 脚本中,我有参数 VERSION=3.9.2X。 $VERSION 始终以 3.9.2 开头,X 可以是任何整数或 float 。 以下不规则 ksh 语法适用于任何 X 整数,但不适
我参与了将包含数百个 ksh 脚本的系统从 AIX、Solaris 和 HPUX 移植到 Linux 的过程。我发现 ksh 在两个系统上的行为方式存在以下差异: #!/bin/ksh flag=fa
我正在编写一个 Expect 脚本并且在处理 shell 提示时遇到了麻烦(在 Linux 上)。我的 Expect 脚本生成 rlogin并且远程系统正在使用 ksh .远程系统上的提示包含当前目录
我讨厌 eval... 我被这个 ksh 困住了,它必须是这样的。 我需要这个函数,它将接收一个变量名和一个值。将对该变量的内容和值做一些事情,然后必须更新接收到的变量。排序: REPORT="a t
我希望我的 ksh 脚本具有不同的行为,具体取决于是否有通过 stdin 传入的内容: (1) cat file.txt | ./script.ksh (then do "cat ./tmp
set -o vi-tabcomplete正在打开选项卡自动完成 和 set -o emacs正在打开历史记录(上一个命令向上,下一个命令向下) 但是,如果我同时在 ~/.kshrc 中设置,它只会打
#!/bin/ksh ######################### for i in {1..30} ;do echo $i done 输出是: {1..30} 我的代码有什么问题
我编写了一个示例 KornShell 函数来拆分字符串,将其放入数组中,然后打印出值。 代码如下 #!/usr/bin/ksh splitString() { string="abc@hotm
我需要检查变量是否具有以指定子字符串开头的字符串值。 在 Python 中,它会是这样的: foo = 'abcdef' if foo.startswith('abc'): print 'Su
我正在尝试在 ksh 中构建一种属性集。 我认为最简单的方法是使用数组,但语法太让我难受了。 我想要的是 在配置文件中构建具有名称和属性的任意大小的数组。 迭代该列表中的每个项目并获取该属性。 我理论
我正在尝试在 ksh 中构建一种属性集。 我认为最简单的方法是使用数组,但语法太让我难受了。 我想要的是 在配置文件中构建具有名称和属性的任意大小的数组。 迭代该列表中的每个项目并获取该属性。 我理论
我需要知道执行赋值的命令的退出状态。 export VALUE=`My_Get_Value 10` 我需要知道 My_Get_Value 脚本的退出状态。 在$?中,我拥有分配本身的状态。 我在 KS
我使用内置的“getopts”ksh 来处理命令行选项,我正在寻找一种干净/标准的方法来“取消设置”命令行上的选项。我不知道这是关于 getopts 的技术问题还是更多的风格/标准问题。无论如何,我知
在 ksh 中,如下所示 iname=FA USER_FA=xyz USER_CS=test TDUSER=USER_$iname ${!TDUSER} ${!TDUSER} 未按预期工作。为什么?
我是一名优秀的程序员,十分优秀!