术语“Shell”和“Bash”之间有什么区别?

R.H*_*Hen 12 bash shell macos

“Shell”和“Bash”有什么区别,这些术语是什么意思?

据我所知,没有区别。但是我看过很多关于“Shell”的书和其他关于“Bash”的书!

因此,如果我想在 Mac OS X 上使用终端并编写一些 bash 脚本,我想知道我应该阅读哪种类型的书。

Ind*_*rek 32

外壳”是为操作系统提供接口的任何软件。例如,explorer.exe是 Windows 中的默认 shell(尽管存在替代方案),并且在 OS X Finder 上提供了许多相同的功能。在 Linux/*nix 上,shell 可以是桌面环境的一部分(如GnomeKDE),也可以是位于它之上的独立软件组件(如UnityCinnamon)。

以上示例都是使用窗口、菜单、图标和其他此类元素的组合来提供可以使用鼠标光标进行交互的图形用户界面 (GUI) 的所有图形外壳。然而,在像 Bash 这样的软件或编写脚本的上下文中,“shell”通常被认为是一个命令行解释器,除了完全基于文本之外,它执行的职责与图形 shell 基本相同。

Bash是命令行 shell 的一个具体例子,可能是最著名的一个,在许多 Linux 发行版和 OS X 中都是默认的。它被设计为Bourne shell的替代品(Bash 代表为“Bourne again shell”),最早的Unix shell 之一

Windows 上的命令行 shell 示例包括cmd.exe(又名命令提示符)和PowerShell

  • @LauriRanta:快速测验,鹦鹉螺的图标是什么? (6认同)
  • Finder 在 OS X 上通常不被称为外壳。大多数 GUI 和窗口管理功能由其他进程处理。 (3认同)
  • @LauriRanta Dock 不是更好的 shell 候选人吗?启动程序和打开文档、曝光/空间/任务控制、AFAIK Launchpad 和任务切换器都是 Dock 的功能。 (2认同)

Nic*_*ton 14

Bash 是几种 shell 之一。

Unix 或类 Unix 系统(如 OSX 或 Linux)上的 shell 是一个应用程序,它为操作系统提供命令行界面,允许您键入命令并运行它们。有许多不同的 shell 可供选择,但它们都提供文件名通配符、管道、here 文档、命令替换、变量和用于条件测试和迭代的控制结构。

最初的 Unix shell 是Bourne shell,sh,由贝尔实验室的 Stephen Bourne 编写。然后是由伯克利的 Bill Joy 编写的C shell,此后更新为tcsh。其他 shell 包括Korn shell、 ksh ,由 David Korn 编写,也在贝尔实验室,以及bash,“Bourne again shell”,由 Brian Fox 为 GNU 项目编写,作为 sh 的免费替代品。

今天,bash 可能是最流行的 Unix shell,但很多人(包括我在内)仍然更喜欢 C shell,因为它的语法更好(对我们中的一些人来说似乎是这样)。基本上,这是一个品味问题,因此我建议您阅读我链接的维基百科文章以帮助您入门。

  • Shell 不一定是基于命令行的,也有许多图形 Shell,例如 Nautilus、Windows Explorer、Finder 等。 Shell 的要点是它是围绕核心 OS 功能/系统调用的包装器/用户界面/Shell,即 shells 提供资源管理(例如文件管理)和进程管理。 (2认同)
  • 我倾向于同意 Lie Ryan 和 paradroid 的观点,即图形外壳现在被视为外壳。在 90 年代,我和任何人一样对命令行范例进行了投资,并且拒绝接受图形 shell 作为 shell。但是对于现代图形外壳中的所有控制面板小部件和诸如此类的东西,我现在同意常见的用法是将它们称为外壳并且这种用法是正确的。它们与外壳的定义相匹配,外壳是围绕底层操作系统的相对较薄的用户界面层。图形外壳在任何人如何编写任何脚本方面都较弱,但许多用户并不关心这一点。 (2认同)

Bil*_*mus 6

术语“壳”是一个很好的名字。它实际上是 O/S 周围的外壳,允许用户与计算机进行交互。当它最初构想时,几乎没有任何图形用户界面(没有窗口 :( )。一切都是在命令行上完成的。但即使是命令行也需要一个地方。它存在于,而且仍然存在于外壳中.

简单来说,为了使命令行有用,它需要可以调用的指令。所以程序被制作成在 shell 内运行以供命令行使用。这些程序被紧密地分组在它们自己的包中,并打算一起工作。它们包括“ls”和“grep”、“ps”、“sed”等程序。它们还包括文件重定向命令,例如“>”和“<”以及管道(“|”)。更重要的是,它们还包括诸如条件操作之类的编程结构(if、then、else、for 循环、while 循环、检查运行语句时返回的状态的方法(例如,如果您运行“ls”是否找到任何东西?),事情像那样)。这些是更复杂的命令行(shell)脚本的基础,

当有人使用术语“Bash Shell”时,他们指的是在 O/S shell 中运行的名为“Bash”的命令行解释器。您可以将其视为“Bash Shell Interpreter”的缩写。还有其他解释器,如 Bourne(Bash 是一个“新的和改进的 Bourne Shell,它是 Bourne Again Shell 的缩写”)。还有 C-Shell、K-Shell(受到许多编写复杂 shell 脚本的人的青睐)和其他 GNU 变体。多年来,将您使用的特定命令行解释器称为 shell 已成为一种习惯,因为没有另一个就无法使用一个解释器。但事实是,它们是不同的。

至于为什么它们被正确地称为命令行解释器而不是实际的 shell:这是因为它们生活在 shell 中并将所有命令解释为好像它们在程序中运行一样。而且 shell 并不关心你在其中运行什么解释器,只要它符合正确的标准。

至于他们为什么被称为口译员,那是因为他们真的是口译员。即使您没有明确运行脚本(并且脚本实际上只是您创建的命令的文本文件,以便您可以一遍又一遍地执行相同的命令而无需再次输入它们)。例如,使用不起眼的“ls”命令。当你运行它时,它会返回一个文件列表。但它如何运行对您的问题更重要:它实际上在命令行解释器的上下文中运行,即使您只是运行看似简单的一次性命令。也就是说,它运行起来就好像它是更大程序的一部分的语句。它就像在 shell 脚本文件中一样运行,而实际上并不在 shell 脚本文件中。一个匿名的 shell 脚本文件。

你在命令行上运行的任何东西都有一个共同点(无论是像“ls”这样的单个命令还是一个充满命令、迭代器和条件语句的脚本文件):它们都由命令行解释器处理;无论是 Bash、C-Shell、K-Shell(顺便说一句,AIX 上的默认设置)。

要了解我的意思,请创建一个目录“test”:

mkdir test
Run Code Online (Sandbox Code Playgroud)

输入它并运行以下命令

grep hello * 
Run Code Online (Sandbox Code Playgroud)

你会得到一些类似“没有这样的文件或目录”的回应。现在输入命令

echo $?
Run Code Online (Sandbox Code Playgroud)

($? 说,告诉我你在神秘的计算机中发现了什么。)你应该看到它返回一个数字(应该是)'2'。那是 grep 的返回码,意思是“没有这样的文件或目录”。现在运行以下命令:

echo hello > hello.txt
grep hello *
echo $?
Run Code Online (Sandbox Code Playgroud)

您将看到从初始 grep 命令返回的文件“hello.txt”,现在应该看到“echo $?” 返回数字 '0' 意味着它实际上找到了一些东西。

即使这些看似一次性的命令被运行,命令行解释器的行为就像它们是更大程序的一部分并跟踪它们的返回值。这就是为什么如果您忘记了 grep 命令末尾的 * 它不会返回的原因。它知道该语句不完整并期望更多输入。毕竟,您可能会要求它 grep 某个循环的结果,这对于在命令行上编写和运行是完全合法的。

底线是外壳就是外壳,而解释器(无论您使用的名称是什么,“Bash”、k-shell 等)是不同的。但它们通常可以互换使用,因为在任何给定时刻它们都完全联系在一起。


Gil*_*not 1

bash是这个shell家族的一员,但还有很多其他的贝壳。

例如,在Minix3上,有ashshell,它不支持像bash4.

POSIX标准试图在不同的 shell 和操作系统之间建立可移植的 API

请参阅http://en.wikipedia.org/wiki/Unix_shell#Bourne_shell_complete