作为Linux用户,我一直只使用bash,因为它是我使用的每个发行版的默认设置。使用其他Unix系统(例如BSD)的人们似乎更频繁地使用其他shell。为了学习更多,我决定尝试zsh。
作为bash用户:
- 我会错过哪些功能?
- 我应该注意什么?
作为Linux用户,我一直只使用bash,因为它是我使用的每个发行版的默认设置。使用其他Unix系统(例如BSD)的人们似乎更频繁地使用其他shell。为了学习更多,我决定尝试zsh。
作为bash用户:
Answers:
在其他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的zsh .zshrc
,它将启动一个交互式菜单,使您可以选择配置选项。(某些发行版可能会禁用此功能;在这种情况下,请运行autoload zsh-newuser-install; zsh-newuser-install
。)我建议启用建议的历史记录选项,打开(“新样式”)完成功能,然后打开“通用外壳程序选项”(除外)beep
。稍后,在发现更多选项时对其进行配置。
² 当时可编程完成是zsh的杀手级功能,但bash很快就获得了它。
⁴ 是BASH只在第4版获得的功能(所以仍然在许多系统上不可用)是在较小的类型。
autocd
您上面讨论的功能。使用命令启用功能shopt -s autocd
。然后,该功能将按您所描述的那样工作。
where
命令,请勿与该which
命令混淆。
-exec
用于选择的外壳程序以及用于e
诸如sort
和sed
重写e
以及排序的工具的管道)。当然,要冗长得多。
另外默认的制表符补全比bash更好...例如...
~/.e.d
TAB将扩展到~/.emacs.d/
zsh,bash会发出哔哔声。
_-.
设置为通配符。 zstyle ':completion:*' matcher-list 'm:{a-zA-Z}={A-Za-z}' 'r:|[._-]=* r:|=*' 'l:|=* r:|=*'
。参见stackoverflow.com/q/7906078/311660
zsh
使您可以编辑多行命令(请参见zsh行编辑器),而bash则不能。如果您尝试相同的技巧(Ctrl-p
),bash将获取最后一条命令。
Bash具有能够使用以下命令打开端口的功能
/dev/tcp/host/port
要么
/dev/udp/host/port
但是,它在Debian中被禁用,因为它被视为障碍(如果路径确实存在)并且超出了Shell应该执行的操作范围。更多信息 [debian邮件列表]
which
bash中的命令仅显示命令的位置。
在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"
}
type
(内置)命令提供了相同的功能。只是对nitpick:which
是一个外部命令,而不是内置的bash。
有很多,通读zshcontrib(1)
一个可以检测到两个版本的autoload
-able tetris
游戏(另一个具有ncurses
),zsh
与竞争emacs
,以确保完整性(如上所述)。
我想提到一个=
关键字,它可能会引起curl
(URL通常包含?var=val
在其中;但是unsetopt
我认为它是-able)会引起不适:
q file =less
(gentoo
)解析为q file $(which less)
=
扩展到相关命令的完整路径。
其他事情,是我们无法想到的,是正确的提示RPS1=%d
(以$PWD
样式显示),Alt + H(run-help
即man
),Alt + ? (which-command
)vared
,和zed
(autoload
函数),Emacs的类似于minibuffer的Alt + X小部件,无需绑定小部件即可执行小部件,全局别名和后缀别名,扩展的历史跟踪命令完成时间,-m
以及-regex
匹配器,shell仿真(例如csh
,ksh
带有emulate
)和autoload
run-help
内置文件的代码片段。
我认为大多数(即使不是全部)功能都是很久以前实现的,并且通过阅读变更日志,没有重大更改和新功能添加,这是非常可悲的(不再探索和发现)。
bash
似乎更分散于readline
(相对于zle
)和gnu history
linux精神;例如~/.inputrc
,/etc/inputrc
如果未由bash-specific覆盖,则可以全局应用readline函数和键绑定(保留在和中)bind
。
我个人认为emacs
(尤其是从(当前?)emacs-nox
风格的前景出发)是像这样的杰出软件的灵感,zsh
并且tmux
在作为此类实现的示例方面做得很好。对于欣赏其价值的人们(达到不需要/取决于X
服务器的程度)。Unix shell足够强大,并且其连续性和一致性足以确保适当的工作流程和生产力(在整体计算中)。