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

Mac*_*cha 63 bash zsh

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

作为 bash 用户:

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

Gil*_*il' 46

如需更广泛的答案,请阅读https://apple.stackexchange.com/questions/361870/what-are-the-practical-differences-between-bash-and-zsh/361957#361957

在其他 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 .zshrc,它会启动一个交互式菜单,让您选择配置选项。(某些发行版可能会禁用此功能;在这种情况下,请运行autoload zsh-newuser-install; zsh-newuser-install。)我建议启用推荐的历史记录选项,打开(“新式”)补全,并打开除beep. 稍后,当您发现它们时配置更多选项。

²当时可编程补全是 zsh 的杀手级功能,但 bash 很快就获得了它。
? bash 仅在版本 4 中获得的功能(因此在发布此答案时还没有广泛使用,并且在 macOS 上系统提供的 bash 上不可用)是较小的类型。

  • Bash 4.0 现在支持您在上面讨论的 `autocd` 功能。使用命令 `shopt -s autocd` 启用该功能。然后该功能如您所描述的那样工作。 (5认同)

oco*_*odo 11

此外,默认的选项卡完成比 bash 更好......例如......

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


Ped*_*lva 10

zsh允许您编辑多行命令(请参阅zsh 行编辑器),而 bash 则不能。如果您尝试相同的技巧 ( Ctrl-p),bash 将获取最后一个命令。

  • Bash 做到了这一点,至少从 4.2.37 版开始;它用分号替换换行符,并为您提供一行编辑。 (2认同)
  • 还是不太好。(: (2认同)

Por*_*jim 8

Bash 具有能够使用以下方式打开端口的功能

/dev/tcp/host/port
Run Code Online (Sandbox Code Playgroud)

或者

/dev/udp/host/port
Run Code Online (Sandbox Code Playgroud)

然而,它在 Debian 中被禁用,因为它被视为一种障碍(如果路径确实存在)并且超出了 shell 应该做的范围。更多信息[debian 邮件列表]

  • zsh 内置了 ztcp,尽管它比 bash 的 /dev/tcp 具有更多功能,但没有 /dev/udp。不过,我宁愿使用 socat。 (6认同)