Bash或KornShell(ksh)?

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

从用户的angular度来看待理解,而不是单纯的脚本。

击。

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

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

Kornshell和Bash的区别很小。 其中一个有一些优势,但差异很小:

  • BASH更容易设置显示当前目录的提示。 在Kornshell中做同样的事情是很危险的。
  • Kornshell有关联数组,BASH没有。 现在,我最后一次使用关联数组是…让我想…从来没有。
  • Kornshell更好地处理循环语法。 您通常可以在Kornshell循环中设置一个值,并在循环之后使用它。
  • Bash以更清晰的方式处理从pipe道获取退出代码。
  • Kornshell的print命令比echo命令要好。
  • Bash有标签完成。 在旧版本中
  • Kornshell有历史命令,可以让我快速重新运行旧的命令。
  • Kornshell的语法是cd old new ,在你的目录和CD上new 。 当你在一个名为/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的家伙,因为我在90年代学习了Unix,那是当时的select。 我可以使用Bash,但有时我会因此而感到沮丧,因为在习惯上,我使用了Kornshell的一些小function,而BASH并没有这样做,而且这种function不起作用。 所以,只要有可能,我把Kornshell设置为默认值。

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

如果你有一个Kornshell的问题,并把它发布在Stackoverflow上,你将不得不等待一些像我一样的老黑客从睡梦中醒来,然后才能得到答案。 而且,如果他们当天正在老年人家里做布丁,就不要回复。

BASH只是现在的select,所以如果你需要学习一些东西,不妨跟随stream行。

我是一个古怪的老兵,所以我知道我从这个angular度来讲。

不过,我对Bourne shell,ksh88和ksh93感到满意,而且我知道哪些function支持哪些function。

为了交互使用,采取任何适合您的需求。 实验。 我喜欢能够使用相同的shell进行交互式使用和编程。

我从SVR2上的ksh88到tcsh,到ksh88sun和ksh93。 我试了一下,讨厌它,因为它平平了我的历史。 然后我发现

 shopt -s lithist 

一切都很好。 (lithist选项确保换行符保存在您的命令历史logging中。)

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

如果你想要便携性使用至less两个。 并确保你有一个好的testing套件。

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

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

这将在不同的炮弹中产生不同的结果。 korn-shell从后到前运行pipe道; pipe道中的最后一个元素在当前进程中运行。

说明一致性的另一个例子是: echo命令本身被BSD和SYSV unix之间的分裂所淘汰,并且每个都引入了自己的约定,不打印换行符(和其他行为)。 这个结果仍然可以在很多'configure'脚本中看到。

Ksh采取了一个激进的方法 – 引入了print命令,它实际上支持这两种方法(BSD中的-n选项和SYSV后面的\c特殊字符)

但是,对于严重的系统编程,我会推荐一些不同于shell的东西,比如python,perl。 或者更进一步,使用一个像木偶一样的平台 – 这使您可以观察和纠正整个系统集群的状态,并具有良好的审计。

壳牌编程就像在未知的水域中游泳,用坏的地图来启动。

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

别忘了zsh

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

就个人而言,我总是使用ksh,我喜欢vi完成,我几乎所有的东西都使用Solaris。

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

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

@foxxtrot

实际上,标准shell是Bourne shell( sh )。 Linux上的/bin/sh实际上就是bash ,但是如果你想要跨平台的脚本,最好是坚持使用原来的Bourne shell的特性,或者写成类似perl东西。

我没有使用ksh的经验,但是我使用了bash和zsh。 我更喜欢zsh over bash,因为它支持非常强大的文件匹配,variables扩展修饰符和更快的标签填充。

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

我的答案是“挑一个,学习如何使用它”。 他们都是体面的贝壳; bash可能有更多的花里胡哨的,但他们都有你想要的基本function。 bash现在更普遍可用。 如果你一直在使用Linux,只要坚持下去。

如果你正在编程,试图坚持简单的'sh'可移植性是一个很好的做法,但是随着bash如今广泛的使用,那么一些build议可能有些过时。

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

在大多数UNIX系统中都可用,ksh是标准兼容的,devise清晰,全面。 我认为在ksh中帮助书籍已经足够清楚了,特别是O'Reilly的书。 Bash是一个群众。 我只把它作为Linux的rootloginshell。

为了交互使用,我更喜欢Linux / UNIX上的zsh。 我在zsh中运行脚本,但是我将在AIX ksh中testing大部分脚本,函数。

一方面,bash有tab完成。 这一点足以让我比KSH更喜欢它。

Z shell具有ksh的独特function与bash提供的好东西的完美结合,再加上更多的东西。

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

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

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