• shell之终极shell——zsh


    快速了解Linux/Unix系统中最重要的概念——shell一文中,我们对shell进行了简单的介绍。shell是Linux/Unix的一个外壳,它负责外界(用户)与Linux内核的交互,接收用户或其他应用程序的命令,然后把这些命令转化成内核能理解的语言,传给内核,内核是真正干活的,干完之后再把结果返回用户或应用程序。

    比如,用 ls 命令列举当前目录的文件,用 find 命令查找文件,用 cp 命令拷贝文件,用 top 命令查看机器负载和进程等。最常见的bash就是shell的一种,也是 Linux下的默认shell程序,这篇主要介绍当下最热门的shell——zsh,相比bash,它更强大,也更人性化,俗称终极shell。

    什么是zsh?

     对于经常在Linux环境下干活的开发者来说,shell是我们使用最频繁的程序了。而zsh属于shell的一种,和bash 一样,但比bash更好用,zsh完全兼容bash,拥有极其丰富的插件,其强大的自动补全参数、文件名以及自定义功能,可以大大提高我们使用Linux的效率

    安装zsh

    Mac OS预装了zsh,可跳过这一步;
    Redhat Linux执行: sudo yum install zsh 
    Ubuntu Linux执行: sudo apt-get install zsh 
    Windows 请点右上角关闭。。。

    安装完成后设置当前用户使用zsh: chsh -s /bin/zsh ,根据提示输入当前用户的密码就可以了。

    安装oh-my-zsh

    zsh虽然好用,但直接用起来还是比较麻烦,不过幸运的是,已经有大神给我们配置好了一个很棒的框架:oh-my-zsh(github),专门为zsh打造,一条命令搞定安装:

    sh -c "$(wget https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh -O -)"

    如果 wget 报错,也可手动安装(须先安装git,方法同zsh,替换成git即可):

    git clone git://github.com/robbyrussell/oh-my-zsh.git ~/.oh-my-zsh
    cp ~/.oh-my-zsh/templates/zshrc.zsh-template ~/.zshrc

    配置

    zsh的配置主要集中在用户当前目录的 .zshrc 里,用 vim 或你喜欢的其他编辑器打开 .zshrc ,在最下面会发现这么一行字:

    # Customize to your needs…

    可以在此处定义自己的环境变量和别名,当然,oh my zsh在安装时已经自动读取当前的环境变量并进行了设置,你可以继续追加其他环境变量。

    主题

    oh-my-zsh提供了很多主题,主题的配置文件在 ~/.zshrc 文件中可以看到,打开该文件,找到下面这行:

    ZSH_THEME="robbyrussel"

    这是默认主题,可以将值改为其它任意主题,oh-my-zsh的主题可以在这里找到。改好保存文件后,执行 source ~/.zshrc 使配置生效。当然,你也可以直接将值设置为”random”也是可以的,以后每次登陆服务器,oh-my-zsh会随机选择一个主题,总有一款适合你。

    插件

    oh my zsh项目提供了完善的插件体系,相关的文件在 ~/.oh-my-zsh/plugins 目录下,默认提供了100多种,大家可以根据自己的实际学习和工作环境采用,想了解每个插件的功能,只要打开相关目录下的zsh文件看一下就知道了。插件也是在 .zshrc 里配置,找到plugins关键字,你就可以加载自己的插件了,系统默认加载git,你可以在后面追加内容,如下:

    plugins=(git zsh-syntax-highlighting zsh-autosuggestion autojump z)

    优势特色

    命令提示

    务必明确命令提示补全是两个完全不同的系统!很多时候提示比补全更有用,例如:

    你才输入完 “tar”命令,后面就用灰色给你提示 tar 命令的参数,而且是随着你动态输入完每一个字母不断修正变化:

    比如你输入到 - 后,没有跟着它上面的提示,而是输入了一个z字母,它马上明白你是要解压,不是压缩,然后随即给出你压缩对应的命令提示。

    这个命令提示是基于你的历史命令数据库进行分析的,随着你输入的命令越来越多,提示将会越来越准确和顺手,某些不常输入的命令特别管用,比如偶尔查看下网卡配置:

    刚输入完:cat /etc/n,它后面已经猜出你可能要查看网卡配置了,然后马上给出你提示,用不着你TAB键补全半天。

    如果你觉得它提示的正确,你可以CTRL+F表示采纳,后面就会自动帮你一次性全部输入完了,不用一个字一个字地照着敲。前面的高亮就不说了,用惯这套提示系统,你就再也难以回到光秃秃的bash时代了。

    智能补全

    缩写路径补全是zsh的一大特色,特别是路径比较长的时候,比如Mac OS下工具链层层套的那种路径,比如某java代码树,有了这种缩写补全,能让你切换路径流畅不少:

    当补全内容较多时,不用像bash一样持续提示你需要继续输入,也不会像cmd永无止境的循环下去,连续敲击两次TAB键zsh给你一个补全目录,让你上下左右选择:

    这叫选择模式,由两次连续TAB进入,进入后,除了TAB/SHIFT+TAB可以前后切换外,你还可以使用光标键上下左右移动,或者使用emacs键位:CTRL + f/b/p/n (左右上下:forward, backward, previous, next) 。如果你觉得光标键太远难按,CTRL+f/b/p/n太伤小拇指,也可以新定义一套,比如:ALT+hjkl(左下上右)来选择,十分顺手。回车表示确认选择,用CTRL+G表示退出。

    命令参数补全更不在话下,输入tar后面按一次TAB:

    不仅一级参数可以补全,更常用的是二级参数补全。这时候两次TAB进入选择模式就比较管用了,选择完回车确认,或者CTRL+G退出选择模式。

    快速跳转

    cd -:切换至最近路径

    命令行工作中,不同的路径间切来切去是个头疼的问题,除了上面提到的缩写补全外,也可以使用 cd - 切换到最近跳转过的某个路径

    输入cd后面加一个减号“-”后,按一次TAB马上就列出本次登陆后去过的最近几次路径,接着根据下面的提示输入数字按回车就过去了,比如输入: $ cd -5 <回车> 就跳转到~/.oh-my-zsh/plugins路径下了。当然你还可以不输入数字,而是再按一次tab进入选择模式,上下键或者CTRL+n/p来选择,回车确认,CTRL+G返回。

    有了前面的路径缩写展开,和上面的最近访问路径切换,能否更进一步,不限于本次登陆或者最近去过的几级路径,而让我快速进入自开始用zsh之后进入过的某个路径呢?当然可以,我们使用 z 命令,查看历史上进入过的目录。

    d:跳转最近历史目录

     d 命令会列出我们最近进入的目录历史,并且会给这些目录加上序号,只需要输入对应目录的序号,即可重新进入该目录,如下图所示:

    其中序号为1的目录是我的SU目录,直接输入1,立马跳回到SU所在目录。

    下一节还会介绍两种跳转类插件z和autojump。

    热键绑定

    zsh里面使用 bindkey 命令可以设置一系列热键,用来运行某一个zsh内部命令或者某个shell命令。比如从网上下载了一个tar包解开后要稍微浏览一下里面的内容,用的最多的两条命令是啥呢?第一条是 ls 命令,每到一个子目录都要先按一下,还有就是 cd ..  对吧,经过配置:

    bindkey -s 'eo'   'cd ..
    '    # 按下ALT+O 就执行 cd .. 命令
    bindkey -s 'e;'   'ls -l
    '    # 按下 ALT+; 就执行 ls -l 命令

    你还可以设置一键打开编辑器,或者一键帮你输入某常用命令的一部分。除了这些命令外,日常命令编写也可以加强一下:

    bindkey 'e[1;3D' backward-word       # ALT+左键:向后跳一个单词
    bindkey 'e[1;3C' forward-word        # ALT+右键:前跳一个单词
    bindkey 'e[1;3A' beginning-of-line   # ALT+上键:跳到行首
    bindkey 'e[1;3B' end-of-line         # ALT+下键:调到行尾

    敲命令时经常需要对已有命令进行修改,默认一个字符一个字符的跳太慢了,这样设置以后基于单词的跳转快速很多,配合其他一些快捷键,修改命令事半功倍。

    还不会在自己的终端软件里设置允许ALT键的同学们可以搜索下相关文章。

    善用zsh的插件

    介绍几款热门常用插件。

    zsh-syntax-highlighting:色彩高亮

    zsh-syntax-highlighting的主要作用时让你在使用zsh的时候,shell命令可以高亮显示,便捷的知道你输入的命令是否正确。正确的命令会使用绿色渲染误的命令会使用红色警告


    安装

    Mac OS:直接 brew install zsh-syntax-highlighting ,会自动下载这个插件,再 source /usr/local/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh 刷新即可。

    对于Oh-my-zsh用户:

    git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting

    然后激活这个插件,通过在 ~/.zshrc 中加入插件的名字:

    plugins=([plugins...] zsh-syntax-highlighting)

    最后当然是source一下,让改变生效: source ~/.zshrc 。

    zsh-autosuggestions:命令自动推荐

    根据历史输入指令的记录即时的提示,能够很大的提高效率。

    安装

    git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions

    编辑~/.zshrc文件: plugins=(git zsh-autosuggestions) 

    z:路径跳转魔术师

    强大的目录自动跳转命令,会记忆你曾经进入过的目录,用模糊匹配快速进入你想要的目录。

    可以查看历史路径及其权重,跳转至匹配关键字的最高权重路径:

    1. 敲入 z 命令,会列出自开始用zsh进入过的目录和它们的权重,进入次数越多,权重越大。

    2. 使用 z [key] 直接跳转到所有匹配关键字的历史路径中权重最高的那个。

    3. 使用 z -l key 会列出包含关键词的所有历史路径及其权重。关键词可以有多个,使用空格间隔: z -l key1 [key2 ...] 。会先匹配第一个,再匹配第二个,直到最后锁定。

    大家实际使用起来,一般是z+最后一级目录名,99%的时候这样做就足够了。当没有按照你要求跳转的时候,你可以再补充再上一级目录的一些信息。实在弄不明白会跳转到哪里,可以随时用上述123的命令查看权重。

    安装

    直接在 ~/.zshrc 中的插件那行添加z即可: plugins=(git z) 

    autojump

    zsh和autojump的组合形成了zsh下最强悍的插件,实现目录间快速跳转。想去哪个目录直接 autojump dir_name一部分 ,不用再频繁的cd了!

    autojump有一个自带的alias:j,因此简单输入 j dir 就可以转到对应的目录去。

    对于权重数据库的访问

    $ autojump -a [dir]
    # 在数据库中添加一个目录
    
    $ autojump -i [value]
    # 提升当前目录value数目的权重
    
    $ autojump -d [value]
    # 降低当前目录的权重
    
    $ autojump -s
    # 显示数据库中的统计数据
    
    $ autojump --purge
    # 清除不再需要的目录

    安装

    如果你用Mac OS,可以直接brew安装: brew install autojump 。如果是Linux: sudo apt install autojump 

    修改配置文件: vim ~/.zshrc ,添加: plugins=(git autojump) 。另

    # 使用brew安装的
    [[ -s $(brew --prefix)/etc/profile.d/autojump.sh ]] && . $(brew --prefix)/etc/profile.d/autojump.sh
    source $ZSH/oh-my-zsh.sh
    
    # 使用git安装的
    [[ -s ~/.autojump/etc/profile.d/autojump.sh ]] && . ~/.autojump/etc/profile.d/autojump.sh 

    zsh-incr:自动补全插件

    安装

    mkdir ~/.oh-my-zsh/plugins/incr
    wget http://mimosa-pudica.net/src/incr-0.2.zsh -O ~/.oh-my-zsh/plugins/incr/incr.plugin.zsh

    在.zshrc文件末尾添加: source ~/.oh-my-zsh/plugins/incr/incr*.zsh 

    之后 $ source ~/.zshrc  更新配置即可。

    (整理自网络)

    参考资料:

    https://zhuanlan.zhihu.com/p/19556676

    https://www.zhihu.com/question/21418449

    Min是清明的茗
  • 相关阅读:
    iPhone网络编程之--Reachability
    ASIHTTPRequest 详解, http 请求终结者2
    什么情况下使用break关键字? 什么情况下使用Continue关键字? Java如何声明一个数组?JS如何声明一个数组?如何获取数组长度? 如何遍历数组?
    说说三元运算和if...else的相同之处? Switch语句的条件只能接受什么类型的值? 说说do...while和while的区别? 说说for循环的两种写法?
    String类的常用方法
    逻辑结算的结果是什么类型? 比较运算的值是什么类型? 声明字符串有哪几种方式?怎么写? Math类有哪些常用的方法? 三元运算怎么写?
    算术运算有哪些?逻辑运算有哪些?比较运算有哪些?
    Java中8种基本数据类型是哪些?
    Java如何声明变量?JS如何声明变量?
    回顾之前知识: 注释
  • 原文地址:https://www.cnblogs.com/MinPage/p/14144412.html
Copyright © 2020-2023  润新知