在Linux中我有shell(例如bash,csh等)和终端模拟器(例如xterm)。 Shell执行命令和终端模拟器显示带有白色字母的黑色窗口。
它在Windows中如何?我知道我有cmd.exe,但它是什么?它是一个shell,还是终端模拟器,还是它们都是?
如何称为执行bat文件的解释器?它们是由cmd.exe还是其他东西执行的?
答案 0 :(得分:12)
Linux和Windows的架构不同。这真的是 - 当没有相似之处时,你不应该寻找相似之处。
Linux基于UNIX,可以追溯到哑终端的时代。图形设备是高度专业化(和昂贵的),并不常见。大多数UNIX访问是通过字符驱动的终端(异步)。
有许多终端设备制造商。当时最成功的一个是DEC(自HP接管以来),他们的VAX计算机上使用了一系列终端:vt52是最基本的,vt100,vt220,vt320提供了越来越多的功能。像 putty 这样的终端模拟器会模仿这些模拟器。 IBM,惠普和其他公司也有自己的设备。
问题在于所有这些终端都不同,并且必须采用不同的方式。因此创建了一个终端指令数据库,首先称为termcap
,然后是terminfo
。访问数据库取决于仍然使用的TERM
环境变量的设置。
来图形,特别是Xterm和终端窗口。数据库具有xterm的控制信息,并相应地设置TERM
变量。
当然,就UNIX而言,微软的Windows是一个完全陌生的操作系统,所以它必须假装成为UNIX终端。这就像 putty 这样的终端模拟器。它将伪装成现在只在博物馆中发现的那些古老的终端之一。
因此, cmd.exe 不是终端模拟器,因为它是在Windows计算机上运行的Windows应用程序。没有必要模仿任何东西。
它是一个shell,具体取决于你对shell的定义。 Microsoft认为Windows资源管理器是一个shell。换句话说,shell只是一个运行其他程序的程序。大多数UNIX / Linux用户不会将GUI称为shell,但这只是语义。
cmd.exe 是控制台程序,其中有很多。例如,telnet
和python
都是控制台程序。这意味着他们有一个控制台窗口,这是您看到的单色矩形。有些人认为这与 cmd.exe 相同(更糟糕的是将其称为" DOS框"),但事实并非如此,它只使用相同的控制台API。 Windows图形程序有一个"主窗口"与它相关联,但它可以如果它希望创建一个控制台!他们通常不会,但他们可以。
cmd.exe 脚本具有.bat
(或不太常见的.cmd
)文件扩展名。但是,此文件扩展名关联只是Windows注册表(HKEY_CLASSES_ROOT)中的一组查找。这里没有魔力,就像将.doc
与Microsoft Office Word相关联,而.bat
与 cmd.exe 相关联。
UNIX的一个聪明功能是脚本上的#!
行。这可用于运行bash,ksh,sed,awk,perl,python,ruby等等。如果您安装了多个版本的python,那么您只需将#!
行更改为拿起正确的一个。在Windows上没有这种灵活性,您一次只能将一个程序与文件扩展名相关联。
答案 1 :(得分:5)
CMD.exe是一个Win32控制台程序,从窗口角度来看没有什么特别之处。在任务管理器中查看开始 - 运行(Winkey + R)(Ctrl + Shift + Escape)。
cmd.exe
关闭
ftp.exe ftp.microsoft.com
所有控制台程序都有一个控制台,并且与GUI程序的工作方式不同(什么是GUI程序 - 没有控制台的程序)。通常,但并非总是如此,我们启动cmd然后请求cmd启动另一个控制台程序。但是从上面的ftp程序示例中可以看到CMD不是必需的。
来自帮助
字符模式应用
控制台管理字符模式应用程序(不提供自己的图形用户界面的应用程序)的输入和输出(I / O)。
控制台功能可以对控制台进行不同级别的访问。高级控制台I / O功能使应用程序能够从标准输入读取,以检索存储在控制台输入缓冲区中的键盘输入。这些函数还使应用程序能够写入标准输出或标准错误,以在控制台的屏幕缓冲区中显示文本。高级功能还支持标准句柄的重定向和控制台模式的控制,以实现不同的I / O功能。低级控制台I / O功能使应用程序能够接收有关键盘和鼠标事件的详细输入,以及涉及用户与控制台窗口交互的事件。低级功能还可以更好地控制屏幕输出。
此概述介绍了对字符模式应用程序的支持。
将有关此主题的评论发送给Microsoft
建造日期:2006年10月2日
CMD也是Telnet界面。
答案 2 :(得分:4)
同意cmd
不是终端模拟器,是否是 shell 取决于您的期望。 Microsoft将其称为command interpreter。作为命令解释器(包括各种内置功能 - 请参阅 Command-line reference A-Z ),它能够解释脚本。终端仿真器关注 display 和输入/输出 - 完全不同。
然而,关于控制台窗口的答案部分没有它本来的帮助。
控制台窗口是Windows应用程序的一个特例:它们模拟MS-DOS等的行为,但在其中运行(或使用它们)的应用程序不仅限于MS-DOS行为,因为控制台窗口是在所有 Windows应用程序。
AllocConsole的文档说:
此功能主要由图形用户界面(GUI)应用程序用于创建控制台窗口。无需控制台即可初始化GUI应用程序。控制台应用程序使用控制台进行初始化,除非它们是作为分离的进程创建的(通过使用DETACHED_PROCESS标志调用CreateProcess函数)。
以下是一些可以进一步讨论的链接:
关于OP的最后一个问题:cmd.exe
是Windows上的默认命令解释器,关联与" .bat"文件后缀(即,当Windows被告知"open"后面带有" .bat")的文件时,它是由默认调用的程序。文件关联(主要)是Windows文件资源管理器中使用的功能。 Unix中的类似功能是mailcap
配置。
在Windows惯例中,您可以打开"具有替代应用程序的文件,将其用作应用程序的参数。的Windows' cmd.exe
有一个特殊命令start
,可用于使用默认应用程序打开文件(例如参见 Open a file in the default application using the Windows command line (without JDIC) )
与Unix shell解释器一样,cmd
有一个选项(/c
),允许您使用给定的命令字符串显式运行它。有Windows的第三方命令解释器;有些延伸cmd.exe
,而有些则是Unix程序的端口。
答案 3 :(得分:0)
CMD.EXE的历史可以追溯到IBM需要基于x86的IBM PC计算机的命令行界面的时候 - 微软制造的MS-DOS(磁盘操作系统)是第一个接口,它是间接受Unix风格的shell界面影响,因为它有可能导航子目录,在PATH中执行命令,还可以创建.BAT文件,这些文件在续集中运行几个命令。
在图形用户界面成为商品后,CMD.EXE被创建为DOS模拟器,可以运行较旧的基于MS-DOS的程序,能够模拟旧的基于EGA / VGA的显示器,主要是在文本模式下。也可以在全屏模式下模拟图形模式。之后,从CMD.EXE中删除了对旧图形模式的支持,其存在的目的是面向高级用户的基于文本的界面。
然而,与Unix系统相比,CMD.EXE是传统接口并且仍然较差。此外,它无法访问许多功能来正确管理重要的Windows操作系统任务 - 这是Unix用户认为理所当然的事情。在2000年初,微软开始使用命令行界面PowerShell开发运行高级用户管理任务的替代方法。
答案 4 :(得分:0)
CMD让我想起了Windows 1.0之前的DOS。与使用所有MS Windows操作系统相比,使用MS.DOS 6.22导致的崩溃更少。而且病毒问题也更少。 即使CMD.exe无法与Unix或Python或Apple软件匹配,它仍在进行中,如果作者愿意,可以进行重大改进。
在某些方面,它类似于那里的其他外壳-却比其他外壳更精巧。我猜想随着DOS和CMD.exe变体而成长-我已经知道它的许多优点。实际上,如果有人在阅读Microsoft,请加强控制台!在那里你听到了。