powershell cmd与 cmd 有什么不同

后使用快捷导航没有帐号?
查看: 64|回复: 6
Windows 的 cmd 和 Linux 的 terminal 有啥区别?
高级会员, 积分 719, 距离下一级还需 281 积分
论坛徽章:3
作者:zpan
来源:知乎
著作权归作者所有,转载请联系作者获得授权。
很多人似乎还是没搞清楚 shell、console、terminal 这些概念。
「壳」,即人与电脑的接口,实际上是个命令解释程序,从标准输入读取你的命令,把命令结果输出到标准输出和标准错误等设备。 下的 Bash、Zsh,Windows 下的 cmd、PowerShell,这些都是 shell,这个应该很容易理解。
「控制台」,即在 Linux 下按 Ctrl-Alt-F? 看到的那个命令界面。事实上,在远古的 Unix 大型机时代,console 应该是指物理连接在主机上的输入输出设备,而 terminal 是指与 console 进行远程通信的串行设备。而如今的 Linux 控制台实际上是内核模拟的 /dev/ttyn 终端,/dev/console 一般就是 /dev/tty0,只有 root 用户才能写入。
远程连接到控制台的串行设备,现在来说通常也就是 /dev/ttyn 这些设备啦。
Psuedo Terminal 「伪终端」,是成对的逻辑设备,/dev/ptmx 和 /dev/pts/&number&。实际上 X 的终端以及 telnet 和 ssh 等服务都是通过伪终端来进行的。远程终端绑定到 /dev/pts/&number& 端口上,服务器实际对 /dev/ptmx 进行读写,但结果都会反映在 /dev/pts/&number&,远程终端会认为自己在读写一个串行终端,服务器也会认为自己在从一个串行终端进行读写,中间则由 telnet ssh X11 等协议进行连接。
Windows 的情况
严格来说 Windows(具体来说是 Win32 子系统)上并不存在 Linux 上所谓的「控制台」、「终端」和「伪终端」。Windows 程序可以被编译到 GUI 子系统和控制台子系统,系统通过程序的入口函数可以判断程序是个 GUI 程序还是控制台程序。对于 GUI 程序来说,stdin stdout stderr 这些设备都是不存在的。而 Windows 那个黑黑的命令行窗口被称为「Windows 控制台」,实际上它里面模拟了标准输入、标准输出等设备。默认情况下从 explorer 中双击打开命令行程序时,系统会动态创建一个新的 console,用 start /b 命令可以让程序在当前 console 中运行,不加 /b 则在新的 console 中运行,而这两个 console 的 stdin stdout 等设备又都完全不相干了。
普通程序可以通过 ReadConsoleInput ReadConsoleOutput WriteConsoleInput WriteConsoleOutput 等 API 与一个控制台窗口进行交互,另外有 AttachConsole 和 FreeConsole 这样的 API 使程序可以随意绑定到某个 console 窗口。当然这些 API 也可以某种程度上被认为是一种「终端协议」,但它与 Linux 上的 tty 是完全不同的。tty 实际上是一种字符串流协议。而 Win32 以 API 形式的「终端」协议,一般就很难进行远程通信了。
像 ConEmu 这样的程序其实还是通过上面说的那些 API 来跟背后隐藏的一个控制台窗口进行交互,缺点也很明显,它只能完全复制控制台窗口上的内容,受限于 Win32 控制台窗口本身的实现。Win32 控制台不支持 256 色,它也没法支持。Win32 控制台增大宽度后运行一个命令输出了很长的字符串,再把窗口缩小,这缩小的那部分字符就丢失了,微软直到 Windows 10 才让控制台窗口支持了随意改变大小和折行。此外每隔一定时间用 ReadConsoleOutput 等来拉取控制台窗口内容,这种方法对于实现远程通讯等也是不可靠的。
Win32 Console API 在 Win 7 之前都是在 csrss 里的,到了 Win 7 多了一个 conhost,它取代了过去 csrss 中处理 console 的那部分,接管 console window 并与 csrss 进行交互。这个 conhost 某种程度上可以被认为是一个 pty。理论上我们可以写个自己的 conhost 取代系统的,从而实现一个更好的终端程序,甚至实现 ssh server 等。可惜 csrss 的 API 是不公开的或者说 undocumented,没有容易的方法得到 conhost 与 csrss 间的协议。Cygwin 的 pty 只支持 Cygwin 的程序,并不能把普通 Win32 程序的 console 调用转换成 Unix 终端的字节流。Cygwin 只是在内部处理了 Unix 的终端字节流然后转换成 Windows 控制台的 API 调用。所以假如你用 Cygwin 做 ssh server,远程运行非 Cygwin 的 Win32 console 程序,有时会出现各种奇葩问题。当然其实还有一神器叫做 winpty,它可以开一个隐藏的 console 窗口,并把它转换成 Unix 终端字符流并导入 Cygwin 或 Msys 的伪终端设备。但它也有跟 ConEmu 一样的缺点。
以上这些我也是粗浅认识,并没有深入研究,如有错误请指出,谢谢!
高级会员, 积分 719, 距离下一级还需 281 积分
论坛徽章:3
作者:北极 链接: 来源:知乎 著作权归作者所有,转载请联系作者获得授权。&&前面都在讨论软件的功能,我从操作系统的角度上说说:&&1、不管cmd还是xterm,都是软件,虽然也都是操作系统的工具,但本身是在操作系统之上的软件。所以其功能上的差异其实是软件本身功能的差异,比如Cygwin或者msys可以在Windows上模拟Linux的环境,功能一样非常强大,是因为这些模拟环境里功能强大。&&所以有人说cmd功能太弱,那是因为微软不重视cmd下的工具开发,如果把Linux的xterm里的命令都支持了那么cmd一样可以很强大。&&2、Linux里,console是一个原生的支持,Linux自带原生的POSIX子系统,一个进程的生命周期里一直都有STDIN/STDOUT/STDERR的存在,这是Linux的VFS所默认提供的。也就是说你可以用,也可以不用,但它一直存在。&&Windows的POSIX子系统则不是原生的,Windows只支持NT子系统,其余的都是模拟的,Windows进程默认没有STDIN/OUT/ERR,所以Windows进程要想使用控制台,必须先初始化,控制台程序是在CRTMain里调用initterm_e来初始化的。&&表面上,在Windows的控制台也可以用printf输出,但实际上Windows里用的是WriteConsoleOutput输出。&&Linux则是直接从printf到fd的处理,最终调用write来首先。&&说到本质,还是内核里处理方式不一样,一直是直接访问系统API,另一个要绕到子系统里。
中级会员, 积分 213, 距离下一级还需 287 积分
论坛徽章:2
看完还是不太明白。。。。。。。
注册会员, 积分 173, 距离下一级还需 27 积分
论坛徽章:1
非常好。。。。。。。。
金牌会员, 积分 1810, 距离下一级还需 1190 积分
论坛徽章:6
shell:接口,
console:就是黑黑的命令行界面,
temeral:连接l系统的终端设备,用console跟系统交互; ttyn就是指它。
pty:伪终端,ssh连接就是用的它。
注册会员, 积分 67, 距离下一级还需 133 积分
论坛徽章:7
函数不一样没有可比性吧
注册会员, 积分 67, 距离下一级还需 133 积分
论坛徽章:7
错了 系统不一样没有可比性 有的函数差不多例如mkdirwin里的powershell和bash有什么关系吗?微软干嘛自己弄个shell_linux吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:161,527贴子:
win里的powershell和bash有什么关系吗?微软干嘛自己弄个shell收藏
它不是有cmd吗?为嘛不改进自己的cmd呢?另外powershell是模仿bash做出来的,还是啥呢?谢谢
上海linux培训,选达内,将网络工程与linux系统运维相结合,专门培养高端linux人才;上海linux培训,达内4个月从入门到精通,红帽颁发认证工程师证书,名企推荐,薪资翻倍.
看文档说是微软为提高windows服务器管理效率,是为服务器管理员开发的
就是win自己都觉得cmd蛋疼没用,要抄bash
powershell各种蛋疼,连个命令tab补齐都没有
依然沿用cmd的风格,只能补齐文件名,还是非常蛋疼的补齐方式,按一次匹配一个文件,命令根本没法补齐,参数就不用说了。
个人表示ubuntu的bash很蛋疼
wininit 0特别好用!
shell什么的早就有了。基本上整个Win32 GUI就是。不就是cmd太坑了所以用.NET搞了个新CLI么。其实也好不了多少。一个chcp 65001就直接崩了。
powershell是面向对象的,每个cmdlet都有自己独立的属性和方法…… 而bash是面向文本的,每条命令只是文本命令字玩转bash的根本不可能一下子就玩转powershell,难度不在一个级别上
还有,powershell不可能建立在bash之上。反正玩powershell就跟玩C#、.Net框架差不多…… 没有长时间的积累根本玩不好这个东西
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或旗下栏目:
您现在的位置: >
浅谈CMD和win powershell的区别
所属栏目:
发布时间:
| 小编:豆豆
cmd是和powershell都可以做命令行交互,批处理和powershell脚本功能也相当。我不知道你怎么理解cmd,但下面是powershell是基于.net的,只要你足够了解.net,你可以使用她做任何你想做的事情。Windows PowerShell 是专为系统管理员设计的新 Windows 命令行 shell。Windows PowerShell 包括交互式提示和脚本环境,两者既可以独立使用也可以组合使用。与接受和返回文本的大多数 shell 不同,Windows PowerShell 是在 .NET Framework 公共语言运行时 (CLR) 和 .NET Framework 的基础上构建的,它接受和返回 .NET Framework 对象。环境中的这一根本更改带来了管理和配置 Windows 的全新工具和方法。Windows PowerShell 引入了 cmdlet(读作“command-let”)的概念,这是内置到 shell 中的一个简单的单一功能命令行工具。可以分别使用每个 cmdlet,但是组合使用这些简单的工具执行复杂任务时才发挥其作用。Windows PowerShell 包括一百多个基本的核心 cmdlet,您可以编写自己的 cmdlet 并与其他用户共享它们。与许多 shell 一样,Windows PowerShell 为您提供了对计算机上文件系统的访问。此外,使用 Windows PowerShell 提供程序还可以访问其他数据存储,如注册表和数字签名证书存储,就像访问文件系统一样容易。简单的说,Powershell是cmd的超集,换句话说,cmd能做的事情,Powershell都能做,但是Powershell还能额外做许多cmd不能做的活。主要是系统管理功能、脚本语言和在线帮助更强大,你确实可以只把它当成cmd来用,也可以学和用得更深。
相关阅读:
看过本文的人还看过
Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。

我要回帖

更多关于 cmd运行powershell 的文章

 

随机推荐