it-swarm.cn

Bash或KornShell(ksh)?

我不是* nix的新手,不过最近我在Prompt上花了很多时间。我的问题是使用KornShell(ksh)或Bash Shell有什么好处?使用其中一个的陷阱在哪里?

希望从用户的角度理解,而不是纯粹的脚本。

59
user13158

击。

各种UNIX和Linux实现具有各种不同的ksh源代码级实现,其中一些是真正的ksh,其中一些是pdksh实现,其中一些只是具有“ksh”个性的其他Shell的符号链接。这可能导致执行行为的奇怪差异。

至少使用bash,你可以确定它是一个单一的代码库,你需要担心的是安装了什么(通常是最小的)bash版本。在几乎所有现代(而不是那么现代)的UNIX上完成了大量的脚本编写,对bash的编程在我的经验中更加可靠。

46
j.e.hahn

Kornshell和Bash之间的区别很小。一方面有一定优势,但差别很小:

  • BASH更容易设置显示当前目录的提示。在Kornshell中做同样的事情是hackish。
  • Kornshell有关联数组,BASH没有。现在,我最后一次使用关联数组是......让我想想......从来没有。
  • Kornshell处理循环语法更好一些。您通常可以在Kornshell循环中设置一个值,并在循环后使其可用。
  • Bash处理以更清洁的方式从管道获取退出代码。
  • Kornshell有print命令,它比echo命令更好。
  • Bash有标签完成。在旧版本中
  • Kornshell具有r历史命令,允许我快速重新运行旧命令。
  • Kornshell的语法为cd old new,它将old替换为目录中的new,并替换那里的CD。当你在一个名为/foo/bar/barfoo/one/bar/bar/foo/bar的目录中并且你需要cd到/foo/bar/barfoo/two/bar/bar/foo/bar时很方便。在Kornshell中,你可以简单地执行cd one two并完成它。在BASH中,你必须cd ../../../../../two/bar/bar/foo/bar

我是一个古老的Kornshell人,因为我在20世纪90年代学习了Unix,那时候就是壳牌。我可以使用Bash,但我有时会对它感到沮丧,因为在习惯中我使用Kornshell的一些小功能,BASH没有,它不起作用。因此,只要有可能,我将Kornshell设置为默认值。

但是,我要告诉你学习BASH。 Bash现在已经在大多数Unix系统和Linux上实现,并且有更多的资源可用于学习BASH并获得帮助而不是Kornshell。如果您需要在BASH中做一些异国情调,您可以继续使用Stackoverflow,发布您的问题,您将在几分钟内得到十几个答案 - 其中一些甚至是正确的!.

如果你有一个Kornshell问题并将其发布在Stackoverflow上,你将不得不等待一些过去他们的主要黑客过去,就像我在你得到答案之前从午睡中醒来。并且,如果他们当天在老年人的家中供应布丁,那就忘记得到任何回应。

BASH现在只是壳牌的选择,所以如果你必须学习一些东西,那么也可以选择流行的东西。

122
David W.

我是一名科恩 - 贝壳老将,所以我知道我是从这个角度说话的。

但是,我对Bourne Shell,ksh88和ksh93感到满意,并且我知道哪些功能受支持。 (我应该在这里跳过ksh88,因为它不再广泛分发。)

如需交互式使用,请根据您的需要选择。实验。我喜欢能够使用相同的Shell进行交互式使用和编程。

我从SVR2上的ksh88到tcsh,到ksh88Sun(增加了重要的国际化支持)和ksh93。我试过bash,并讨厌它,因为它压倒了我的历史。然后我发现了shopt -s lithist,一切都很顺利。 (lithist选项确保在命令历史记录中保留换行符。)

对于Shell编程,如果你想要一致的编程语言,良好的POSIX一致性和良好的性能,我会认真推荐使用ksh93,因为许多常见的unix命令可以作为内置函数使用。

如果你想要便携性至少使用两者。并确保你有一个很好的测试套件。

炮弹之间有许多细微的差别。考虑例如从管道读取:

b=42 && echo one two three four |
    read a b junk && echo $b

这将在不同的壳中产生不同的结果。 korn-Shell从后到前运行管道;管道中的最后一个元素在当前进程中运行。在v4.x之前,Bash不支持这种有用的行为,即使这样,它也不是默认的。

另一个说明一致性的示例:echo命令本身,由于BSD和SYSV unix之间的拆分而过时,并且每个都引入了自己不打印换行符(以及其他行为)的约定。在许多“配置”脚本中仍然可以看到这样的结果。

Ksh采取了一种激进的方法 - 并引入了print命令,该命令实际上支持两种方法(来自BSD的-n选项,以及来自SYSV的尾随\c特殊字符)

但是,对于严肃的系统编程,我推荐的不是Shell,比如python,Perl。或者更进一步,使用像puppet这样的平台 - 它允许您通过良好的审计来观察和纠正整个系统集群的状态。

壳牌编程就像在未知的水域游泳,或者更糟。

任何语言的编程都需要熟悉它的语法,接口和行为。 Shell编程没有任何不同。

28
Henk Langeveld

这是一场Unix与Linux之争。大多数(如果不是所有)Linux发行版都安装了bash并且ksh是可选的。大多数Unix系统,如Solaris,AIX和HPUX都默认使用ksh。

我个人总是使用ksh,我喜欢vi完成,而且我几乎都在使用Solaris。

4
Kristian

对于脚本,我总是使用 ksh 因为它平滑了 gotchas

但我发现 bash 更适合交互式使用。对我来说, emacs 键绑定和选项卡完成是主要的好处。但这主要是习惯的力量,而不是 ksh 的任何技术问题。

4
Jon Ericson

我没有使用ksh的经验,但我使用了bash和zsh。我更喜欢zsh而不是bash,因为它支持非常强大的文件通配,可变扩展修饰符和更快的标签完成。

这是一个快速介绍: http://friedcpu.wordpress.com/2007/07/24/zsh-the-last-Shell-youll-ever-need/

4
Chris AtLee

我的回答是“选择一个并学习如何使用它”。他们都是不错的贝壳​​; bash可能有更多的花里胡哨,但它们都有你想要的基本功能。 bash现在更普遍可用。如果你一直在使用Linux,那就坚持下去吧。

如果你正在进行编程,那么试图坚持使用简单的“sh”来实现可移植性是一种很好的做法,但是随着现在广泛使用bash,这些建议可能有点过时了。

了解如何使用完成和Shell历史记录;偶尔阅读联机帮助页并尝试学习一些新内容。

3
Incident

@foxxtrot

实际上,标准Shell是Bourne Shell(sh)。 Linux上的/bin/sh实际上是bash,但是如果你的目标是跨平台脚本,那么你最好坚持使用原始Bourne Shell的功能或者像Perl这样编写它。

3
Hank Gay

首先,bash有标签完成。仅此一点就足以让我更喜欢它而不是ksh。

Z Shell 将ksh的独特功能与bash提供的Nice功能完美结合,再加上更多的东西。

2
Allen

在大多数UNIX系统中都可用,ksh是标准的,设计清晰,全面。我认为书籍,帮助ksh足够清晰,尤其是O'Reilly的书。 Bash是一个群众。我保留它作为root登录Shell for Linux仅在家里。

对于交互式使用,我更喜欢Linux/UNIX上的zsh。我在zsh中运行脚本,但我会在AIX ksh中测试我的大部分脚本和函数。

2
MeaCulpa