Z shell(称为 zsh)是用于 Linux/Unix 类操作系统的 shell。它与 sh
(Bourne shell)系列中的其他 shell(如 bash
和 ksh
)有相似之处,但它提供了许多高级功能和强大的命令行编辑选项,例如增强的 Tab 补全。
在这里不可能涵盖 zsh 的所有选项;有成百上千页的文档 记录 了它的许多功能。在本文中,我将介绍五个技巧,让您在使用 zsh 命令行时更有效率。
1. 主题和插件
多年来,开源社区为 zsh 开发了无数的主题和插件。主题是预定义的提示配置,而插件是一组有用的别名和函数,可以更轻松地使用特定的命令或编程语言。
开始使用主题和插件的最快方法是使用 zsh 配置框架。有很多可用的框架,但最受欢迎的是 Oh My Zsh。默认情况下,它启用了一些合理的 zsh 配置选项,并且加载了数百个主题和插件。
主题可以提高您的工作效率,因为它会在提示符中添加有用的信息,例如您的 Git 存储库的状态或正在使用的 Python virtualenv。一目了然地获得这些信息可以节省您输入等效命令来获取它的时间,而且它看起来也很酷。这是一个 Powerlevel9k 的示例,这是我选择的主题

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
现在,如果您在命令行中键入任何以 yml
或 yaml
结尾的文件名,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 的补全系统非常智能。它会尝试仅建议可以在特定上下文中使用的项目——例如,如果您键入 cd
和 TAB
,zsh 只会建议目录名称,因为它知道 cd
不适用于任何其他内容。
相反,当运行与用户相关的命令时,它会建议用户名,或者在使用 ssh
或 ping
时,它会建议主机名,例如。
它有一个庞大的补全库,并且理解许多不同的命令。例如,如果您正在使用 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 可以提高您工作效率的众多功能中的一小部分;还有更多功能。有关更多信息,请查阅以下资源
您有什么 zsh 效率技巧要分享吗?我很乐意在下面的评论中听到它们。
4 条评论