67

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

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

4

12 回答 12

135

Kornshell 和 Bash 之间的差异很小。一个比另一个有一定的优势,但差异很小:

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

我是一个老 Kornshell 人,因为我在 1990 年代学习了 Unix,而那是当时选择的 shell。我可以使用 Bash,但有时我会对此感到沮丧,因为习惯上我会使用 Kornshell 具有的一些小功能,而 BASH 没有而且它不起作用。因此,只要有可能,我都会将 Kornshell 设置为我的默认值。

但是,我要告诉你学习 BASH。Bash 现在在大多数 Unix 系统和 Linux 上都实现了,而且有比 Kornshell 更多的资源可用于学习 BASH 和获得帮助。如果你需要在 BASH 中做一些奇特的事情,你可以继续 Stackoverflow,发布你的问题,几分钟内你就会得到十几个答案——其中一些甚至是正确的!

如果您有 Kornshell 问题并将其发布在 Stackoverflow 上,您将不得不等待像我这样的资深黑客从午睡中醒来,然后才能得到答案。而且,如果那天他们在敬老院里提供布丁,请忘记得到任何回应。

BASH 只是现在的首选外壳,所以如果你必须学习一些东西,不妨选择流行的东西。

于 2011-08-08T16:53:12.023 回答
48

重击。

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

至少对于 bash,您可以确定它是一个单一的代码库,您所需要担心的只是安装了 bash 的(通常是最低的)版本。在几乎所有现代(和不那么现代)的 UNIX 上编写了大量脚本后,根据我的经验,对 bash 的编程更加可靠一致。

于 2008-09-16T20:43:39.890 回答
35

我是一名 korn-shell 资深人士,所以要知道我是从这个角度说话的。

但是,我一直对 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 从后到前运行管道;管道中的最后一个元素在当前进程中运行。Bash 直到 v4.x 才支持这种有用的行为,即便如此,它也不是默认的。

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

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

但是,对于严肃的系统编程,我建议使用 shell 以外的东西,例如 python、perl。或者更进一步,使用像 puppet 这样的平台 - 它允许您通过良好的审计来观察和纠正整个系统集群的状态。

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

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

于 2011-04-02T20:24:45.097 回答
7

这有点像 Unix 与 Linux 的战斗。大多数(如果不是全部)Linux 发行版都安装了 bash 并且 ksh 是可选的。大多数 Unix 系统,如 Solaris、AIX 和 HPUX,都默认使用 ksh。

就我个人而言,我总是使用 ksh,我喜欢 vi 完成,而且我几乎使用 Solaris 来完成所有事情。

于 2008-09-16T17:59:04.140 回答
5

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

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

于 2008-09-16T17:46:34.450 回答
5

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

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

于 2008-09-16T20:39:17.187 回答
4

一方面,bash 具有制表符补全功能。仅此一项就足以让我更喜欢它而不是 ksh。

Z shell将 ksh 的独特功能与 bash 提供的好东西很好地结合在一起,此外还有更多的东西。

于 2008-09-16T17:35:27.817 回答
3

@foxxtrot

实际上,标准 shell 是 Bourne shell ( sh)。/bin/sh在 Linux 上实际上是bash.,但如果您的目标是跨平台脚本,您最好坚持原始 Bourne shell 的功能或将其编写为perl.

于 2008-09-16T17:41:01.500 回答
3

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

如果您正在编程,尝试坚持简单的 'sh' 以实现可移植性是一种很好的做法,但是随着 bash 的普及,这些天来,一些建议可能有点过时了。

学习如何使用完成和你的 shell 历史;偶尔阅读手册页并尝试学习一些新东西。

于 2008-09-16T17:56:18.233 回答
2

ksh 在大多数 UNIX 系统中都可用,它符合标准、设计清晰、功能完善。我认为书籍,ksh 中的帮助已经足够清晰,尤其是 O'Reilly 的书。Bash 是一个群众。我只在家里将它作为 Linux 的 root 登录 shell。

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

于 2011-09-02T04:39:23.033 回答
-1

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

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

于 2008-09-16T17:35:00.670 回答
-2

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

于 2008-09-16T18:05:04.313 回答