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 之间切换是一种便利,如果你不得不在工作或服务器上使用 Bash,那么 Zsh 可以轻松试用并在家中使用。
使用 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 条评论