cmd.exe是shell,终端模拟器还是两者兼而有之?

use*_*447 5 windows shell cmd batch-file

在Linux中我有shell(例如bash,csh等)和终端模拟器(例如xterm).Shell执行命令和终端模拟器显示带有白色字母的黑色窗口.

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

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

cda*_*rke 15

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上没有这种灵活性,您一次只能将一个程序与文件扩展名相关联.


小智 5

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

cmd.exe
Run Code Online (Sandbox Code Playgroud)

然后关闭

ftp.exe ftp.microsoft.com
Run Code Online (Sandbox Code Playgroud)

所有控制台程序都有一个控制台,并且与GUI程序的工作方式不同(什么是GUI程序 - 没有控制台的程序).通常,但并非总是如此,我们启动cmd然后请求cmd启动另一个控制台程序.但是从上面的ftp程序示例中可以看到,不需要CMD.

来自帮助

字符模式应用

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

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

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

将有关此主题的评论发送给Microsoft

建造日期:2006年10月2日

CMD也是Telnet接口.


Tho*_*key 5

同意这cmd不是终端仿真器,是否是外壳取决于您的期望。Microsoft将其称为命令解释器。作为命令解释器(包括各种内置功能-请参阅命令行参考AZ),它能够解释脚本。终端仿真器关注display和input / output-完全不同。

但是,给出的与控制台窗口有关的部分答案没有那么有用。

控制台窗口是Windows应用程序的一种特殊情况:它们模拟MS-DOS等的行为,但是在其中运行(或使用它们)的应用程序不限于MS-DOS行为,因为控制台窗口毕竟是Windows。申请

AllocConsole的文档说:

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

以下是一些进一步讨论此问题的链接:

关于OP的最后一个问题:cmd.exe是Windows上的默认命令解释器,并且与“ .bat”文件后缀关联(也就是说,它是在Windows被告知“打开”后缀为“。的文件时默认调用的程序。蝙蝠”)。文件关联(主要)是Windows File Explorer中使用的功能。Unix中的一个类似功能就是配置。mailcap

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

像Unix shell解释器一样,cmd有一个选项(/c)使您可以使用给定的命令字符串显式运行它。有适用于Windows的第三方命令解释器;请参见第11部分。有些扩展cmd.exe,而另一些则是Unix程序的端口。


Cor*_*bie 2

关于这些术语的一些历史:在计算机庞大而复杂的时代,有控制台来操作它们。这并不罕见,只是一组控制计算机内部状态的按钮,并且计算机上的一些灯显示状态。通过纸带或打孔卡输入更复杂的命令。

较新的计算机使用小型打印机或电传打字机 (TTY) 来打印输出。打字机还可以用来输入由计算机执行的命令行。这基本上是磁带或卡的更直接(且慢得多)的替代方案 - 但允许程序员和计算机之间进行某种对话。这些所谓的终端对于程序员来说是比原始控制台更先进的端点,但它们具有相同的目的。这就是为什么这两个术语经常互换使用。

现在它变得有点复杂:当计算机相互连接时,一个人可以从他们坐在前面的终端访问另一台计算机,而不必走到另一台计算机的终端。这不是一件容易的任务,因为第一台计算机必须像第二台计算机的终端一样通过电缆发送与真实终端发送的信号相同的信号。所以他们编写了程序来做到这一点,称为终端模拟器

在现代计算机上,操作系统的内部结构是封装的,因此用户无法访问。也没有必要这样做,因为有一些程序可以让您的生活更轻松。这些程序称为shell。它们可以是图形化的,例如Windows资源管理器,允许您将文件从A复制到B,而不必担心文件实际写入内存甚至硬盘驱动器上的位置。在这种情况下,可以使用鼠标和键盘输入命令。

shell 也可以是基于文本的,例如cmd.exe. 它通过显示命令提示符来请求命令,例如您在命令行C:\>中键入,该命令将被解释。因此,这是一种特殊的 shell:命令解释器cmd.exe

如果您使用图形用户界面,则输入文本的窗口就像基于文本的界面的终端模拟器。这就是为什么我更喜欢将其称为“终端窗口”“终端”

当您打开cmd.exe(例如从资源管理器中单击它)时您看到的实际上是终端窗口conhost.exe。还有其他类似ConEmu或新的Windows Terminal


tl;dr:cmd.exe是一个命令解释器(一种 shell),通常在终端窗口(如conhost.exe.


对于最后一个问题:*.bat文件也称为批处理文件。它包含多个命令,例如一批(或一堆)打孔卡。这些命令中的每一个都由 解释cmd.exe