是的,这些术语有很多混淆。我会试一试,但前提是这确实是语义上的,并且这些术语在日常用语中可以互换使用:
“Shell”是用于运行其他程序的任何程序的术语。它包裹着另一个程序,因此得名。例如,Windows Explorer 是一个外壳,尽管很少有人会称它为外壳。在我使用过的所有语言和平台中,任何程序都可以是 shell。
编辑:我没有定义“终端”。它的名字来源于与用户通信的端点。具体来说,它是用于最终用户通信的打字机设备。今天,它更加通用,可以表示 伪终端(Linux 中的 pts ps -ef),它是由 GUI 管理的基于字符的会话。在 Windows 上,这将被称为“控制台窗口”。
“控制台”在 Windows 和 UNIX 上表示特定但不同的东西。在 UNIX 上,最初是 tty(TeleTYpewriter,VDU 是一种“玻璃电传打字机”),它是物理插入机器的,甚至不是通过加密狗(我回溯到 UNIX 很长一段时间)。它是发送和接收启动和关闭消息以及诸如 PANIC 之类的警报的终端。 bash 和 Korn shell 脚本都可以在没有 TTY/控制台的情况下作为伪守护程序运行。
术语“控制台”经常与更准确的“标准输入”、“标准输出”和“标准错误”(stdin、stdout、stderr,来自 C)混淆。这些有时称为流,在大多数系统上默认定向到终端。在 UNIX 上,它们是前三个文件描述符,在 Windows 上是前三个文件句柄,0、1、2 都是。程序可以将这些定向到它具有适当访问权限的任何文件系统,但通常它不会 - 它通常从其父进程继承它们(过去并非所有操作系统都这样做)。
在 Windows 上,“控制台”程序是具有控制台窗口的程序,通常被错误地称为“DOS 框”。所以,cmd.exe是控制台程序,perl.exe也是,python.exe也是(但不是pythonw.exe)。
命令提示符是由命令行解释器或CLI显示的输入邀请。按照 UNIX 的约定,它以 $ 结尾,除了 root 之外的所有用户,root 以 # 结尾。 csh 不遵循此约定并使用 %。通常,Windows CLI 上的提示以 > 结尾。在所有情况下,这些都可以由用户更改。
我相信 Windows 上 cmd.exe 的快捷方式和窗口标题带有“命令提示符”标签,因为它可以访问命令提示符。我有一本名为“Windows 命令行”的 Microsoft Press 书籍,上面写着“命令行是...通过命令外壳窗口访问的”。因此,即使是微软也混合了他们的条款。
因此,cmd.exe 是一个 shell 和一个 CLI,以及一个控制台程序。 sqlplus 是一个 CLI 但不是 shell,在 Windows 上它是一个控制台程序。 Windows 资源管理器是一个 shell,但不是 CLI 或控制台程序。 Bash 和 Korn shell 都是具有 CLI 的 shell,可以从控制台运行,但不限于此。