作为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.dTAB将扩展到~/.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邮件列表]
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"
}
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 historylinux精神;例如~/.inputrc,/etc/inputrc如果未由bash-specific覆盖,则可以全局应用readline函数和键绑定(保留在和中)bind。
我个人认为emacs(尤其是从(当前?)emacs-nox风格的前景出发)是像这样的杰出软件的灵感,zsh并且tmux在作为此类实现的示例方面做得很好。对于欣赏其价值的人们(达到不需要/取决于X服务器的程度)。Unix shell足够强大,并且其连续性和一致性足以确保适当的工作流程和生产力(在整体计算中)。