我不是*nix的新手,不过最近我在提示时花了很多时间.我的问题是使用KornShell(ksh)或Bash Shell有什么好处?使用其中一个的陷阱在哪里?
希望从用户的角度理解,而不是纯粹的脚本.
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
In 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
命令,它实际上支持两种方法(-n
来自BSD 的选项,以及\c
来自SYSV 的尾随特殊字符)
但是,对于严肃的系统编程,我推荐的不是shell,比如python,perl.或者更进一步,使用像puppet这样的平台 - 它允许您通过良好的审计来观察和纠正整个系统集群的状态.
壳牌编程就像在未知的水域游泳,或者更糟.
任何语言的编程都需要熟悉它的语法,接口和行为.Shell编程没有任何不同.
这有点像Unix vs Linux之战。大多数(如果不是全部)Linux发行版都安装了bash,ksh是可选的。大多数Unix系统(例如Solaris,AIX和HPUX)将ksh作为默认设置。
就我个人而言,我总是使用ksh,我喜欢vi补全,并且几乎所有东西都使用Solaris。