windows - cmd.exe 是 shell、终端仿真器还是两者兼而有之?

标签 windows shell batch-file cmd

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

它在 Windows 中的表现如何?我知道那里有 cmd.exe,但它是什么?它是一个 shell,还是一个终端仿真器,或者两者兼而有之?

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

最佳答案

Linux和Windows的架构不同。确实如此 - 你不应该在没有相似之处的情况下寻找相似之处。

Linux 基于 UNIX,可以追溯到哑终端时代。图形设备高度特化(且昂贵)且不常见。大多数 UNIX 访问是通过字符驱动的终端(当时是异步的)。

终端设备制造商众多。当时最成功的公司之一是 DEC(自从被 HP 接管后),他们在 VAX 计算机上使用了一系列终端:vt52 是最基本的,vt100、vt220、vt320 提供了越来越多的功能。 putty 等终端仿真器可模拟这些。 IBM、HP 和其他公司也都有自己的设备。

问题是所有这些终端都是不同的,必须以不同的方式驱动。因此创建了一个终端指令数据库,首先称为 termcap,然后是 terminfo。根据仍在使用的 TERM 环境变量的设置访问数据库。

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

当然,就 UNIX 而言,Microsoft 的 Windows 是一个完全陌生的操作系统,因此它必须假装是一个 UNIX 终端。这就是像 putty 这样的终端仿真器。它将伪装成如今只能在博物馆中找到的那些古老终端之一。

因此,cmd.exe 不是终端仿真器,因为它是在 Windows 机器上运行的 Windows 应用程序。无需模仿任何东西。

它是一个 shell ,取决于你对 shell 是什么的定义。 Microsoft 将 Windows Explorer 视为一个 shell 。换句话说,shell 只是一个运行其他程序的程序。大多数 UNIX/Linux 用户不会将 GUI 称为 shell,但这只是语义。

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

cmd.exe 脚本默认具有 .bat(或现在不太常见的 .cmd)文件扩展名。但这个文件扩展名关联只是一组在 Windows 注册表 (HKEY_CLASSES_ROOT) 中的查找。这里没有魔法,就像将 .doc 与 Microsoft Office Word 相关联,而不是将 .batcmd.exe 相关联。

UNIX 的巧妙功能之一是脚本中的 #! 行。这可用于运行 bash、ksh、sed、awk、perl、python、ruby 等等。如果您安装了多个版本,比如安装了 python,那么您只需更改 #! 行来选择正确的代码。在 Windows 上没有这样的灵 active ,您一次只能将一个程序与文件扩展名相关联。

关于windows - cmd.exe 是 shell、终端仿真器还是两者兼而有之?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31085853/

相关文章:

PHP TCP套接字连接限制 - Windows服务器

windows - Windows 中的 Gedit 创建多个实例

excel - 使用shell将csv文件保存为excel文件

batch-file - 批处理文件递归复制目录

loops - 如何在批处理文件中连续循环命令

c# - 从 c# winforms 应用程序将输出写入控制台

windows - CMake 错误 - 无法检测 libjpeg 和 ADD_SUBDIRECTORY() 错误

shell - 对于嵌入式系统的命令行实现,是否有任何好的引用实现?

string - 如何用 bash 中的另一个字符替换字符串的最后一个字符?

windows - 如何防止 XCOPY 询问目标是文件)还是目录)?