我对 *nix 并不陌生,但是最近我花了很多时间在提示符上。我的问题是使用 KornShell (ksh) 或 Bash Shell 的优点是什么?使用其中一种相对于另一种的陷阱在哪里?

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

有帮助吗?

解决方案

猛击。

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

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

其他提示

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

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

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

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

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

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

我是一名玉米壳老手,所以要知道我是从这个角度说话的。

不过,我对 Bourne shell、ksh88 和 ksh93 很满意,而且我最了解哪些功能受支持。(我应该在这里跳过 ksh88,因为它不再广泛分布。)

对于交互式使用,请选择适合您需要的任何内容。实验。我喜欢能够使用相同的 shell 进行交互使用和编程。

我从 SVR2 上的 ksh88 转到 tcsh、ksh88sun(增加了重要的国际化支持)和 ksh93。我尝试了bash,并讨厌它,因为它使我的历史变平。然后我发现 shopt -s lithist 一切都很好。(这 lithist 选项确保在您的命令历史记录中保存新线。)

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

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

shell 之间存在许多细微的差异。例如,考虑从管道读取:

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 的选项,以及尾随的 \c SYSV 中的特殊字符)

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

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

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

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

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

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

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

对于脚本,我总是使用 克什 因为它平滑了 陷阱.

但我发现 巴什 交互使用更舒适。对我来说 emacs 键绑定和选项卡补全是主要的好处。但这主要是习惯的力量,而不是任何技术问题 克什.

@foxxtrot

实际上,标准 shell 是 Bourne shell (sh). /bin/sh 在Linux上实际上是 bash, ,但是如果您的目标是跨平台脚本,那么最好坚持原始 Bourne shell 的功能或用类似的方式编写它 perl.

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

如果您正在编程,尝试坚持使用简单的“sh”以实现可移植性是一个很好的做法,但是随着 bash 如今的广泛使用,这些建议可能有点过时了。

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

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

Z壳 很好地结合了 ksh 的独特功能和 bash 提供的好东西,此外还有更多的东西。

ksh 可在大多数 UNIX 系统中使用,它符合标准、设计清晰且全面。我认为 books,helps in ksh 已经足够而且清楚了,尤其是 O'Reilly 的书。Bash 是一个大众。我只将其保留为家用 Linux 的 root 登录 shell。

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

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top