作为一名 Linux 用户,我一直只使用 bash,因为它是我使用的每个发行版的默认设置。使用其他 Unix 系统(例如 BSD)的人似乎更频繁地使用其他 shell。为了更多地学习,我决定尝试一下 zsh。
作为 bash 用户:
- 我会错过哪些功能?
- 我应该注意哪些?
答案1
其他 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
内置函数可以很方便。例如,将每个复制file
到file.bak
:zmv -C '(*)(#q.)' '$1.bak'
bash 和 zsh 都有一个不错的完成系统,需要显式打开(
. /etc/bash_completion
或autoload -U compinit; compinit
)。 Zsh 的可配置性更高,而且通常更精美。
如果您在没有 的情况下运行 zsh .zshrc
,它会启动一个交互式菜单,让您选择配置选项。 (某些发行版可能会禁用此功能;在这种情况下,请运行autoload zsh-newuser-install; zsh-newuser-install
。)我建议启用推荐的历史记录选项,打开(“新式”)完成,并打开除 之外的“通用 shell 选项” beep
。稍后,在您发现更多选项时对其进行配置。
²当时,可编程完成是 zsh 的杀手级功能,但 bash 很快就获得了它。
⁴ bash 仅在版本 4 中获得的功能(因此在发布此答案时尚未广泛使用,并且在 macOS 上系统提供的 bash 上不可用)是较小的类型。
答案2
zsh
允许您编辑多行命令(请参阅zsh 行编辑器),bash 没有。如果您尝试相同的技巧 ( Ctrl-p
),bash 会获取最后一个命令。
答案3
另外,默认的制表符完成比 bash 更好...例如...
~/.e.d
TAB 将扩展到~/.emacs.d/
zsh 中,bash 将发出蜂鸣声。
答案4
其中 - zsh 中的增强
bash 中的命令which
仅显示命令的位置。
在 Zsh 中,which
将显示 an 的定义alias
、a 的源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"
}