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

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

===============>>#1 票数:122

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

  • BASH更容易设置显示当前目录的提示。 在Kornshell中做同样的事情是hackish。
  • Kornshell有关联数组,BASH没有。 现在,我最后一次使用关联数组是......让我想想......从来没有。
  • Kornshell处理循环语法更好一些。 您通常可以在Kornshell循环中设置一个值,并在循环后使其可用。
  • Bash处理以更清洁的方式从管道获取退出代码。
  • Kornshell的print命令比echo命令更好。
  • Bash有标签完成。 在旧版本中
  • Kornshell有r history命令,可以让我快速重新运行旧命令。
  • 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现在只是选择的外壳,所以如果你必须学习一些东西,那么也可以选择流行的东西。

===============>>#2 票数:46 已采纳

击。

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

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

===============>>#3 票数: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

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

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

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

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

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

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

===============>>#4 票数:5

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

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

===============>>#5 票数:4

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

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

===============>>#6 票数:4

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

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

===============>>#7 票数:3

@foxxtrot

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

===============>>#8 票数:3

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

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

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

===============>>#9 票数:2

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

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

===============>>#10 票数:2

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

Z shell将ksh独特的功能与bash提供的好东西结合在一起,加上更多的东西。

===============>>#11 票数:-1

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

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

===============>>#12 票数:-2

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

  ask by user13158 translate from so

未解决问题?本站智能推荐:

2回复

错误:Bash / ksh程序中意外出现“主目录/文件”

在if子句中显示错误: 我不知道出什么问题了,这是KornShell(ksh)脚本。
2回复

korn和bash shell之间的区别[关闭]

我是Unix新手。 目前,我被要求了解KornShell(ksh)和Bash shell 。 有人可以给我一个关于这两个的简短概述吗? 术语“ shell ”是“ 终端 ”的同义词吗? 我知道我可以在线阅读有关这两个文件。 但我相信经验丰富的Unix程序员的概述将帮助我更好地理
2回复

执行KornShell(ksh)

任何人都有以下想法: 任何人都可以解释一下它的含义及其作用吗? 我想知道为什么脚本中使用了最后三个单词? 会做什么? 提前致谢。
1回复

KornShell(ksh)中的通配符

当我在主目录中并在终端中键入“ ls * s *”时,它会显示所有名称中带有“ s”的文件夹和文件(例如,音乐)。 但是,当我键入“ ls * si *”时,它什么也没有显示(我认为应该列出“音乐”)。 这是为什么?
1回复

退出所有称为KornShell(ksh)的脚本

KornShell(ksh)脚本如何退出/杀死从另一个ksh脚本启动的所有进程? 如果scriptA.ksh调用scriptB.ksh,则以下代码可以运行良好,但是有更好的解决方案吗?: scriptA.ksh: scriptB.ksh: 为了增加复杂性,如果scri
3回复

KornShell(ksh)有Do ... While循环吗?

我在我的KornShell(ksh)脚本中有一个循环,我想要至少执行一次,我想要一种优雅的方式来做,但是当我发现很多关于如何编写while循环的东西时,似乎没有做任何事情......在那里循环。 我正在做的是从配置文件中读取逗号分隔的文件列表并处理它们。 如果文件列表为空,那么我想处理目
2回复

KornShell(ksh)代码用mailx和uuencode发送附件?

我需要附上一个mailx文件,但目前我没有成功。 这是我的代码: 任何反馈都将受到高度赞赏。 更新我已添加附件var以避免每次都必须使用该路径。
2回复

使用“ -ne”和“!=”来评估KornShell(ksh)中的退出代码有什么区别?

以下两个KornShell(ksh)代码段之间的区别是什么,因为到目前为止它们在测试期间的行为都完全相同? 如果重要,则返回代码(例如,退出代码,返回状态,退出状态,returnCode)来自SQL * Plus命令。 kornShellSnippet1.ksh kornShel
2回复

通过KornShell(ksh)跳过以'#'开头的文本文件中的行

我正在尝试编写一个脚本,该脚本读取一个文本文件并将每一行保存为一个字符串。 我还希望脚本跳过以哈希符号开头的任何行。 有什么建议么?
1回复

KornShell(ksh)脚本命令中的转义字符,文字引号和变量

KornShell(ksh)的全新产品。 我有一个绝对痛苦且希望很简单的问题。 我需要使用包含单引号和变量的字符串参数运行脚本。 在外壳中,它看起来像这样: 那很好。 但是,一旦我尝试在带有日期变量的脚本中运行它,就无法产生这些单引号。 我已经毫无问题地设置了“今天的日