我使用 Bash 已经有一段时间了。我现在想至少学习一种其他 shell,所以我一直在学习 Korn Shell。然而,看起来 Ksh 已经有近二十年没有重大更新了,而且我读到 Zsh 合并了其中的功能。我一直在 StackExchange 网络上阅读许多 shell 比较问题,但没有找到答案:是否存在 Zsh 未包含的 Korn Shell 功能?如果有,它们是什么?
答案1
据此,ksh 唯一具有而 zsh 没有的功能是命名参数对于用户定义的“类型”。可能还有其他的,因为该文章并不是详尽的列表,特别是对于晦涩的功能。
从另一个方向来看,你的问题的答案可以写满一本书(可能这个)。
Zsh 有许多 ksh 没有的功能。一些受欢迎的有命令栈,目录栈,历史分享和提示。
- 命令栈是当您键入命令并且您意识到应该先运行另一个命令时。只需将当前行发送到命令堆栈,运行其他命令,然后将命令从堆栈中弹出。您可以多次执行此操作。 (zsh 是我所知道的唯一提供此功能的 shell)。
- 目录栈(又名
pushd
/popd
)是当您想要连续更改目录,然后按相反顺序 cd 返回时。 (许多 shell 都提供此功能,包括 bash)。 - 历史分享每个开放的外壳都有一个共同的历史。在一个窗口中执行命令,切换到另一个窗口,该命令将在您的历史记录中可用。
- 提示就像你的提示一样,只不过它是正确的。很多人喜欢把
cwd
or放在date
中rprompt
。
以下是 Stack Exchange 站点上有关 zsh 的一些讨论:
答案2
ksh88,最著名的变体,因为它包含在 SVR4 中,该语言bash
主要基于部分克隆的 pdksh,其子集是 POSIX 规范的基础,但sh
尚未发展太多(除了一些错误修复和 POSIX 对齐之外)自 1993 年 5 月最后一次发布 (ksh88i) 以来,某些供应商一直在使用该版本。
然而,由 David Korn 重写的 ksh93 于 1993 年 12 月首次发布,直到 2014 年左右才开始积极开发,其源代码为释放了2000 年。最后一个正式版本 ksh93u+ 于 2012 年 8 月发布(仅在您提出该问题几周后),原作者在发布后于 2014 年发布了一个“测试版”版本 (ksh93v-) AT&T 冗余,具有许多新功能。
社区一直致力于基于 ksh93v 进行开发并使代码现代化,这导致了 ksh2020,但是这项努力现已被放弃。 A单独努力维护 ksh93u+之后似乎又走同样的路。虽然一个新的(ksh93u+m)目前看起来更有希望一些。
ksh93 不仅仅是一个 shell。它是与一组重复使用一些相同代码的实用程序一起开发的,并且可以内置在 ksh93 中,有点像 busybox。
请注意,这更多的是研究努力,通常被认为是实验性的,并且记录很少。
虽然zsh
ksh93 首先被开发为一个功能强大的交互式 shell,但 ksh93 的重点更多地是作为一种编程语言。人们在语言和优化方面付出了很多努力,目标是成为类似的perl
类别python
。
ksh93 有很多特性是 zsh 没有的,就像 zsh 有很多特性 ksh93 没有一样,而且两者都互相借用了特性。它们有很多共同的功能,并且两者都可以做一些事情,但方式却截然不同。
ksh93 有但 zsh 没有的功能包括:
- ast-open 的所有内置函数:
ksh93
当作为 ast-open 的一部分构建时,有许多 zsh 没有的内置函数,包括一些标准实用程序的改进版本,例如date
,join
,head
,tr
,uniq
,wc
... (尽管 zsh 有一些其内置函数或语言特性中的功能)。这就是优化事情的一面。perl
如果你需要分叉一个进程来做任何事情,你就不能像这样。 - 非分叉命令替换 (
$(...)
) 和不创建子 shell 环境的命令替换${ ...; }
。 - 多维数组:
a=((a b) (c d))
- 面向对象的编程特性(类型、结构、学科、方法...)。
- 变量和选项的静态作用域(
zsh
有private
变量,但没有选项的静态作用域)。 - 名称引用(对于具有静态作用域和对象编程结构的 shell 来说是必需的,而对于像 zsh 或 bash 这样具有动态作用域的 shell 来说则不是那么重要)
- 日期/时间操作,包括自然语言、crontab、其
printf
和date
内置的 iso 格式(与此相比,zsh
它strftime
非常有限)。 - 一些有用的重定向运算符(
<#((...))
用于查找、<>;
覆盖和截断...)。 - 命名空间
- 工作池和 coshell。
- CSV/URI/HTML 实体/base64 编码/解码。
- ksh93v 中的 json 编码/解码 - 以其他工具可以理解的格式(反)序列化其高级数据结构(非常错误,在 ksh2020 中删除)。
$"..."
用于消息本地化/dev/tcp
,/dev/udp
(对于 UNIX 域套接字,zsh
有ztcp
,,但没有 UDP)zsocket
dtksh
在 90 年代,还有一个shell 将 X 工具包功能添加到包含在 CDE 中的 ksh93 中。- 有一个
shcomp
到编译ksh 代码。