您现在的位置:主页 > 讲座动态 >
 
 

Windows的PowerShell和Linux的terminal有啥区别

时间:2020-05-17 14:15:52

很多人似乎还是没搞清楚shell、console、terminal这些概念。Shell「壳」,即人与电脑的接口,实际上是个命令解释程序,从标准输入读取你的命令,把命令结果输出到标准输出和标准错误等设备。Linux下的Bash、Zsh,Windows下的cmd、PowerShell,这些都是shell,这个应该很容易理解。Console「控制台」,即在Linux下按Ctrl-Alt-F?看到的那个命令界面。事实上,在远古的Unix大型机时代,console应该是指物理连接在主机上的输入输出设备,而terminal是指与console进行远程通信的串行设备。而如今的Linux控制台实际上是内核模拟的/dev/ttyn终端,/dev/console一般就是/dev/tty0,只有root用户才能写入。TTY远程连接到控制台的串行设备,现在来说通常也就是/dev/ttyn这些设备啦。PTYPsuedoTerminal「伪终端」,是成对的逻辑设备,/dev/ptmx和/dev/pts/<number>。实际上X的终端以及telnet和ssh等服务都是通过伪终端来进行的。远程终端绑定到/dev/pts/<number>端口上,服务器实际对/dev/ptmx进行读写,但结果都会反映在/dev/pts/<number>,远程终端会认为自己在读写一个串行终端,服务器也会认为自己在从一个串行终端进行读写,中间则由telnetsshX11等协议进行连接。Windows的情况严格来说Windows(具体来说是Win32子系统)上并不存在Linux上所谓的「控制台」、「终端」和「伪终端」。Windows程序可以被编译到GUI子系统和控制台子系统,系统通过程序的入口函数可以判断程序是个GUI程序还是控制台程序。对于GUI程序来说,stdinstdoutstderr这些设备都是不存在的。而Windows那个黑黑的命令行窗口被称为「Windows控制台」,实际上它里面模拟了标准输入、标准输出等设备。默认情况下从explorer中双击打开命令行程序时,系统会动态创建一个新的console,用start/b命令可以让程序在当前console中运行,不加/b则在新的console中运行,而这两个console的stdinstdout等设备又都完全不相干了。普通程序可以通过ReadConsoleInputReadConsoleOutputWriteConsoleInputWriteConsoleOutput等API与一个控制台窗口进行交互,另外有AttachConsole和FreeConsole这样的API使程序可以随意绑定到某个console窗口。当然这些API也可以某种程度上被认为是一种「终端协议」,但它与Linux上的tty是完全不同的。tty实际上是一种字符串流协议。而Win32以API形式的「终端」协议,一般就很难进行远程通信了。像ConEmu这样的程序其实还是通过上面说的那些API来跟背后隐藏的一个控制台窗口进行交互,缺点也很明显,它只能完全复制控制台窗口上的内容,受限于Win32控制台窗口本身的实现。Win32控制台不支持256色,它也没法支持。Win32控制台增大宽度后运行一个命令输出了很长的字符串,再把窗口缩小,这缩小的那部分字符就丢失了,微软直到Windows10才让控制台窗口支持了随意改变大小和折行。此外每隔一定时间用ReadConsoleOutput等来拉取控制台窗口内容,这种方法对于实现远程通讯等也是不可靠的。Win32ConsoleAPI在Win7之前都是在csrss里的,到了Win7多了一个conhost,它取代了过去csrss中处理console的那部分,接管consolewindow并与csrss进行交互。这个conhost某种程度上可以被认为是一个pty。理论上我们可以写个自己的conhost取代系统的,从而实现一个更好的终端程序,甚至实现sshserver等。可惜csrss的API是不公开的或者说undocumented,没有容易的方法得到conhost与csrss间的协议。Cygwin的pty只支持Cygwin的程序,并不能把普通Win32程序的console调用转换成Unix终端的字节流。Cygwin只是在内部处理了Unix的终端字节流然后转换成Windows控制台的API调用。所以假如你用Cygwin做sshserver,远程运行非Cygwin的Win32console程序,有时会出现各种奇葩问题。当然其实还有一神器叫做winpty,它可以开一个隐藏的console窗口,并把它转换成Unix终端字符流并导入Cygwin或Msys的伪终端设备。但它也有跟ConEmu一样的缺点。以上这些我也是粗浅认识,并没有深入研究,如有错误请指出,谢谢!=========================================第一次回答过百赞,感谢大家支持!☆*:.?.o(≧▽≦)o.?.:*☆
共有评论 11相关评论
发表我的评论
  • 大名:
  • 内容: