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更容易。