我不是*nix的新手,但最近我花了很多时间在命令提示符下。我的问题是使用KornShell(ksh)或Bash Shell有什么优势?其中一个与另一个相比有什么缺点?
我想从用户的角度来理解,而不仅仅是脚本编写。
Kornshell和Bash之间的差别很小。它们各自有一些优势,但是差异非常微小:
print
命令,该命令比echo
命令更好。r
历史命令,允许我快速重新运行以前的命令。cd old new
,它将old
替换为new
并切换到那里。当你在一个名为/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并使用这种Shell。我也可以使用Bash,但有时候会因为我习惯使用Kornshell拥有但BASH没有的一些小功能而感到沮丧。所以,只要可能,我就将Kornshell设置为我的默认Shell。
然而,我建议你学习BASH。在大多数Unix系统和Linux上都已经实现了BASH,并且有更多的资源可用于学习BASH和获取帮助,相对于Kornshell而言。如果你需要在BASH中完成一些奇特的事情,你可以去Stackoverflow发布问题,几分钟内就能得到十几个答案,其中一些甚至是正确的。
如果你有一个Kornshell的问题并在Stackoverflow上发布它,你必须等待某个老年人像我一样从午睡中醒来才能得到答案。如果当天老人院里提供布丁,那么别指望能得到任何回应。
BASH现在是首选的shell,如果你必须学习的话,最好选择流行的东西。
Bash。
不同的UNIX和Linux实现有各种不同的ksh源级别实现,其中一些是真正的ksh,一些是pdksh实现,还有一些只是指向具有“ksh”性格的其他shell的符号链接。 这可能会导致执行行为上的奇怪差异。
至少使用bash,您可以确信它是单一代码库,您所担心的就是安装了什么(通常是最低)版本的bash。在几乎所有现代(和不太现代)的UNIX上进行大量脚本编程后,根据我的经验,使用bash进行编程更加可靠和一致。
awk
用于文本处理;原生支持浮点数运算;namevars和关联数组即使在不运行最新版本的系统上也可以使用等等。 - Charles Duffy我是一名Korn Shell老手,所以我的观点都基于这个角度。
但是,我也熟悉Bourne shell、ksh88和ksh93,并且大多数情况下我知道哪些功能在哪个壳中受支持。(我应该跳过ksh88,因为它已经不再广泛分发了。)
对于交互式使用,请根据您的需要选择合适的内容。尝试一下。我喜欢能够同时用同一个shell进行交互和编程。
我从SVR2上的ksh88转到tcsh,再到ksh88sun(增加了重要的国际化支持)和ksh93。我尝试了bash,因为它扁平化了我的历史记录而讨厌它。然后我发现了shopt -s lithist
,一切都很好。
(lithist
选项确保在命令历史记录中保留换行符。)
对于shell编程,如果您想要一个一致的编程语言、良好的POSIX兼容性和良好的性能,则强烈推荐使用ksh93,因为许多常见unix命令可以作为内置函数可用。
如果您想要可移植性,请至少使用两者。并确保您拥有良好的测试套件。
不同shell之间存在许多微妙的差异。例如考虑从管道中读取:
b=42 && echo one two three four |
read a b junk && echo $b
这会在不同的shell中产生不同的结果。Korn-shell从后往前运行管道,管道中的最后一个元素在当前进程中运行。Bash直到v4.x才支持这种有用的行为,即使如此,它也不是默认行为。lastpipe
选项。 - Charles Duffy这是一场Unix与Linux之间的争论。大多数Linux发行版都已安装了bash,而ksh则是可选的。而大多数Unix系统(如Solaris、AIX和HPUX)则默认使用ksh。
个人而言,我总是使用ksh,我喜欢vi自动补全功能,并且几乎将Solaris用于所有事情。
set -o vi
命令,并将其添加到你的~/.bashrc
文件中以使其持久化。这就是我自己的设置方式。 - Wildcard对于脚本,我总是使用ksh,因为它可以平滑处理一些问题。
但是我发现对于交互式使用,bash更加舒适。对我来说,emacs键绑定和标签自动完成是主要的优点。但这主要是习惯力量,而不是ksh的任何技术问题。
首先,Bash具有Tab键自动补全功能。仅凭这一点就足以使我更喜欢Bash而非Ksh。
Z shell很好地结合了Ksh的独特特性和Bash提供的优点,还有更多的功能。
@foxxtrot
实际上,标准的shell是Bourne shell(sh
)。在Linux上,/bin/sh
实际上是bash
,但如果你想编写跨平台脚本,最好坚持使用原始Bourne shell的功能或者使用像perl
这样的语言编写脚本。
/bin/sh
实际上是dash
,即Debian Almquist shell。当人们使用“有效”的bash命令被#!/bin/sh
拒绝时,这会让很多人感到惊讶。 - thom大多数UNIX系统都提供ksh,它符合标准、设计清晰、功能全面。我认为关于ksh的书籍和帮助已经足够清晰明了,特别是O'Reilly出版的书籍。
Bash很臃肿。我只在家里的Linux系统中将其作为root登录shell。
对于交互式使用,我更喜欢在Linux/UNIX上使用zsh。我会在zsh中运行脚本,但我会在AIX ksh中测试大部分脚本和函数。
$ cd ${PWD/foo/bar}
,但这有点长,不太方便输入。 - David W.!vi
将执行以字母'vi'开头的最后一个运行命令。如果您不确定该命令是否是您想要的,请使用!vi:p
打印出该命令并将其添加到您的历史记录列表中,但不会实际运行它。然后,如果它确实是您想要的,只需按上箭头回车或者直接使用!!
来运行它即可。请参阅man bash
并搜索HISTORY EXPANSION
。 - Wildcard