原文出处:http://code.joejag.com/2014/why-zsh.html
译文出处:http://hackerxu.com/2014/11/19/ZSH.html

Zsh,因为其强大的shell交互功能已经被许多开发者所使用,虽然我也刚开始入门,但希望大家也一起加入Zsh的行列。

自从我刚开始接触 shell 的时候就慢慢维护着自己的 bash 配置.为了用起来顺手收集了许多 tab 补全,别名和一些功能。当 Zsh 慢慢在博客,评论里流行的时候我已经在我的 bash 文件里进行了配置,但是我仍然有些质疑。

然后我发现了 oh-my-zsh,一个集合了许多Zsh默认配置的项目。如果你们还没有接触过 Zsh ,那么相信你看完下面的介绍会毫不犹豫的更改你的 shell。

背景

如果你对 Bash 比较习惯并且担心会丢失所有 Bash 知识,那么大可不必担心,99%的操作 Bash 和 Zsh 都是相同的.你可以很好的完成 shell 的转换。

这篇文章使用的 Zsh version 5.0.2 和最近的 oh-my-zsh。我在它们安装后没有做任何配置。

在例子中用 <TAB> 来表示敲击tab键,别傻乎乎的打出来~

‘cd’中tab补全

让我们从最常用的出发,改变当前目录。

cd_before.png

在Bash里当你按下 <TAB> 你会得到当前目录下的文件。

这种情况下你只能进入到目录里,对于其他上下文来说并不是太有用.Zsh知道这点,它只给你显示有效的文件目录。

cd_after.png

他不仅可以帮你匹配目录,而且还可以允许你用方向键进行选取 (<TAB>向后,<Shift+TAB>向前)。

对于 TAB 智能补全和用按键进行选择交互这种方式是Zsh简单易用的核心。

快速’ls’

不必输入整个目录的名字,只需要输入几个能唯一识别的字母就可以了。

ls_shorthand_before.png

吡!

ls_shorthand_after.png

清除历史

你可能熟悉使用 <CTRL>+R 命令来寻找你使用过的命令。在 Bash 和 Zsh 中这是非常方便的方法。

Zsh 有一个更好的方法,你可以输入一部分命令然后按 <UP> 键.

history_before.png

它会找他你最近用过的以 ls 开始的命令。还可以继续寻找前面的命令。

history_after.png

分享命令历史

在每个 shell 里 Bash 都有它自己的输入历史,但是在 Zsh 里它所有活动 shell 里都会有一个共同的历史,所以你就不用不得不记住你在哪里输入这个命令了。

扩展环境变量

在我们的 shell 里提供了环境变量,有些时候我们要使用这些变量值或者只是检查一下它们。

path_expansion_before.png

在 Zsh 里你可以按 <TAB> 键使这些变量转换成它们所表达的值。

path_expansion_after.png

kill命令的tab补全

我通常用 kill 前先使用 ps 命令检查它们的进程号,或者当我确认的时候用 pkill 命令,Zsh 给你另一种方法。

kill_before.png

在输入 kill 命令后,按 tab键 它会提供一个以当前输入字母为开始的程序列表,通过方向键你可以选择杀掉哪个进程。

kill_after.png

命令参数

当想要了解一个命令的时候你通常需要输入 -help 或者检查 man page,Zsh 提供了更好的方法。

switch_before.png

输入 - 然后按 <TAB> 键。

switch_after.png

它会列出选项和说明,你也可以用方向键进行选择。

它步进在 ls 命令中,它可以工作在像 netstat、git、chmod 等大量的命令中。

Git辅助

每个人都有自己喜欢的 git 命令的别名,oh-my-zsh 给出了一大堆默认别名。

git_aliases.png

当你进入一个 git 目录的时候它也会有提示。

git_prompt.png

你可以查看它所在的分支名,上面的小叉号提示我有没有提交的更改。

上一个失败命令

你可能注意到了在截屏里的绿色小箭头,提示我上个命令运行成功。

fail_prompt.png

如果命令不成功提示符就会变成红色,直到命令运行成功。

匹配

在 Bash 里我通常用 find 搭配 xargs 命令去寻找文件,Zsh 内建对这一功能的支持。

让我们看看这个项目里的文件,而我要找到今天修改的文件。

glob_time_before.png

我们只需要在 ls 后面加入一个模式匹配符就可以得到我们想要的了。

glob_time_after.png

另一个比较实用的技巧是使用 ** 可以递归查找,我要在目录下寻找 Rakefile。

glob_recursive.png

让我们加一个修饰符来递归查找大于 20mb 的文件。

glob_large_files.png

这个方法不止限于 ls,在这个项目里查找有多少行 Clojure 代码。

glob_wc.png

让我们递归的删除在这个项目里的所有 Clojure 文件。

glob_rm_before.png

恩,但是我不太确信这个命令,所以让我们按 <TAB> 列出所有文件来代替。

glob_rm_after.png

键入错误名字

经常我们忘了文件名字的大小写,或者错误的输入了文件名的中间部分而不是开头,Zsh 能察觉到并帮我们自动的修改。

autocorrect_before.png

Zsh 修改

autocorrect_after.png

有用的别名

除了 git 的别名,oh-my-zsh 提供了许多有用的别名。

cd_aliases.png

... 帮你移到两层目录外真是太棒了。

Tabs named after the running process

Having the tab name changed to be the same as the running process is useful when you are hunting down where you are running that server.

tab_names.png

在Vim里编辑长命令

你可以在 Bash 和 Zsh 里用 <CTRL>+k 在长命令里来删除字符(我这里怎么是+h?)。但是有时候你想用功能更强大的编辑器来写长命令。

可以按 <CTRL>+X <CTRL>+E 把当前命令放到你的 $EDITOR 里。

vim_mode_before.png

温馨的 $EDITOR

vim_mode_after.png

我们可以编辑命令保存然后就会退回到终端里。

工具插件

oh-my-zsh 有一个为工具提供的插件的列表,我用 rake 插件可以允许你用 <TAB> 进入在你 Rakefile 里的 rake 命令。

rake_before.png

双击 <TAB> 可以进入可以选择的列表。

rake_after.png

仅此而已?

我直到最近才发现 Zsh 真他娘的好用啊,原因如下:

  • Tab 补全和选择
  • 活跃的插件社区提供我们基本的 dotfile
  • Bash 中 99% 的东西都能用

你准备好用 zsh 了吗?

chsh.png