Zsh 入门

从 Bash 进阶到 Z-shell,改进你的 shell 体验。linux

Z-shell(Zsh)是一种 Bourne 式的交互式 POSIX shell,以其丰富的创新功能而著称。Z-Shell 用户常常会说起它的许多便利之处,赞誉它对效率的提升和丰富的自定义支持。git

若是你刚接触 Linux 或 Unix,但你的经验足以让你能够打开终端并运行一些命令的话,那么你可能使用的就是 Bash shell。Bash 多是最具备表明意义的自由软件 shell,部分是由于它具备的先进的功能,部分是由于它是大多数流行的 Linux 和 Unix 操做系统上的默认 shell。可是,随着使用的次数越多,你可能会开始发现一些细节可能可以作的更好。开源有一个众所周知的地方,那就是选择。因此,许多人选择从 Bash “毕业”到 Z。github

Zsh 介绍

Shell 只是操做系统的接口。交互式 shell 程序容许你经过称为标准输入(stdin)的某个东西键入命令,并经过标准输出(stdout)和标准错误(stderr)获取输出。有不少种 shell,如 Bash、Csh、Ksh、Tcsh、Dash 和 Zsh。每一个都有其开发者所认为最适合于 Shell 的功能。而这些功能的好坏,则取决于最终用户。正则表达式

Zsh 具备交互式制表符补全、自动文件搜索、支持正则表达式、用于定义命令范围的高级速记符,以及丰富的主题引擎等功能。这些功能也包含在你所熟悉的其它 Bourne 式 shell 环境中,这意味着,若是你已经了解并喜欢 Bash,那么你也会熟悉 Zsh,除此之外,它还有更多的功能。你可能会认为它是一种 Bash++。shell

安装 Zsh

用你的包管理器安装 Zsh。ubuntu

在 Fedora、RHEL 和 CentOS 上:windows

$ sudo dnf install zsh
复制代码

在 Ubuntu 和 Debian 上:bash

$ sudo apt install zsh
复制代码

在 MacOS 上你可使用 MacPorts 安装它:服务器

$ sudo port install zsh
复制代码

或使用 Homebrew:app

$ brew install zsh
复制代码

在 Windows 上也能够运行 Zsh,可是只能在 Linux 层或相似 Linux 的层之上运行,例如 Windows 的 Linux 子系统(WSL)或 Cygwin。这类安装超出了本文的范围,所以请参考微软的文档。

设置 Zsh

Zsh 不是终端模拟器。它是在终端仿真器中运行的 shell。所以,要启动 Zsh,必须首先启动一个终端窗口,例如 GNOME Terminal、Konsole、Terminal、iTerm二、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.
复制代码

偏好设置分为四类,所以请从顶部开始。

  1. 第一个类使你能够选择在 shell 历史记录文件中保留多少个命令。默认状况下,它设置为 1,000 行。
  2. Zsh 补全是其最使人兴奋的功能之一。为了简单起见,请考虑使用其默认选项激活它,直到你习惯了它的工做方式。按 1 使用默认选项,按 2 手动设置选项。
  3. 选择 Emacs 式键绑定或 Vi 式键绑定。Bash 使用 Emacs 式绑定,所以你可能已经习惯了。
  4. 最后,你能够了解(以及设置或取消设置)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 却根本不是普通的 shell,而这仅仅才是开始。

在 Zsh 中搜索

当你想使用普通 shell 程序查找文件时,可使用 findlocate 命令。最起码,你可使用 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。想象一下在这样的场景中提升的效率:将特定文件类型从一组目录中移动到单个位置、将文本片断串联到一个文件中,或对日志进行抽取。

使用 Zsh 的制表符补全

制表符补全是 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 键才能显示它们。所以,制表符补全一般会变成来回按下键盘上字母和制表符,以致于你好像在接受钢琴独奏会的训练。

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 的状况不多会出错,可是若是失败了,请查找问题以解决并继续。对于许多在工做中困在一个 shell 上而在家中困在另外一个 shell 上的用户来讲,hyperpolyglot.org 已被证实其是无价的。

在个人下一篇 Zsh 文章中,我将向你展现如何安装主题和插件以定制你的 Z-Shell 甚至 Z-ier。


via: opensource.com/article/19/…

做者:Seth Kenlon 选题:lujun9972 译者:wxy 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

相关文章
相关标签/搜索