Z-shell(或 Zsh)是一个交互式的类 Bourne POSIX shell,以其丰富创新的功能而闻名。Z-Shell 用户经常称赞它的诸多便利之处,并认为它提高了效率和扩展了自定义功能。
如果您是 Linux 或 Unix 的新手,但有足够的经验打开终端并运行一些命令,那么您可能使用过 Bash shell。Bash 可以说是权威的自由软件 shell,部分原因是其先进的功能,部分原因是它作为大多数流行的 Linux 和 Unix 操作系统上的默认 shell 发布。但是,您使用 shell 的次数越多,您就越会开始发现一些小事情,这些小事情可能更适合您想要使用它的方式。如果说开源以一件事而闻名,那就是选择。许多人选择从 Bash“毕业”到 Z。
什么是 Zsh?
shell 只是您操作系统的接口。交互式 shell 允许您通过所谓的标准输入或 stdin 输入命令,并通过标准输出和标准错误或 stdout 和 stderr 获取输出。有很多 shell,包括 Bash、Csh、Ksh、Tcsh、Dash 和 Zsh。每个 shell 都具有基于其程序员认为最适合 shell 的功能。这些功能是好是坏取决于您,最终用户。
Zsh 具有交互式 Tab 补全、自动文件搜索、正则表达式集成、用于定义命令范围的高级速记以及丰富的主题引擎等功能。这些功能包含在一个熟悉的类 Bourne shell 环境中,这意味着如果您已经了解并喜欢 Bash,您会发现 Zsh 很熟悉——只是功能更多。您可以将其视为一种 Bash++。
安装 Zsh
使用您的软件包管理器安装 Zsh。
在 Fedora、RHEL 和 CentOS 上
$ sudo dnf install zsh
在 Ubuntu 和 Debian 上
$ sudo apt install zsh
在 MacOS 上,您可以使用 MacPorts 安装它
$ sudo port install zsh
或使用 Homebrew
$ brew install zsh
可以在 Windows 上运行 Zsh,但只能在 Linux 或类 Linux 层之上运行,例如 Windows Subsystem for Linux (WSL) 或 Cygwin。本文不涉及该安装,因此请参阅 Microsoft 文档。
设置 Zsh
Zsh 不是终端模拟器;它是在终端模拟器内运行的 shell。因此,要启动 Zsh,您必须首先启动一个终端窗口,例如 GNOME Terminal、Konsole、Terminal、iTerm2、rxvt 或您喜欢的其他终端。然后,您可以通过键入以下内容启动 Zsh
$ zsh
首次启动 Zsh 时,系统会要求您选择一些配置选项。这些选项稍后都可以更改,因此按 1 继续。
This is the Z Shell configuration function for new users, zsh-newuser-install.
(q) Quit and do nothing.
(0) Exit, creating the file ~/.zshrc
(1) Continue to the main menu.
首选项分为四个类别,因此只需从顶部开始即可。
- 第一个类别允许您选择在 shell 历史记录文件中保留多少命令。默认情况下,它设置为 1,000 行。
- Zsh 补全是其最令人兴奋的功能之一。为了保持简单,请考虑使用其默认选项激活它,直到您习惯它的工作方式。按 1 获取默认选项,按 2 手动设置选项。
- 选择 Emacs 或 Vi 键绑定。Bash 使用 Emacs 绑定,因此您可能已经习惯了。
- 最后,您可以了解(以及设置或取消设置)Zsh 的一些细微功能。例如,当您提供没有命令的不可执行路径时,您可以通过允许 Zsh 启动目录更改来停止使用 cd 命令。要激活这些额外选项之一,请键入选项编号并输入 s 以设置它。尝试打开所有选项以获得完整的 Zsh 体验。您可以稍后通过编辑 ~/.zshrc 来取消设置它们。
要完成配置,请按 0。
使用 Zsh
起初,Zsh 给人的感觉很像使用 Bash,这无疑是它的众多功能之一。例如,Bash 和 Tcsh 之间存在严重差异,因此能够在 Bash 和 Zsh 之间切换的便利性使得 Zsh 易于尝试,如果您必须在工作或服务器上使用 Bash,则在家中也易于使用。
使用 Zsh 更改目录
正是这些细微的差异使 Zsh 变得出色。首先,尝试在没有 cd 命令的情况下将目录更改为您的 Documents 文件夹。这似乎好得令人难以置信;但是,如果您输入目录路径而不进行进一步的指令,Zsh 会更改为该目录
% Documents
% pwd
/home/seth/Documents
这会在 Bash 或任何其他普通 shell 中呈现错误。但是 Zsh 远非普通,这仅仅是开始。
使用 Zsh 搜索
当您想使用普通 shell 查找文件时,您可能会求助于 find 或 locate 命令。至少,您可能使用过 ls -R 来递归列出一组目录。Zsh 具有内置功能,允许它在当前目录或任何其他子目录中查找文件。
例如,假设您有两个名为 foo.txt 的文件。一个位于当前目录中,另一个位于名为 foo 的子目录中。在 Bash shell 中,您可以使用以下命令列出当前目录中的文件
$ ls
foo.txt
并且您可以通过显式声明子目录的路径来列出另一个文件
$ ls foo
foo.txt
要列出两者,您必须使用 -R 开关,可能与 grep 结合使用
$ ls -R | grep foo.txt
foo.txt
foo.txt
但是在 Zsh 中,您可以使用 ** 速记
% ls **/foo.txt
foo.txt
foo.txt
您可以将此语法与任何命令一起使用,而不仅仅是 ls。想象一下,当您将特定文件类型从目录集合移动到单个位置,或将文本片段连接到文件中,或在日志中 grep 时,效率会提高多少。
使用 Zsh Tab 补全
Tab 补全是 Bash 和其他一些 shell 中的高级用户功能,当它变得司空见惯时,它在 Unix 世界中引起了轰动。Unix 用户不再需要在键入冗长乏味的路径时求助于通配符(例如 /h*/s*h/V*/SCS/sc*/comp*/t*/a*/*9/04/LS*boat*v,这比键入 /home/seth/Videos/SCS/scenes/composite/takes/approved/109/04/LS_boat-port-cargo-mover.mkv 容易得多)。相反,他们只需在输入足够多的唯一字符串时按下 Tab 键。例如,如果您知道系统的根级别只有一个以 h 开头的目录,您可以键入 /h 然后按 Tab。它快速、简单、高效。它还确认路径存在;如果 Tab 没有完成任何操作,您就知道您找错了地方或您错误地键入了路径的一部分。
但是,如果您有许多目录共享五个或更多相同的前几个字母,则 Tab 会坚决拒绝完成。虽然在大多数现代终端中,它(至少)会显示阻止它猜测您意思的文件,但通常需要按两次 Tab 键才能显示它们;因此,Tab 补全通常会变成键盘上的字母和 Tab 的相互作用,以至于您感觉自己正在为钢琴演奏会做准备。
Zsh 通过循环浏览可能的补全来解决这个小麻烦。如果您键入 ls ~/D 并按 Tab,Zsh 首先使用 Documents 完成您的命令;如果您再次按 Tab,它会提供 Downloads,依此类推,直到您找到您想要的那个。
Zsh 中的通配符
通配符在 Zsh 中的行为与 Bash 用户习惯的不同。首先,它们可以被修改。例如,如果您想列出当前目录中的所有文件夹,您可以使用修改后的通配符
% ls
dir0 dir1 dir2 file0 file1
% ls *(/)
dir0 dir1 dir2
在本例中,(/) 限定了通配符的结果,因此 Zsh 将仅显示目录。要仅列出文件,请使用 (.)。要列出符号链接,请使用 (@)。要列出可执行文件,请使用 (*)。
% ls ~/bin/*(*)
fop exify tt
Zsh 不仅了解文件类型。它还可以使用相同的通配符修饰符约定根据修改时间进行列出。例如,如果您想查找在过去八小时内修改过的文件,请使用 mh 修饰符(代表 modified 和 hours)和小时的负整数
% ls ~/Documents/*(mh-8)
cal.org game.org home.org
要查找修改时间超过(例如)两天前的文件,修饰符更改为 md(代表 modified 和 day)和正整数
% ls ~/Documents/*(+2)
holiday.org
您可以使用通配符修饰符和限定符做更多的事情,因此请阅读 Zsh 手册页 以获取完整详细信息。
通配符副作用
要像在 Bash 中那样使用通配符,有时必须在 Zsh 中对其进行转义。例如,如果您要将一些文件复制到 Bash 中的服务器,您可以使用如下通配符
$ scp IMG_*.JPG seth@example.com:~/www/ph*/*19/09/14
这在 Bash 中有效,但 Zsh 返回错误,因为它会在发出 scp 命令之前尝试扩展远程端的变量。为避免这种情况,您必须转义远程变量
% scp IMG_*.JPG seth@example.com:~/www/ph\*/\*19/09/14
当您切换到新的 shell 时,正是这些类型的小例外情况会让您感到沮丧。使用 Zsh 时没有很多(在体验过 Zsh 后切换回 Bash 时可能会更多),但是当它们发生时,请保持冷静并明确。严格遵守 POSIX 很少会出错——但如果失败了,请查找问题以解决它并继续前进。Hyperpolyglot.org 已被证明对许多在工作中使用一个 shell 而在家中使用另一个 shell 的用户来说非常宝贵。
在我的下一篇 Zsh 文章中,我将向您展示如何安装主题和插件,以使您的 Z-Shell 更加 Z-ier。
2 条评论