在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是一个控制台程序 ,并有很多这些。 例如, telnet
和python
都是控制台程序。 这意味着他们有一个控制台窗口 ,这是你看到的单色矩形。 有些人认为和cmd.exe是一样的(甚至更糟糕的称之为“DOS框”),但事实并非如此,它只是使用相同的控制台API。 一个Windows图形程序有一个“主窗口”与它相关联,但如果它希望创建一个控制台也可以! 他们通常不会,但他们可以。
cmd.exe脚本默认情况下具有.bat
文件扩展名(或不常用的.cmd
)文件扩展名。 但是这个文件扩展名关联只是Windows注册表(HKEY_CLSSES_ROOT)中的一组查找。 这里没有什么魔力,就像把.doc
和Microsoft Office Word关联起来,而是把.bat
和cmd.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函数),否则控制台应用程序将使用控制台进行初始化。
这里有几个链接进一步讨论:
关于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来运行电力用户管理任务的替代方式。