“ Shell”和“ Bash”之间的区别是什么?这些术语是什么意思?
据我所知,没有区别。但是我看过很多关于“壳牌”的书,还有一些关于“ Bash”的书!
因此,如果我想在Mac OS X上使用Terminal并编写一些bash脚本,我想知道我应该买哪种书。
“ Shell”和“ Bash”之间的区别是什么?这些术语是什么意思?
据我所知,没有区别。但是我看过很多关于“壳牌”的书,还有一些关于“ Bash”的书!
因此,如果我想在Mac OS X上使用Terminal并编写一些bash脚本,我想知道我应该买哪种书。
Answers:
“ 外壳 ”是提供操作系统接口的任何软件。例如,explorer.exe是Windows中的默认外壳程序(尽管存在替代方法),并且在OS X Finder中提供了许多相同的功能。在Linux / * nix上,外壳可以是桌面环境的一部分(如Gnome或KDE),也可以是位于其之上的独立软件组件(如Unity或Cinnamon)。
上面的示例是使用窗口,菜单,图标和其他此类元素的组合的所有图形外壳,以提供可以使用鼠标光标进行交互的图形用户界面(GUI)。但是,在Bash之类的软件或编写脚本的环境中,“外壳”通常是指命令行解释器,除了完全基于文本外,它还执行与图形外壳基本相同的任务。
Bash是命令行Shell的特定示例,并且可能是最著名的命令行Shell之一,它是许多Linux发行版和OS X中的默认外壳。它是Bourne Shell的替代产品(Bash stand代表“ Bourne Again Shell”),第一个Unix shell之一。
Windows上的命令行Shell的示例包括cmd.exe(aka命令提示符)和PowerShell。
Bash是几种外壳之一。
诸如OSX或Linux之类的Unix或类似Unix的系统上的外壳程序是一个应用程序,它为操作系统提供命令行界面,使您可以键入命令并运行它们。有许多不同的外壳可供选择,但是它们都提供文件名通配符,管道,此处的文档,命令替换,变量以及用于条件测试和迭代的控制结构。
最初的Unix shell是Bourne shell,由Bell Labs的Stephen Bourne编写。接下来是由Berkeley的Bill Joy编写的C shell,自从更新为tcsh以来。其他shell包括由Kell shell,ksh(由Bell Labs的David Korn编写),以及bash(由Brian Fox为GNU项目编写的“ Bourne Again shell”),它是sh的免费替代品。
如今,bash可能是最受欢迎的Unix shell,但是许多人(包括我在内)仍然更喜欢基于其更好的语法(对我们中的某些人而言)的C shell。基本上,这是一个品味问题,因此,我建议阅读我链接的Wikipedia文章,以帮助您入门。
术语“外壳”是很好的称呼。它实际上是操作系统的外壳,允许用户与计算机交互。最初构想时,几乎没有图形用户界面(没有windows :()。所有操作都在命令行上完成。但是即使命令行也需要一个居住的地方。它在shell中一直存在并且仍然存在) 。
简而言之,为了使命令行有用,它需要可以调用的指令。因此,使程序可以在shell内运行以供命令行使用。这些程序紧密地组合在各自的程序包中,并打算一起工作。它们包括“ ls”和“ grep”,“ ps”,“ sed”等程序。它们还包括“>”和“ <”之类的文件重定向命令以及管道(“ |”)。更重要的是,它们还包括诸如条件操作之类的编程结构(如果是,则为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都不关心您在其中运行什么解释器。
至于为什么将它们称为口译员,是因为它们确实是口译员。即使您没有明确运行脚本(脚本实际上只是您创建的命令的文本文件,这样您也可以一遍又一遍地执行相同的命令,而不必再次键入它们)。例如,使用不起眼的“ ls”命令。运行它时,它将返回文件列表。但是它的运行方式对您的问题更为重要:它实际上在命令行解释器的上下文中运行,即使您只是运行一个简单的一次性命令也是如此。也就是说,它的运行就像是更大程序中的一部分。它就像在Shell脚本脚本文件中一样运行,而实际上不在Shell脚本文件中。匿名的shell脚本文件。
您在命令行上运行的所有内容都有此共同点(无论是像“ ls”这样的单个命令,还是包含命令,迭代器和条件语句的脚本文件):所有这些都由命令行解释器处理;是Bash,C-Shell,K-Shell(在AIX btw上默认)。
要了解我的意思,请创建目录“ test”:
mkdir test
输入它并运行以下命令
grep hello *
您将得到某种响应,例如“无此文件或目录”。现在输入命令
echo $?
($?说,告诉我您在秘密计算机中发现的内容。)您应该看到它返回一个数字(应该是)“ 2”。那是grep的返回码,表示“没有这样的文件或目录”。现在运行以下命令:
echo hello > hello.txt
grep hello *
echo $?
您将看到初始grep命令返回的文件“ hello.txt”,现在应该看到“ echo $?”。返回数字“ 0”,表示它实际上找到了一些东西。
即使运行了这些看似一次性的命令,命令行解释器的行为仍像它们是较大程序的一部分,并跟踪其返回值。这就是为什么如果您忘记了grep命令末尾的*,它不会返回的原因。知道该语句是不完整的,并且需要更多输入。毕竟,可以想像的是,您可能会要求它grep某个循环的结果,该循环在命令行上编写和运行是完全合法的。
底线是外壳,就是外壳,而解释器(无论您使用的是哪个名称,“ Bash”,k-shell等)都不同。但是通常它们可以互换使用,因为在任何给定的瞬间它们都被完全绑在一起。
Shell是基于文本的用户界面。
Bash是一种Shell。
bash
是shell
家族的一员,但还有很多其他炮弹。
例如,在Minix3上有ash
外壳,它不支持像这样的关联数组bash4
。
该POSIX标准是企图使型动物壳和操作系统之间的可移植的API。
参见http://en.wikipedia.org/wiki/Unix_shell#Bourne_shell_compatible