我可以说 shell 是 CLI 的一个特性,它是命令行解释器吗?
没有任何外壳,我们会遇到很多问题,但可以使用操作系统。例如,而不是ls
我应该使用/usr/bin/ls /full/path/to/current/place/
没有 CLI 是不可能的,因为用户没有任何界面可以与内核对话来完成他们的工作?
请解释 shell 和 CLI 之间的区别以回答这个问题
我可以说 shell 是 CLI 的一个特性,它是命令行解释器吗?
没有任何外壳,我们会遇到很多问题,但可以使用操作系统。例如,而不是ls
我应该使用/usr/bin/ls /full/path/to/current/place/
没有 CLI 是不可能的,因为用户没有任何界面可以与内核对话来完成他们的工作?
请解释 shell 和 CLI 之间的区别以回答这个问题
我认为,在您的意义上,“外壳”被认为是您与机器交互的界面,无论是终端、图形界面还是一些直接的大脑到机器的链接。更准确地说,可以说“外壳”是与硬件交互的程序(
sh
、、bash
X11、Gnome、KDE、BrainLink 3.2 等等),以便您与机器进行交互。同时,CLI(或命令行界面)是一种外壳,可让您访问系统的命令行(因此称为interface)。
正如您所发现的,并非所有的 shell 都是一样的。有些提供图形(如 X11/Unity),而有些仅用于终端访问,如您的普通 TTY。即使在此范围内,这些 shell 也会因运行它们的程序而有所不同。例如,
/bin/sh
shell 相对简单,提供了一个基本的 CLI,同时/bin/bash
提供了更多的功能。两者在技术上仍然是外壳,就像一些非常简单的程序一样,它只调用exec()
你传递的任何东西。即使没有 CLI,您的系统仍然可以 100% 有用。以 Windows 或 macOS 为例。这些都不需要 CLI(如果可以的话,我相信他们会完全删除它),但系统仍然非常可用。
但是请记住,每个系统都有可用的命令行,但并非每个系统都有开放的命令行界面供您使用。另一方面,您需要一个外壳(图形或控制台)才能与您的机器交互以运行任意程序。例如,您的基于 Linux 的智能电视在技术上是一个“外壳”,因为它可以启动任意应用程序,但您也运行嵌入式 Linux 的停车计时器不需要面向公众(甚至面向私人)的外壳。
接口与外壳
关于什么是命令行界面和什么是 Shell,存在很多混淆。正如评论中提到的那样,任何有“界面”一词的东西,都是想法或理论。当你听到“接口”这个词时,会想到“与计算机通信的想法”。接口可以在两台计算机之间,如以太网电缆,也可以在计算机和用户之间。
壳牌就是付诸实践的理论。CLI 说用户通过文本与计算机交互,而 shell 正是这样做的。图形用户界面说“用户通过按钮和图标进行交互”,而 GNOME 或 Unity 提供了这一点。外壳实际上是一个软件,是用户可以用来与计算机交互的一些对象。“接口”只是提出了交互应该如何发生的想法。现在,它们可以互换使用,“CLI”和“Shell”成为同义词。
过去,当计算机使用卷纸打印信息时,命令行界面是唯一的想法。例如看这个视频:https ://www.youtube.com/watch?v= qv5b1Xowxdk 当然没有像 bash 或 ksh 这样的 shell,但是有最小的 shell 可以读取用户命令并处理它们。
没有 CLI 和 shell 会发生什么?
想一想:为什么我们需要 shell ?用于用户交互!什么时候不需要用户交互?那么就不需要shell了。一个很好的例子是洗衣机、无线打印机、咖啡机。这些设备已经运行 Linux 内核,但无需通过文本与用户交互。我们需要感知按钮按下以及压力和电压的变化。所以不需要shell/命令行界面。但是,仍然可以通过巧妙的工程/黑客技术获得它:https ://www.youtube.com/watch?v=h5PRvBpLuJs
想想微控制器芯片。例如,我使用过 PIC18 芯片。这些人只是坐在他们的电路板上,永远运行 C 代码。没有真正需要阅读命令。但是对于我的项目,我已经将该芯片与 Raspberry Pi 连接起来,并向其发送 A、B、C 等文本字符。这就是用户交互!您可能会争辩说这是与设备通信的最小外壳。
无壳通讯
从技术上讲,当您使用 shell 时,您并没有直接与内核通信。Shell 可能会代表您进行系统调用。从理论上讲,您可以通过在 C 中编译和插入内核模块而不使用 shell 来与内核通信,但这将非常低效且耗时。
Shell 是程序员经常用来从他们的应用程序中调用外部程序的函数。通常可以在 CLI 中输入相同的程序。当这样做时,它可以被称为“脱壳”。外部程序的输出通常重定向到调用程序在“外壳”程序完成时打开的工作文件。
我每天使用的一个简单场景是在 Libre Office Calc 中运行一百个 bash 命令并将输出存储在电子表格中。