我不是* nix的新手,不过最近我在提示时花了很多时间。 我的问题是使用KornShell(ksh)或Bash Shell有什么好处? 使用其中一个的陷阱在哪里?
希望从用户的角度理解,而不是纯粹的脚本。
Kornshell和Bash之间的区别很小。 一方面有一定优势,但差别很小:
print
命令比echo
命令更好。 r
history命令,可以让我快速重新运行旧命令。 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现在只是选择的外壳,所以如果你必须学习一些东西,那么也可以选择流行的东西。
击。
各种UNIX和Linux实现具有各种不同的ksh源代码级实现,其中一些是真正的ksh,其中一些是pdksh实现,其中一些只是具有“ksh”个性的其他shell的符号链接。 这可能导致执行行为的奇怪差异。
至少使用bash,你可以确定它是一个单一的代码库,你需要担心的是安装了什么(通常是最小的)bash版本。 在几乎所有现代(而不是那么现代)的UNIX上完成了大量的脚本编写,对bash的编程在我的经验中更加可靠。
我是个角色老手,所以我知道我从那个角度说话。
但是,我对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编程没有任何不同。
这是一场Unix与Linux之争。 大多数(如果不是所有)Linux发行版都安装了bash并且ksh是可选的。 大多数Unix系统,如Solaris,AIX和HPUX都默认使用ksh。
我个人总是使用ksh,我喜欢vi完成,而且我几乎都在使用Solaris。
我没有使用ksh的经验,但我使用了bash和zsh。 我更喜欢zsh而不是bash,因为它支持非常强大的文件通配,可变扩展修饰符和更快的标签完成。
这是一个快速介绍: http : //friedcpu.wordpress.com/2007/07/24/zsh-the-last-shell-youll-ever-need/
对于脚本,我总是使用ksh,因为它平滑了陷阱 。
但我发现bash对于交互式使用更加舒适。 对我来说, emacs键绑定和选项卡完成是主要的好处。 但这主要是习惯的力量,而不是ksh的任何技术问题。
@foxxtrot
实际上,标准shell是Bourne shell( sh
)。 Linux上的/bin/sh
实际上是bash
,但是如果你的目标是跨平台脚本,那么你最好坚持使用原始Bourne shell的功能或者用perl
这样的东西编写它。
我的回答是“选择一个并学习如何使用它”。 他们都是不错的贝壳; bash可能有更多的花里胡哨,但它们都有你想要的基本功能。 bash现在更普遍可用。 如果你一直在使用Linux,那就坚持下去吧。
如果你正在进行编程,那么试图坚持使用简单的“sh”来实现可移植性是一种很好的做法,但是随着现在广泛使用bash,这些建议可能有点过时了。
了解如何使用完成和shell历史记录; 偶尔阅读联机帮助页并尝试学习一些新内容。
在大多数UNIX系统中都可用,ksh是标准的,设计清晰,全面。 我认为书籍,帮助ksh足够清晰,尤其是O'Reilly的书。 Bash是一个群众。 我将它作为Linux的root登录shell保留在家中。
对于交互式使用,我更喜欢Linux / UNIX上的zsh。 我在zsh中运行脚本,但我会在AIX ksh中测试我的大部分脚本和函数。
首先,bash有标签完成。 仅此一点就足以让我更喜欢它而不是ksh。
Z shell将ksh独特的功能与bash提供的好东西结合在一起,加上更多的东西。
Bash是基准,但这主要是因为你可以合理地确定它安装在每个* nix上。 如果您计划分发脚本,请使用Bash。
遗憾的是,我无法真正解决shell之间的实际编程差异。
Bash是Linux的标准。
我的经验是,为bash找到帮助比使用ksh或csh更容易。