windows 和 linux 命令解释程序 不同之处,Windows 的 cmd 和 Linux 的 terminal 有啥区别? 答: 作者:zpan 链接:网页链接 来源... - 雪球...

来源:雪球App,作者: 旺仔_1983,(https://xueqiu.com/7060676637/81248795)Windows 的 cmd 和 Linux 的 terminal 有啥区别?

答:

作者:zpan

链接:网页链接

来源:知乎

很多人似乎还是没搞清楚 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 这些设备啦。

PTY

Psuedo Terminal 「伪终端」,是成对的逻辑设备,/dev/ptmx 和 /dev/pts/。实际上 X 的终端以及 telnet 和 ssh 等服务都是通过伪终端来进行的。远程终端绑定到 /dev/pts/ 端口上,服务器实际对 /dev/ptmx 进行读写,但结果都会反映在 /dev/pts/,远程终端会认为自己在读写一个串行终端,服务器也会认为自己在从一个串行终端进行读写,中间则由 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 一样的缺点。

以上这些我也是粗浅认识,并没有深入研究,如有错误请指出,谢谢!

shell好难学,能用python替代shell吗?

答:可以,我曾花过时间把组内的一些Shell脚本都改为Python,可维护性与可读性也明显上了一个档次,Bash那东西,一旦变大了,过一段时间就不知道写的是什么玩意儿了,很多看起来就像鬼画符一样,看的我很生气,于是那段时间我一怒之下就把看不顺眼的全改为Python了,舒服太多了。

作者:蓝色

链接:网页链接

来源:知乎

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值