Android在线文档Android Debug Bridge说"Adb提供了一个灰壳".果然,如果我adb shell
去AVD模拟器,我会得到灰烬,这基本上是一个简化的Bourne shell.
但是,如果我连接到几个远程设备,一个是HTC电话,另一个是华硕Transformer Prime平板电脑,它们都有一个版本的Korn shell,它提供:KSH_VERSION='@(#)MIRBSD KSH R39 2010/08/24'
.虽然MIRBSD KSH不是一款成熟的AT&T Korn外壳,但它仍然比灰烬强大得多.
模拟器正在运行Jelly Bean,两个设备都在使用ICS.再做一点挖掘,看起来像是在姜饼中的灰烬,而在Honeycomb中则是mirbsd ksh.
那么,有人可以确认Android在线文档是错误的,并且模拟器运行的是过时的shell吗?还是供应商正在实施自己的?
我一直认为子shell不是子进程,而是同一进程中的另一个shell环境.
我使用一组基本的内置函数:
(echo "Hello";read)
Run Code Online (Sandbox Code Playgroud)
在另一个终端:
ps -t pts/0
PID TTY TIME CMD
20104 pts/0 00:00:00 ksh
Run Code Online (Sandbox Code Playgroud)
所以,kornShell(ksh)中没有子进程.
输入bash,看起来行为不同,给出相同的命令:
PID TTY TIME CMD
3458 pts/0 00:00:00 bash
20067 pts/0 00:00:00 bash
Run Code Online (Sandbox Code Playgroud)
所以,bash中的子进程.
从阅读bash的手册页来看,显然是为子shell创建了另一个进程,但是它伪造了$$,这是一个偷偷摸摸的.
bash和ksh之间是否存在这种差异,或者我是否正确地阅读了这些症状?
编辑:附加信息:strace -f
在Linux上运行bash和ksh显示bash clone
为sample命令调用两次(它不调用fork
).所以bash可能正在使用线程(我试过,ltrace
但核心转储!).KornShell既不叫fork
,vfork
也不clone
.
我试图弄清楚,如果我在Python脚本中提交一个简单的错误,是否有办法"强迫"Python脚本不"反击"到bash环境中.
这是一个MWE(MWE.py)来说明这一点:
如果我在下面的MWE中按3,你怎么能告诉Python不要让我退出程序?
x = raw_input("Please input a number 1 or 2: ")
if (x == '1'):
print '1'
elif (x == '2'):
print '2'
#else:
#print 'Neither 1 nor 2.'
Run Code Online (Sandbox Code Playgroud)
请注意,我的最后两行已注释掉.如果我取消注释它们,显然我会得到相应的print语句,程序将成功完成.但是,让我们假设我没有最后两行,并希望MWE.py"保持在Python模式"(可以这么说)而不是严厉地让我回到bash shell,从而迫使我从头开始重新运行python MWE.py
.
有办法以某种方式实现这一目标吗?
显然,这是一个微不足道的MWE,但我试图理解这个原则:是否有可能在我提交输入错误之前返回我所呈现的最后一个提示(例如当我按下3时在此MWE中提交) .是否基本上有一种"通用的方式"可以回到x = raw_input("Please input a number 1 or 2: ")
(或者在我输入错误之前给出的最新提示)?
这在需要在不同阶段进行多个用户输入的程序中显得特别重要.我不想从头开始.
原问题:
a = [1, 2, 3, 4, 5, 6, 4]
print [True for i in a if i == 4]
Run Code Online (Sandbox Code Playgroud)
结果:
[True, True]
Run Code Online (Sandbox Code Playgroud)
我如何编码以打破第一个数字 4?
以下评论,编辑为:
我确实想列出一个包含这么多文件的目录。并查找文件是否以“.mp4”结尾。