我不是* nix的新手,不过最近我在提示上花了很多时间。我的问题是使用KornShell(ksh)或Bash Shell有什么好处?使用其中一个的陷阱在哪里?
希望从用户的角度理解,而不是纯粹编写脚本。
答案 0 :(得分:122)
Kornshell和Bash之间的区别很小。一方面有一些优势,但差别很小:
print
命令比echo
命令好。r
历史记录命令,可以让我快速重新运行旧命令。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更容易。