Bash或KornShell(ksh)?

时间:2008-09-16 17:32:30

标签: bash shell unix scripting ksh

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

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

12 个答案:

答案 0 :(得分:122)

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现在只是选择的外壳,所以如果你必须学习一些东西,那么也可以选择流行的东西。

答案 1 :(得分:46)

击。

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

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

答案 2 :(得分:28)

我是个角色老手,所以我知道我从那个角度说话。

但是,我对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

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

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

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

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

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

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

答案 3 :(得分:4)

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

以下是快速介绍:http://friedcpu.wordpress.com/2007/07/24/zsh-the-last-shell-youll-ever-need/

答案 4 :(得分:4)

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

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

答案 5 :(得分:4)

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

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

答案 6 :(得分:3)

@foxxtrot

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

答案 7 :(得分:3)

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

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

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

答案 8 :(得分:2)

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

Z shell结合了ksh的独特功能和bash提供的好东西,以及更多的东西。

答案 9 :(得分:2)

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

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

答案 10 :(得分:-1)

Bash是基准,但这主要是因为你可以合理地确定它安装在每个* nix上。如果您计划分发脚本,请使用Bash。

遗憾的是,我无法真正解决shell之间的实际编程差异。

答案 11 :(得分:-2)

Bash 是Linux的标准 我的经验是,为bash找到帮助比使用ksh或csh更容易。

相关问题