使用 zsh 提高效率的 5 个技巧

zsh shell 提供了无数的选项和功能。这里有 5 种方法可以提高您在命令行中的效率。
314 位读者喜欢这个。
computer screen

Opensource.com

Z shell(称为 zsh)是用于 Linux/Unix 类操作系统的 shell。它与 sh(Bourne shell)系列中的其他 shell(如 bashksh)有相似之处,但它提供了许多高级功能和强大的命令行编辑选项,例如增强的 Tab 补全。

在这里不可能涵盖 zsh 的所有选项;有成百上千页的文档 记录 了它的许多功能。在本文中,我将介绍五个技巧,让您在使用 zsh 命令行时更有效率。

1. 主题和插件

多年来,开源社区为 zsh 开发了无数的主题和插件。主题是预定义的提示配置,而插件是一组有用的别名和函数,可以更轻松地使用特定的命令或编程语言。

开始使用主题和插件的最快方法是使用 zsh 配置框架。有很多可用的框架,但最受欢迎的是 Oh My Zsh。默认情况下,它启用了一些合理的 zsh 配置选项,并且加载了数百个主题和插件。

主题可以提高您的工作效率,因为它会在提示符中添加有用的信息,例如您的 Git 存储库的状态或正在使用的 Python virtualenv。一目了然地获得这些信息可以节省您输入等效命令来获取它的时间,而且它看起来也很酷。这是一个 Powerlevel9k 的示例,这是我选择的主题

zsh Powerlevel9K theme

zsh 的 Powerlevel9k 主题

除了主题之外,Oh My Zsh 还捆绑了大量有用的 zsh 插件。例如,启用 Git 插件可以让您访问许多有用的别名,例如

$ alias | grep -i git | sort -R | head -10
g=git
ga='git add'
gapa='git add --patch'
gap='git apply'
gdt='git diff-tree --no-commit-id --name-only -r'
gau='git add --update'
gstp='git stash pop'
gbda='git branch --no-color --merged | command grep -vE "^(\*|\s*(master|develop|dev)\s*$)" | command xargs -n 1 git branch -d'
gcs='git commit -S'
glg='git log --stat'

有许多编程语言、打包系统以及您在命令行上常用的其他工具的插件。这是我在我的 Fedora 工作站中使用的插件列表

git golang fedora docker oc sudo vi-mode virtualenvwrapper

2. 巧妙的别名

别名在 zsh 中非常有用。为您最常用的命令定义别名可以节省大量输入。Oh My Zsh 默认配置了几个有用的别名,包括用于导航目录的别名和带有附加选项的常用命令的替换,例如

ls='ls --color=tty'
grep='grep  --color=auto --exclude-dir={.bzr,CVS,.git,.hg,.svn}'

除了命令别名之外,zsh 还启用了两种额外的有用别名类型:后缀别名全局别名

后缀别名允许您根据文件扩展名,使用指定的程序打开您在命令行中输入的文件。例如,要使用 vim 打开 YAML 文件,请定义以下别名

alias -s {yml,yaml}=vim

现在,如果您在命令行中键入任何以 ymlyaml 结尾的文件名,zsh 将使用 vim 打开该文件

$ playbook.yml
# Opens file playbook.yml using vim

全局别名使您能够创建一个别名,该别名在命令行中的任何位置扩展,而不仅仅是在开头。这对于替换常见文件名或管道命令非常有用。例如

alias -g G='| grep -i'

要使用此别名,请在您要键入管道命令的任何位置键入 G

$ ls -l G do
drwxr-xr-x.  5 rgerardi rgerardi 4096 Aug  7 14:08 Documents
drwxr-xr-x.  6 rgerardi rgerardi 4096 Aug 24 14:51 Downloads

接下来,让我们看看 zsh 如何帮助导航文件系统。

3. 轻松的目录导航

当您使用命令行时,跨不同目录导航是最常见的任务之一。Zsh 通过提供一些有用的目录导航功能使此操作更容易。这些功能通过 Oh My Zsh 启用,但您可以使用以下命令启用它们

setopt  autocd autopushd \ pushdignoredups

设置这些选项后,您无需键入 cd 即可更改目录。只需键入目录名称,zsh 就会切换到该目录

$ pwd
/home/rgerardi
$ /tmp
$ pwd
/tmp

要返回,请键入 -

Zsh 保留您访问过的目录的历史记录,因此您可以快速切换到其中任何一个目录。要查看列表,请键入 dirs -v

$ dirs -v
0	~
1	/var/log
2	/var/opt
3	/usr/bin
4	/usr/local
5	/usr/lib
6	/tmp
7	~/Projects/Opensource.com/zsh-5tips
8	~/Projects
9	~/Projects/ansible
10	~/Documents

通过键入 ~# 切换到此列表中的任何目录,其中 # 是目录在列表中的编号。例如

$ pwd
/home/rgerardi
$ ~4
$ pwd
/usr/local

将这些与别名结合使用,使导航更加容易

d='dirs -v | head -10'
1='cd -'
2='cd -2'
3='cd -3'
4='cd -4'
5='cd -5'
6='cd -6'
7='cd -7'
8='cd -8'
9='cd -9'

现在您可以键入 d 以查看列表中的前十个项目,并键入编号以切换到它

$ d
0	/usr/local
1	~
2	/var/log
3	/var/opt
4	/usr/bin
5	/usr/lib
6	/tmp
7	~/Projects/Opensource.com/zsh-5tips
8	~/Projects
9	~/Projects/ansible
$ pwd
/usr/local
$ 6
/tmp
$ pwd
/tmp

最后,zsh 会自动使用 Tab 补全扩展目录名称。键入目录名称的首字母,然后按 TAB 即可使用它

$ pwd
/home/rgerardi
$ p/o/z (TAB)
$ Projects/Opensource.com/zsh-5tips/

这只是 zsh 强大的 Tab 补全系统启用的功能之一。让我们看看更多。

4. 高级 Tab 补全

Zsh 强大的补全系统是其标志之一。为了简化,我将其称为 Tab 补全,但在底层,正在发生不止一件事。通常有扩展和命令补全。我将在这里一起讨论它们。有关详细信息,请查看此 用户指南

命令补全在 Oh My Zsh 中默认启用。要启用它,请将以下行添加到您的 .zshrc 文件中

autoload -U compinit
compinit

Zsh 的补全系统非常智能。它会尝试仅建议可以在特定上下文中使用的项目——例如,如果您键入 cdTAB,zsh 只会建议目录名称,因为它知道 cd 不适用于任何其他内容。

相反,当运行与用户相关的命令时,它会建议用户名,或者在使用 sshping 时,它会建议主机名,例如。

它有一个庞大的补全库,并且理解许多不同的命令。例如,如果您正在使用 tar 命令,您可以按 Tab 键查看包中可用于提取的文件列表

$ tar -xzvf test1.tar.gz test1/file1 (TAB)
file1 file2

这是一个更高级的示例,使用 git。在此示例中,当键入 TAB 时,zsh 会自动补全存储库中唯一可以暂存的文件的名称

$ ls
original  plan.txt  zsh-5tips.md  zsh_theme_small.png
$ git status
On branch master
Your branch is up to date with 'origin/master'.

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

	modified:   zsh-5tips.md

no changes added to commit (use "git add" and/or "git commit -a")
$ git add (TAB)
$ git add zsh-5tips.md

它还理解命令行选项,并且只建议与所选子命令相关的选项

$ git commit - (TAB)
--all                  -a       -- stage all modified and deleted paths
--allow-empty                   -- allow recording an empty commit
--allow-empty-message           -- allow recording a commit with an empty message
--amend                         -- amend the tip of the current branch
--author                        -- override the author name used in the commit
--branch                        -- show branch information
--cleanup                       -- specify how the commit message should be cleaned up
--date                          -- override the author date used in the commit
--dry-run                       -- only show the list of paths that are to be committed or not, and any untracked
--edit                 -e       -- edit the commit message before committing
--file                 -F       -- read commit message from given file
--gpg-sign             -S       -- GPG-sign the commit
--include              -i       -- update the given files and commit the whole index
--interactive                   -- interactively update paths in the index file
--message              -m       -- use the given message as the commit message
... TRUNCATED ...

键入 TAB 后,您可以使用箭头键导航选项列表并选择您需要的选项。现在您无需记住所有这些 Git 选项。

有很多选项可用。找到对您最有帮助的选项的最佳方法是使用它。

5. 命令行编辑和历史记录

Zsh 的命令行编辑功能也很有用。默认情况下,它模拟 emacs。如果像我一样,您更喜欢 vi/vim,请使用以下命令启用 vi 绑定

$ bindkey -v

如果您正在使用 Oh My Zsh,vi-mode 插件会启用额外的绑定和提示符上的模式指示器——非常有用。

启用 vi 绑定后,您可以使用 vi 命令编辑命令行。例如,按 ESC+/ 搜索命令行历史记录。搜索时,按 n 会调出下一个匹配行,按 N 会调出上一个匹配行。大多数常见的 vi 命令在按 ESC 后都有效,例如 0 跳到行首,$ 跳到行尾,i 插入,a 追加等。甚至后跟移动的命令也有效,例如 cw 更改单词。

除了命令行编辑之外,如果您想修复或重新执行以前使用过的命令,zsh 还提供了几个有用的命令行历史记录功能。例如,如果您犯了错误,键入 fc 会将最后一个命令带到您喜欢的编辑器中进行修复。它尊重 $EDITOR 变量,默认情况下使用 vi。

另一个有用的命令是 r,它重新执行最后一个命令;以及 r <WORD>,它执行最后一个包含字符串 WORD 的命令。

最后,键入双感叹号 (!!) 会将最后一个命令带回到行中的任何位置。例如,如果您忘记键入 sudo 来执行需要提升权限的命令,这将非常有用

$ less /var/log/dnf.log
/var/log/dnf.log: Permission denied
$ sudo !! 
$ sudo less /var/log/dnf.log

这些功能使查找和重复使用以前键入的命令变得更加容易。

下一步该怎么做?

这些只是 zsh 可以提高您工作效率的众多功能中的一小部分;还有更多功能。有关更多信息,请查阅以下资源

Z Shell 简介

ZSH 用户指南

Archlinux Wiki

zsh-lovers

您有什么 zsh 效率技巧要分享吗?我很乐意在下面的评论中听到它们。

标签
Avatar
Ricardo Gerardi 是 Enable Sysadmin 和 Enable Architect 的技术社区倡导者。他之前是 Red Hat Canada 的首席顾问,专门从事使用 Ansible 和 OpenShift 的 IT 自动化。

4 条评论

不错的文章,我肯定会尝试一下 zsh。

在 90 年代中期从 bash 切换到 zsh,从未回头。不过,这远早于 Oh My Zsh,因此我手工制作了我的大部分设置。是时候重构并可能利用 Oh My Zsh 了。

不过,我最有用的设置是

setopt ignore_eof nobeep
bindkey -s '^X^X' '^Uexit\n'

在慢速 SSH 连接上,在编辑命令行(Emacs 模式)时,可能会意外地点击 Ctrl-D 过多,因此我将我的退出序列映射为 Ctrl-X Ctrl-X。“nobeep”是给定的。

长时间工作很辛苦,我们需要找到一些聪明的方法来增加我们将要完成的工作量。非常有效的帖子。谢谢

Creative Commons License本作品根据 Creative Commons Attribution-Share Alike 4.0 International License 获得许可。
© . All rights reserved.