“Shell”和“Bash”有什么区别?这些术语是什么意思?
据我所知,没有区别。但我见过很多关于“Shell”的书,也有关于“Bash”的书!
因此,如果我想使用 Mac OS X 上的终端并编写一些 bash 脚本,我不知道应该选择哪种书籍。
答案1
A ”壳“是任何为操作系统提供接口的软件。例如,浏览器是 Windows 中的默认 shell(尽管存在替代方案)以及 OS X发现者提供了许多相同的功能。在 Linux/*nix 上,shell 可以是桌面环境的一部分(如侏儒或者桌面环境),也可以是位于其上的单独软件组件(如统一或者肉桂)。
上述示例都是图形 shell,它们使用窗口、菜单、图标和其他此类元素的组合来提供可使用鼠标光标进行交互的图形用户界面 (GUI)。然而,在 Bash 等软件或编写脚本的上下文中,“shell”通常是指命令行解释器,它执行的任务与图形 shell 大致相同,只是完全基于文本。
猛击是命令行 shell 的一个具体示例,可能是最著名的命令行 shell 之一,是许多 Linux 发行版以及 OS X 中的默认命令行 shell。它被设计为伯恩壳(Bash 代表“Bourne again shell”),最早的Unix shell。
答案2
Bash 是几种 shell 之一。
Unix 或类 Unix 系统(如 OSX 或 Linux)上的 shell 是一种应用程序,它为操作系统提供命令行界面,允许您键入命令并运行它们。有许多不同的 shell 可供选择,但它们都提供文件名通配符、管道、此处文档、命令替换、变量和用于条件测试和迭代的控制结构。
最初的 Unix shell 是伯恩壳,sh,由贝尔实验室的 Stephen Bourne 编写。然后是C 壳,由伯克利的 Bill Joy 撰写,现已更新为tcsh. 其他 shell 包括Korn 壳,ksh,由贝尔实验室的 David Korn 编写,以及狂欢,即“Bourne again shell”,由 Brian Fox 为 GNU 项目编写,作为 sh 的免费替代品。
如今,bash 可能是最流行的 Unix shell,但很多人(包括我)仍然更喜欢 C shell,因为它的语法更好(有些人觉得如此)。基本上,这只是个人喜好问题,因此我建议阅读我链接的 Wikipedia 文章,以帮助您入门。
答案3
“shell”这个术语的名字很贴切。它实际上是操作系统的外壳,允许用户与计算机交互。当它最初被设想出来时,几乎没有图形用户界面(没有窗口 :( )。一切都是在命令行上完成的。但即使是命令行也需要一个地方来存放。它存在于 shell 中,现在仍然如此。
简单来说,要使命令行有用,它需要可以调用的指令。因此,程序被设计成在 shell 中运行,以供命令行使用。这些程序被紧密地分组在各自的程序包中,旨在协同工作。它们包括“ls”和“grep”、“ps”、“sed”等程序。它们还包括文件重定向命令,如“>”和“<”以及管道(“|”)。更重要的是,它们还包括编程结构,如条件操作(if、then、else、for 循环、while 循环、检查运行语句时返回的状态的方法(例如,如果您运行“ls”,它是否找到了任何东西?),诸如此类)。这些是更复杂的命令行(shell)脚本的基础,实际上就是命令行解释器。
当有人使用术语“Bash Shell”时,他们指的是运行在 O/S shell 中的命令行解释器“Bash”。您可以将其视为“Bash Shell 解释器”的缩写。还有其他解释器,如 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 上的默认设置)。
要了解我的意思,请创建一个目录“测试”:
mkdir test
输入并运行以下命令
grep hello *
您将收到类似“没有这样的文件或目录”的响应。现在输入命令
echo $?
($? 用神秘的计算机语言说,告诉我你发现了什么。) 你应该看到它返回一个数字(应该是)“2”。这是 grep 的返回代码,表示“没有这样的文件或目录”。现在运行以下命令:
echo hello > hello.txt
grep hello *
echo $?
您将看到从初始 grep 命令返回的文件“hello.txt”,现在应该看到“echo $?”返回数字“0”,表示它确实找到了某些内容。
即使运行了这些看似一次性的命令,命令行解释器也会像它们是更大程序的一部分一样运行,并跟踪它们的返回值。这就是为什么如果你忘记了 grep 命令末尾的 *,它就不会返回。它知道该语句不完整,并期望更多的输入。毕竟,你可能会要求它 grep 某个循环的结果,而这在命令行上编写和运行是完全合法的。
归根结底,shell 就是 shell,而解释器(无论你使用什么名称,‘Bash’、k-shell 等)是不同的。但它们通常可以互换使用,因为在任何特定时刻它们都是完全联系在一起的。
答案4
bash
是贝壳家族中的一种shell
,但还有很多其他的贝壳。
例如,Minix3,有ash
shell,它不支持类似的关联数组bash4
。
这POSIX标准是一种尝试,旨在创建不同的 shell 和 OS 之间的可移植 API。
看http://en.wikipedia.org/wiki/Unix_shell#Bourne_shell_compatible