zsh中有哪些功能,bash中缺少哪些功能,反之亦然?


62

作为Linux用户,我一直只使用bash,因为它是我使用的每个发行版的默认设置。使用其他Unix系统(例如BSD)的人们似乎更频繁地使用其他shell。为了学习更多,我决定尝试zsh。

作为bash用户:

  • 我会错过哪些功能?
  • 我应该注意什么?


5
@Gilles总有一天将所有这些人搬到这里...并合并
xenoterracide 2010年

Answers:


45

在其他Stack Exchange网站上,该主题已经有很多活动。据我所记得(几年前²),从bash切换到zsh的经验是我没有错过任何一件事情。我收获了很多;这是我认为最常用的简单的zsh特定功能:

  • 偶尔使用bash时我最想念的zsh功能是autocd:在zsh中,执行目录意味着更改为该目录,前提是您打开了该autocd选项。

  • 另一个非常有用的功能是花式球。该象形文字字符是有点难以记住,但非常方便(如,它往往快看看他们比写同等find命令)。一些更简单的示例:
        foo*~*.bak= foo*除以下所有匹配项外的所有匹配项*.bak
        foo*(.)=仅常规文件匹配foo*
        foo*(/)=仅目录匹配foo*
        foo*(-@)=仅悬挂符号链接匹配foo*
        foo*(om[1,10])= 10个最新文件匹配foo*
        foo*(Lm+1)=仅目录中大于1MB的文件= 目录及其所有子目录,递归⁴
        dir/**/foo*foo*dir

  • 对于精美的重命名,zmv内置函数可以派上用场。例如,将每个副本复制filefile.bakzmv -C '(*)(#q.)' '$1.bak'

  • bash和zsh都有一个不错的完成系统,需要明确打开(. /etc/bash_completionautoload -U compinit; compinit)。Zsh的可配置性更高,并且通常更出色。

如果运行不带zsh的zsh .zshrc,它将启动一个交互式菜单,使您可以选择配置选项。(某些发行版可能会禁用此功能;在这种情况下,请运行autoload zsh-newuser-install; zsh-newuser-install。)我建议启用建议的历史记录选项,打开(“新样式”)完成功能,然后打开“通用外壳程序选项”(除外)beep。稍后,在发现更多选项时对其进行配置。

² 当时可编程完成是zsh的杀手级功能,但bash很快就获得了它。
是BASH只在第4版获得的功能(所以仍然在许多系统上不可用)是在较小的类型。


5
Bash 4.0现在支持autocd您上面讨论的功能。使用命令启用功能shopt -s autocd。然后,该功能将按您所描述的那样工作。
Philluminati 2012年

zsh还具有内置where命令,请勿与该which命令混淆。
Sildoreth

@EdGrimm我认为GNU和FreeBSD find可以完成zsh glob限定符可以完成的所有工作(带有-exec用于选择的外壳程序以及用于e诸如sortsed重写e以及排序的工具的管道)。当然,要冗长得多。
Gilles

经过十多年的检查和重新检查查找手册后,我想我真的停止了寻找。但是,如果我在发表评论之前最后检查了一次,那么我至少会看到-size选项现在将单位缩减为字节。
Ed Grimm

11

另外默认的制表符补全比bash更好...例如...

~/.e.dTAB将扩展到~/.emacs.d/zsh,bash会发出哔哔声。


没有。setopt您为此使用什么非默认选项(如果有)?

我意识到我已_-.设置为通配符。 zstyle ':completion:*' matcher-list 'm:{a-zA-Z}={A-Za-z}' 'r:|[._-]=* r:|=*' 'l:|=* r:|=*' 。参见stackoverflow.com/q/7906078/311660
ocodo


8

Bash具有能够使用以下命令打开端口的功能

/dev/tcp/host/port

要么

/dev/udp/host/port

但是,它在Debian中被禁用,因为它被视为障碍(如果路径确实存在)并且超出了Shell应该执行的操作范围。更多信息 [debian邮件列表]


5
zsh内置了ztcp,但它的功能比bash的/ dev / tcp多,而没有/ dev / udp。我宁愿使用socat。
斯特凡Chazelas

2

其中-在zsh中增强

whichbash中的命令仅显示命令的位置。

在Zsh中,which将显示an的定义,a alias的来源function和命令的位置。

假设我们有一个shell别名:

alias gg='git log'

在Bash中,如果我们问:which gg结果将无效

在Zsh中:which gg将给我们...

gg: aliased to git log

假设我们有一个shell函数:

hello() {
    echo "Hello World"
}

在Bash中,如果我们问:which hello结果将是无效的。

在Zsh中:which hello将给我们...

hello() {
    echo "Hello World"
}

Bash通过type(内置)命令提供了相同的功能。只是对nitpick:which是一个外部命令,而不是内置的bash。
TorkelBjørnson-Langen18年


0

zsh-一个完整的外壳

有很多,通读zshcontrib(1)一个可以检测到两个版本的autoload-able tetris游戏(另一个具有ncurses),zsh与竞争emacs,以确保完整性(如上所述)。

=

我想提到一个=关键字,它可能会引起curl(URL通常包含?var=val在其中;但是unsetopt我认为它是-able)会引起不适:

  • q file =lessgentoo)解析为q file $(which less)

= 扩展到相关命令的完整路径。

其他东西

其他事情,是我们无法想到的,是正确的提示RPS1=%d(以$PWD样式显示),Alt + Hrun-helpman),Alt + ? which-commandvared,和zedautoload函数),Emacs的类似于minibuffer的Alt + X小部件,无需绑定小部件即可执行小部件,全局别名和后缀别名,扩展的历史跟踪命令完成时间,-m以及-regex匹配器,shell仿真(例如cshksh带有emulate)和autoload run-help内置文件的代码片段。

感叹

我认为大多数(即使不是全部)功能都是很久以前实现的,并且通过阅读变更日志,没有重大更改和新功能添加,这是非常可悲的(不再探索和发现)。

bash似乎更分散readline(相对于zle)和gnu historylinux精神;例如~/.inputrc/etc/inputrc如果未由bash-specific覆盖,则可以全局应用readline函数和键绑定(保留在和中)bind

结论

我个人认为emacs(尤其是从(当前?)emacs-nox风格的前景出发)是像这样的杰出软件的灵感,zsh并且tmux在作为此类实现的示例方面做得很好。对于欣赏其价值的人们(达到不需要/取决于X服务器的程度)。Unix shell足够强大,并且其连续性和一致性足以确保适当的工作流程和生产力(在整体计算中)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.