Linux的shell expect的用法与Windows的 CMD差别在哪

shell翻译成壳的意思,它是包裹在外层的,一个可通过一系列的linux命令对发出相关指令的人机界面。 shell可以通过其条件语句和循环语句等,把一系列linux命令结合在一起,形成一个相当于的程序,shell script,来实现一些较为复杂的功能。
总括,shell是linux命令集的概称,是属于命令行的人机界面。Shell 是一个用C语言编写的程序,它是用户使用Linux的桥梁。Shell既是一种命令语言,又是一种程序设计语言。Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。Ken Thompson的sh是第一种Unix Shell,Windows Explorer是一个典型的图形界面Shell。Shell 和Shell Script不是一回事,通常我们说的都是Shell Script。
Shell 编程跟java、php编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了
Linux的Shell种类众多,常见的有:
Bourne Shell(/usr/bin/sh或/bin/sh)
Bourne Again Shell(/bin/bash)
C Shell(/usr/bin/csh)
K Shell(/usr/bin/ksh)
Shell for Root(/sbin/sh)
shell是一个命令解释器,处于内核和用户之间,负责把用户的指令传递给内核并且把执行结果回显给用户,同时,shell也可以作为一门强大的编程语言。
在Windows平台上,shell=cmd.exe(Command shell)用windows上的命令可以写一个批处理文件,点击执行,如 test.bat。
本文已收录于以下专栏:
相关文章推荐
1、windows下BAT批处理的工作原理就是一次处理多条DOS命令,其效果和在DOS下依次执行各条命令相同;BAT文件其实就是文本文件,用任意文本编辑器均可打开。
2、DOS命令常用的有86条(在D...
《Linux Shell编程学习笔记之二》:特殊变量($*和$@的区别)、命令替换和变量替换特殊变量一般变量比较简单哈,与Java、C/C++不一样的地方在于不需要定义,直接使用即可。例如:#!/bi...
看了前面一节:linux shell数据重定向(输入重定向与输出重定向)详细分析 估计还有一些朋友是头晕晕的,好复杂的重定向了。这次我们看下管道命令了。shell管道,可以说用法就简单多了。
管道命令操作符是:”|”,它仅能处理经由前面一个指令传出的正确输出信息,也就是standard output 的信息,对于 stdandard
error信息没有直接处理能力。然后,传递给下一个...
他的最新文章
讲师:王哲涵
讲师:韦玮
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)1 # create new excel instance 2 &$objExcel = New-Object -comobject Excel.Application 3 &$objExcel.Visible = $True 4 &$objWorkbook = $objExcel.Workbooks.Add() 5 &$objWorksheet = $objWorkbook.Worksheets.Item(1) 6
7 &# write information to the excel file 8 $i = 0 9 $first10 = (ps | sort ws -Descending | select -first 10)10 $first10 | foreach -Process {$i++; $objWorksheet.Cells.Item($i,1) = $_. $objWorksheet.Cells.Item($i,2) = $_.ws}11 $otherMem = (ps | measure ws -s).Sum - ($first10 | measure ws -s).Sum12 $objWorksheet.Cells.Item(11,1) = "Others"; $objWorksheet.Cells.Item(11,2) = $otherMem13 14 # draw the pie chart15 $objCharts = $objWorksheet.ChartObjects()16 $objChart = $objCharts.Add(0, 0, 500, 300)17 $objChart.Chart.SetSourceData($objWorksheet.range("A1:B11"), 2)18 $objChart.Chart.ChartType = 7019 $objChart.Chart.ApplyDataLabels(5)
(1. 这个脚本调用了Excel的COM库。 2. 当然从命令耦合的角度来看,输出成文本格式更有利,但这个例子主要想说明PowerShell的强大以及微软产品优异的复用性。 3. 要手动启动PowerShell,可以在开始菜单的搜索框中直接键入PowerShell回车即可)简单领略PowerShell的强大之后,下文就从几个方面介绍一下PowerShell相对于以往版本的命令提示符甚至Linux Shell的优势。
Cmdlet + Regex + Pipeline + ...
以往cmd相对于Shell有很多不足,比如命令偏少,部分命令功能偏弱,对正则表达式不支持等等。但现在PowerShell一下赶上来不少。版内建支持414个命令(术语称为cmdlet),支持正则表达式,强大的管道应用(其实管道本身的功能和以前差不多,关键是冒出来一堆能用管道的命令,比如more, sort, foreach等等),和系统的联系也比以前紧密了很多。举几个例子来说明:dir registry::HKEY_CURRENT_USER可以直接显示注册表相应位置的内容,可以看到dir的功能改进了不少。ps | sort ws -Descending | select -first 10可以显示占用内存最大的10个进程,可以看到管道的灵活应用。dir -Name | ? {$_ -match "(?&num&.).*(\k&num&)"}可以显示出当前目录下文件名有重复字符的文件。比如abcda.efg,而abcd.efg则不会显示出来。可以看到PowerShell对正则表达式的支持相当强大。(确切的说严格的&已经无法实现这样的效果,需要 才能够支持。)以前为了演示Linux Shell的强大,发了一个自己的截图,在遇见PowerShell前觉得好神奇,所幸现在也可以实现了。:-)
&(为了节约显示空间,PowerShell的部分显示结果被删除,但这个Prompt效果可以用以下脚本验证: function prompt {"($env:username)-($env:computername)-(`$?: $?)-(jobs: $((get-job | measure).Count))-($(get-location))`n(! $(((history)[-1]).ID + 1))-&"})
大杀器 - 面向对象
Linux的设计思想决定所有的输入和输出都尽可能是文本格式,这样可以方便各进程间的合作。同样这也要求各个程序提供一定强度的文本解析能力。但Windows的思想与此不同,PowerShell中很多输入输出都不是普通的文本(plain text),而是一个个对象(objects)。因此与其说PowerShell是一种交互环境,不如说它是一种强大语言的Runtime,而这种语言甚至是面向对象的。比如当键入get-process查看当前进程列表时,系统返回的是这样的列表:
Handles& NPM(K)&&& PM(K)&&&&& WS(K) VM(M)&& CPU(s)&&&& Id ProcessName-------& ------&&& -----&&&&& ----- -----&& ------&&&& -- -----------&&& 318&&&&&& 8&&& 12948&&&&&& 3872&&& 84&&&&&&&&&&& 1728 AppleMobileD&&& 115&&&&&& 5&&& 13816&&&&& 13328&&& 38&&&&&&&&&&& 6920 audiodg&& 1315&&&&& 21&&& 11732&&&&& 10988&& 108&&&&&&&&&&& 2544 CcmExec... ...
虽然看似一般的格式化文本,但其实这是一个数组,而每个数组元素又是Process类型的对象。同.NET一脉相承,PowerShell中的所有的类都继承自Object,且支持GetType()函数。因此我们可以执行(get-process).GetType()来看看它的类型:
IsPublic IsSerial Name&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& BaseType-------- -------- ----&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& --------True&&&& True&&&& Object[]&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& System.Array
而数组中每个元素的类型可以用(get-process)[0].GetType()查看:
IsPublic IsSerial Name&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& BaseType-------- -------- ----&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& --------True&&&& False&&& Process&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ponentM...
其中面向思想的思想非常明显,类成员,方法,继承都出现了。个人感觉这样的好处并不是指望能用PowerShell写什么大型软件,而是体现在另外两个方面:首先,这样让内置的cmdlet及其数据结构组织清晰,符合直觉,写代码时速度快不容易出错。第二,对面向对象的内建支持也为后面无缝接合.NET和COM接口提供了基础。
站在巨人的肩膀上 - 无缝调用.NET/COM
.NET Framework中包含了一个异常强大的库,而微软为了保证二进制层面上跨语言的兼容性,很多库都是用COM封装的。PowerShell的一大特色就是可以直接调用这些库。比如前面的示例用$objExcel = New-Object -comobject Excel.Application创建了一个Excel对象。而wikipedia上的一个脚本更示范了这种无缝调用的强大。下面这个3句话的脚本的作用是显示一个RSS源最近的8篇文章的标题。注意其中网络连接,内容下载,XML解析等工作全部由.NET库完成,正因为站在巨人的肩膀上,PowerShell在实际使用中往往左右逢源,简洁高效。
$rssUrl = "/powershell/rss.aspx"$blog = [xml](new-object System.Net.WebClient).DownloadString($rssUrl)$blog.rss.channel.item | select title -first 8
编辑,运行,调试 - IDE
Windows程序开发,尤其是基于微软技术的开发很爽的一点就是有强大的IDE和专业的文档作支持。不论是Windows下的Visual Studio还是Linux下的Mono Develop,甚至连PowerShell这样的语言都有集编辑与调试为一体的IDE:Windows PowerShell ISE。有了自动完成,即时脚本交互,调试甚至远程调试,PowerShell脚本写起来&甚爽甚强巨&。当然文档也是一般的强大,依旧专业浩瀚。
蛋疼的伪装 - Profile
有了PowerShell以后,很少就去cmd了。不过作为一个蛋疼的装B男,把PowerShell伪装成cmd也是挺有乐趣的一件事。不难发现PowerShell和cmd仅仅在图标,标题,背景色,提示符,以及刚启动时的显示文字五个方面不同。图标和背景色在快捷方式属性中可以很方便的修改。而标题和提示符的修改就要用到Profile了。所谓Profile就是在每次启动PowerShell时都首先自动运行的一段脚本。这个脚本的路径在$profile变量中有设定。只要设定$host.UI.RawUI.WindowTitle为C:\windows\system32\cmd.exe就能将标题伪装为cmd。而自定义提示符为当前路径在PowerShell中自然万分简单。至于启动时的显示文字,只要通过/nologo参数隐藏原有的版本信息,再打印一行cmd中的文字就好了。最终效果如图:(关于Profile,可以参见)
另:进程级工作调度&& 并行支持?
==========================================================随着多核处理器的迅速发展,从.NET Framework 4.0开始,并行计算被一再强调。从System.Threading中新增加的并行工具类到F#这种非常适合并行化的函数式语言,微软适时对线程级并行提供了强大的支持。但是对于进程级的工作调度,Windows似乎还相当原始。举个最简单的例子来说,如果我们同时向一个移动硬盘启动5个拷贝会话的话,Windows会同时开始所有的拷贝操作。这样磁头会在不同的目标位置间反复进行无意义的移动(寻道),于是在硬盘灯的狂闪中,大量时间就被浪费了。同样当我们同时启动数个计算量大的进程时,Windows也会试图让这些进程&齐头并进&。然而为了避免某个进程被饿死,系统又不得不频繁切换进程,于是大量的时间又被浪费在了保存现场,进程切换,恢复现场上。这样来看,进程级的并行做的反而不够好。
所幸PowerShell中加入了任务调度管理功能。通过简单的实验,我们可以发现PowerShell对jobs的调度和Windows默认的大不相同,它一般维持和CPU核心数相同的进程高速运转,而其它进程仅仅占用小部分CPU时间。直到前面的进程结束工作后,后面才有新的进程递补进入高速运转的状态。==========================================================后来更仔细地做了实验以后发现,原来Windows内置的进程调度方案就是小部分高速运转(在我的双核处理器上是两个进程占用50%CPU),大部分低速跟进(其他所有进程分享剩下的50%CPU)。这样PowerShell的工作调度并没有改善系统原有的现状。同时由于PowerShell的调度系统需要占用不小的内存,初始化也需要时间。在实测中甚至比默认调度慢了50%。这个实验结果比较囧。不晓得为什么PowerShell中为什么要加入Job这个东西,难道仅仅为了异步调用吗?
[Update] Another post also about powershell can be found in my blog:&
评论 - 101Linux Shell与Windows CMD_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
Linux Shell与Windows CMD
你可能喜欢Windows 的 cmd 和 Linux 的 terminal 有啥区别? - 知乎753被浏览47840分享邀请回答82626 条评论分享收藏感谢收起问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
shell 与windows下的cmd区别
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
本来不是很想回答这个问题,但是看到评论里面那瓶矿泉水也来凑闹热,我就忍不住了。。。这厮曾经把我的答案评论的惨不忍睹。
首先说shell,shell直接翻译就是壳,按照ABS的定义,shell是The shell is a command interpreter. More than just the insulating layer between the operating system kernel and the user, it's also a fairly powerful programming language.渣英文翻一下的意思是:shell是一个命令解释器,处于内核和用户之间,负责把用户的指令传递给内核并且把执行结果回显给用户,同时,shell也可以作为一门强大的编程语言。
很显然这里的shell是命令行解释器的意思.也有内核上的一层壳的含义。
然后我们看下CMD
CMD是Command shell的简写,翻译成中文也是命令外壳我擦真的好渣的翻译。我们看下的定义:The command shell is a separate software program that provides direct communication between the user and the operating system. The non-graphical command shell user interface provides the environment in which you run character-based applications and utilities. The command shell executes programs and displays their output on the screen by using individual characters similar to the MS-DOS command .
照例渣英文翻译下:
Command Shell是一个独立的应用程序,它为用户提供对操作系统直接通信的功能,它为基于字符的应用程序和工具提供了非图形界面的运行环境,它执行命令并在屏幕上回显MS-DOS风格的字符。好啦我知道翻译很渣你行你上啊
综上,shell和CMD并没有本质上的区别。另外,在linux/unix平台上,shell多半默认为Bash shell,当然也有其他shell,比如C shell什么的,在Windows平台上,shell=cmd.exe,如是而已。
都是命令行解释器,都是一个用户与操作系统的交互接口。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
都是命令解释器。提供解析命令行输入、执行程序、处理管道,以及完成一定的编程语言的能力,负责批处理文件的解析。(.sh for UNIX shell, .cmd or .bat for Windows CMD)Shell和CMD都提供针对文字终端的接口能力,或者也可以不和用户直接接口。
他俩除了用途相同之外,恐怕剩下的就全是区别了。
例如,Windows的CMD又另外承担了图形界面下终端模拟器的任务,Windows嘛,一切都大杂烩的烂作风。而Linux图形界面下,终端模拟器会被lxterminal、sakura、terminator等单独的软件接管,不混杂,符合Unix风格。
常见的问题是将Windows的CMD认为是“DOS”。DOS和命令行绝对是两个概念,总把DOS挂嘴边的人真该改改观念了。
Windows如今也不光有CMD这一个Shell了。微软这个技术后进生在Shell上也在做改变。除了CMD是系统关键组件不动之外,又新作了一套PowerShell增强批处理等功能,去追赶Unix发展了几十年的脚步。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
如果 lz 的 shell 指的是 linux 的 bash 的话:
路径分隔符,cmd 是 "\" ,bash 是 "/"
转义字符,cmd 是 ^ 和双引号,bash 有双引号,单引号和 "\"
顺序执行两个命令,cmd 是 cmd1 && cmd1 而 bash 是 cmd1 ; cmd2
and 执行两个命令,cmd 是 cmd1 & cmd2 而 bash 是 cmd1 && cmd2
通配符实现原理不同,比如 cmd 中使用 dir *.dll 的这个“*.dll”的通配符是 dir 自己实现的,但是在 bash 中 ls *.txt 通配符是 bash 实现的,也就是说传入 ls 命令的实际参数相当于 1.txt 2.txt ... 这样子
PATH 的分隔符, cmd 是分号,bash 是冒号
虽然 echo 都是内置命令,但是功能有一些差异
放在后台执行,bash 是 & ,而 cmd 是 start 命令
bash 的很多功能,比如 alias ,cmd 没有对应物
还有配置方式(bash 是用配置文件,而 cmd 是在标题栏上面点右键)
区别太多了……不知道 lz 具体要问哪方面的。
同步到新浪微博
分享到微博?
Hi,欢迎来到 SegmentFault 技术社区!⊙▽⊙ 在这里,你可以提出编程相关的疑惑,关注感兴趣的问题,对认可的回答投赞同票;大家会帮你解决编程的问题,和你探讨技术更新,为你的回答投上赞同票。
明天提醒我
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:}

我要回帖

更多关于 shell 的用法 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信