是cmd.exe的shell,terminal模拟器或两者?

在Linux中,我有shell(例如bash,csh等)和terminal模拟器(例如xterm)。 壳执行命令和terminal仿真程序显示白色字母的黑色窗口。

而且它是如何在Windows中? 我知道我有cmd.exe那里,但它是什么? 它是一个shell,还是一个terminal模拟器,还是两者兼而有之?

而如何称为执行bat文件的解释器? 他们是由cmd.exe还是其他的执行?

CMD.exe是一个Win32控制台程序,从窗口的角度来看没有什么特别的。 在查看任务管理器(Ctrl + Shift + Escape)时键入开始 – 运行(Winkey + R)。

cmd.exe 

然后关闭

 ftp.exe ftp.microsoft.com 

所有控制台程序都有一个控制台,对GUI程序的工作方式不同(GUI程序是什么 – 没有控制台的程序)。 通常,但并非总是,我们启动cmd,然后要求cmd启动另一个控制台程序。 但是从上面的ftp程序例子可以看出,CMD并不是必需的。

从帮助

字符模式应用程序

控制台管理字符模式应用程序(不提供自己的图形用户界面的应用程序)的输入和输出(I / O)。

控制台功能启用对控制台的不同级别的访问。 高级控制台I / O功能允许应用程序从标准输入读取,以检索存储在控制台输入缓冲区中的键盘输入。 这些功能还使应用程序可以写入标准输出或标准错误,以在控制台的屏幕缓冲区中显示文本。 高级函数还支持标准句柄的重定向和不同I / O功能的控制台模式的控制。 底层控制台I / O功能使应用程序能够接收关于键盘和鼠标事件的详细输入,以及涉及用户与控制台窗口交互的事件。 低级功能还可以更好地控制输出到屏幕。

本概述描述了对字符模式应用程序的支持。

向Microsoft发送有关此主题的评论

建立日期:10/2/2006

CMD也是Telnet界面。

Linux和Windows的体系结构是不同的。 就是这样 – 当没有相似之处时,你不应该寻找相似之处。

Linux是基于UNIX的,可以追溯到愚蠢的终端日子。 图形设备是高度专业化(和昂贵的),并不常见。 大部分的UNIX访问都是通过字符驱动的终端(在那里是异步的)。

有许多终端设备制造商。 当时最成功的一个是DEC公司(自从惠普公司接管)在他们的VAX电脑上使用了一系列终端:vt52是最基本的,vt100,vt220,vt320增加了功能。 终端模拟器像腻子模拟那些。 IBM,HP和其他公司也都有自己的设备。

问题是,所有这些终端是不同的,不得不被驱动不同。 所以创建了一个终端指令的数据库,首先调用termcap ,然后是terminfo 。 数据库被访问,取决于仍然使用的TERM环境变量的设置。

在图形,特别是Xterm和一个终端窗口。 数据库具有xterm的控制信息,并且相应地设置TERM变量。

当然,就UNIX而言,微软的Windows是一个完全陌生的操作系统,所以它必须假装成UNIX终端。 这就是像腻子这样的终端模拟器。 它将假装成为现今仅在博物馆中发现的古代码头之一。

所以, cmd.exe不是终端仿真程序,因为它是Windows机器上运行的Windows应用程序。 没有必要模仿任何东西。

这是一个外壳,取决于你对外壳的定义。 微软认为Windows资源管理器是一个shell。 换句话说,一个shell只是一个运行其他程序的程序。 大多数UNIX / Linux的人不会把GUI叫做shell,但这只是语义。

cmd.exe是一个控制台程序 ,并有很多这些。 例如, telnetpython都是控制台程序。 这意味着他们有一个控制台窗口 ,这是你看到的单色矩形。 有些人认为和cmd.exe是一样的(甚至更糟糕的称之为“DOS框”),但事实并非如此,它只是使用相同的控制台API。 一个Windows图形程序有一个“主窗口”与它相关联,但如果它希望创建一个控制台也可以! 他们通常不会,但他们可以。

cmd.exe脚本默认情况下具有.bat文件扩展名(或不常用的.cmd )文件扩展名。 但是这个文件扩展名关联只是Windows注册表(HKEY_CLSSES​​_ROOT)中的一组查找。 这里没有什么魔力,就像把.doc和Microsoft Office Word关联起来,而是把.batcmd.exe关联起来。

UNIX的聪明功能之一就是#! 线上的脚本。 这可以用来运行bash,ksh,sed,awk,perl,python,ruby等等。如果你有多个版本的python,那么你只需要改变#! 线来拾取正确的一个。 在Windows上没有这种灵活性,您只能将一个程序一次与文件扩展名关联。

同意cmd不是终端模拟器,它是否是一个shell取决于你的期望。 微软把它称为命令解释器 。 作为命令解释器(包括各种内置功能 – 请参阅命令行参考AZ ),它能够解释脚本。 终端仿真器关心的是显示和输入/输出 – 完全不同。

然而,关于控制台窗口的部分答案不如以前那样有帮助。

控制台窗口是Windows应用程序的特例:它们模拟MS-DOS等的行为,但在其中运行的应用程序不限于MS-DOS行为,因为控制台窗口毕竟是Windows申请

AllocConsole的文档说:

此功能主要由图形用户界面(GUI)应用程序用于创建控制台窗口。 GUI应用程序无需控制台即可初始化。 除非将控制台应用程序创建为分离进程(通过使用DETACHED_PROCESS标志调用CreateProcess函数),否则控制台应用程序将使用控制台进行初始化。

这里有几个链接进一步讨论:

  • 将控制台I / O添加到Win32 GUI应用程序
  • 将GUI添加到C ++ win32控制台
  • 如何创建一个兼容GUI和控制台应用程序的Windows程序
  • 确定程序是否是控制台或GUI应用程序

关于OP的最后一个问题: cmd.exe是Windows上默认的命令解释器,并与“.bat”文件后缀相关联 (也就是说,当Windows被告知“打开”后缀文件时,它是默认调用的程序与“.bat”)。 文件关联(大部分)是Windows文件资源管理器中使用的功能。 Unix中的一个类似功能是mailcap配置。

在Windows约定中,您可以使用替代应用程序作为应用程序的参数来“打开”文件。 cmd.exe有一个特殊的命令start ,可用于使用默认应用程序打开文件 (例如,请参阅使用Windows命令行(不带JDIC)在默认应用程序中打开文件

和Unix shell解释器一样, cmd有一个选项( /c ),允许你使用给定的命令字符串显式地运行它。 有Windows的第三方命令解释器; 有的扩展了cmd.exe ,有的则是Unix程序的端口。

CMD.EXE的历史可以追溯到IBM需要基于x86的IBM PC计算机的命令行接口的时候–Microsoft制造了MS-DOS(磁盘操作系统),这是第一个接口,它受到了Unix类型的shell的间接影响界面,它有可能导航子目录,在PATH中执行命令,并创建.BAT文件,后续运行几个命令。

图形用户界面成为商品后,CMD.EXE被创建为一个DOS模拟器,它可以运行较老的基于MS-DOS的程序,能够模拟旧的基于EGA / VGA的显示器,主要是在文本模式下。 还有可能在全屏模式下模拟一些图形模式。 后来,对于较旧的图形模式的支持已经从CMD.EXE中移除了,它的存在目的是面向高级用户的基于文本的界面。

但是,与Unix系统相比,CMD.EXE是传统界面,并且保持低劣。 此外,它无法使用许多功能来正确管理重要的Windows操作系统任务 – 这是Unix用户认为理所当然的事情。 在2000年初,微软开始开发使用命令行界面PowerShell来运行电力用户管理任务的替代方式。