Shell(一):功能、配置和插件

关于shell,一个广义的解释就是在用户与操作系统之间,提供一个工具或接口给用户来操作计算机系统;用户在shell中通过输入命令行,按下回车键,shell执行命令后就能返回结果,达到操作计算机的效果。
但有很多人会问,为什么要学习shell呢?以下是我对为什么要学习shell的看法:

  • 在通过ssh来远程操纵Linux/Unix服务器时,都是使用shell而不是用户界面
  • 相比于通过点击多个用户界面来执行操作,输入命令行更加直接和快捷
  • 利用管道组合各种可用工具,来创建和定制宏工具
  • 使用shell script将重复简单的任务自动化

而shell有很多种:Bourne Shell, C Shell,Korn Shell,Bourne-again Shell,TENEX C Shell等,通过命令cat /etc/shells可以查看系统支持哪些shell:

System Support Shell.png

Linux/Unix默认都是使用Bash(Bourne-again Shell),但我更倾向于使用zsh,但由于配置过于复杂,前期很少人使用,但后来有外国程序员弄出一个Oh My ZSH来管理zsh的配置和支持更多插件,使得zsh变得更容易使用和更加强大。

zsh shell.png

Shell有哪些功能

  • 命令历史记录

一旦你在shell敲入正确命令并能执行后,shell就会存储你所敲入命令的历史记录(存放在~/.bash_history文件),方便你再次运行之前的命令。
你可以按方向键来查看之前执行过的命令

Shell Command History.gif

可以用!!来执行上一条命令,但最常用还是使用ctrl-r来搜索命令历史记录

Shell Search Command History.gif
  • 命令和文件补全(按tab键)

当你输入命令或文件名时,你可以通过按tab键来补全命令或文件名,这样可以让你更快敲入命令和敲入正确的命令。
有时你忘记具体某个命令,但你记住命令开头的几个字母是gi,可以敲入字母gi,按tab键来显示与前几个字母有关的所有命令:

Shell Command Complete.gif

当用cd命令前往某个目录时,你不必敲入整个路径的所有目录名,你只需敲入目录前几个字母,然后按tab键逐个补全目录名即可。
Shell Auto Complete Dir.gif

  • 命令别名

命令别名是一个比较有用的东西,特别适应用于简化命令输入。比如,你要更新cocoapods时,在shell输入以下命令行

pod update --verbose --no-repo-update

但每次都输入这么长的命令行,多么麻烦啊。所以,这时使用命令别名来简化命令行的输入:

alias pod_update='pod update --verbose --no-repo-update'

下次你只需要输入pod_update就可以更新cocoapod
你可以使用alias命令来显示所有命令别名

list all alias .png
  • 任务控制(job control)

使用shell登陆系统后,想要一边复制文件、一边查找文件、一边进行编译代码、一边下载软件,当然可以通过开启多个shell来完成,但如果想只在一个shell来完成以上多个任务时,此时可以使用shell的一个特性任务控制

在学会如何使用命令来控制任务之前,先了解两个概念:前台(foreground)后台(background)前台就是出现提示符让用户操作的环境,而后台就是不能与用户交互的环境,你无法使用 ctrl-c 终止它,可使用 bg/fg 呼叫该任务。

下面介绍一些命令如何控制任务:

1. 将任务放在后台运行:命令行 + &
job control 1.png

注意一下上面打印信息,[1]表示job number(任务编号),7089表示PID(进程号)。在后台执行的命令,如果有stdout和stderr,数据依旧输出到屏幕上,可以通过数据重定向传输到文件中,就不会影响前台的工作。

job control 2.png
2. 将任务丢到后台暂停:ctrl-z

在shell中执行find / -print命令,然后按下ctrl-z将任务丢到后台暂停:

job control 3.png

由上面打印可知,任务find / -print暂停执行,并将任务放在后台,返回一个job number[2]

3. 查看后台所有任务状态:jobs -l

输入jobs -l 查看后台所有的任务状态:

job control 4.png

仔细查看打印信息,有没有留意到在PID 74177431之前有-+两个符号,-表示最近第二个被放到后台的任务号码,+表示最近被放到后台的任务号码。

4. 将后台的任务拿到前台处理:fg %jobnumber

输入fg会默认取出+的任务,然后迅速按下ctrl-z

job control 5.png

看上面打印的PID7431,确实如此。再次输入jobs -l来查看后台所有任务的信息
job control 6.png

这次输入fg %1来讲后台的任务拿到前台处理。

5. 将后台的任务变成运行中:bg %jobnumber

输入jobs -l查看任务状态:

job control 7.png

然后输入bg %2; jobs -l将后台任务变成运行,并查看任务状态,然后不断地输入打印信息,这时需要关闭终端才能kill这个shell进程的子进程。

6. 管理后台当中的任务:kill -signal %jobnumber

有时,任务在后台运行或暂停,这时我想结束这个任务,怎样办呢?你可以使用kill命令将任务结束。
输入find / -print命令,并按下ctrl-z暂停任务:

job control 8.png

输入kill -9 %1;jobs -l结束任务并显示任务状态:
job control 9.png

  • shell script

shell script是利用shell的功能所编写的一个程序,这个程序使用纯文本文件来保存一些shell的命令,并遵循shell的语法规则,搭配数据重定向、管道、和正则表达式等功能来组合各种工具,实现简单重复任务的自动化。

  • 通配符

除了完整的字符串之外,shell还支持许多的通配符来帮助用户查询和命令执行。我简答地列出常用的几个通配符:

符号 含义
* 表示0到无穷多个任意字符
? 表示有一个任意字符
[] 表示有一个在中括号内的字符。例如[abc]表示有个字符,可能是abc其中一个
[-] 表示在编码顺序内的所有字符。例如[1-7]表示有个字符,范围1到7其中一个
[^] 表示反向选择。例如表示有一个字符,只要不是a,b,c的其他字符都可以

iTerm 2(for mac) && Oh My Zsh

如果你是mac的用户,推荐一个终端应用iTerm 2, iTerm 2 相比mac自带的 Terminal 应用,有太多优点了。例如,支持画面分割,可以设置主题,各种使用的快捷键,以及快速唤出。配合 Oh My Zsh 使用,简直优雅到爆!

Oh My Zsh安装

  • curl方式
curl -L https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh | sh
  • wget方式
wget https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh -O - | sh

安装完之后,关闭当前终端,并重新打开一个,oh my zsh的默认主题是robbyrussell,效果如下:

robbyrussell theme.jpg

配置

如果你想定制和扩展zsh,oh my zsh提供配置文件~/.zshrc来配置,可以设置环境变量和别名;

# Support autojump
[[ -s ~/.autojump/etc/profile.d/autojump.sh ]] && . ~/.autojump/etc/profile.d/autojump.sh

# setup moco alias name
alias moco_service="moco start -p 12306 -g settings.json"

#setup macvim alias name
alias vim="/Applications/MacVim.app/Contents/MacOS/Vim"

#setup pod update alias name
alias pod_update='pod update --verbose --no-repo-update'

Themes列出所有可用主题,每个主题都有截屏效果并教你如何设置,选择你喜欢的主题,在配置文件~/.zshrc查找字符串ZSH_THEME="robbyrussell",通过改变ZSH_THEME环境变量来改变主题。例如,

ZSH_THEME="agnoster"

oh my zsh提供数十种主题,相关文件在~/.oh-my-zsh/themes 目录,可以编辑主题来满足自身需求,我是使用默认的robbyrussell,不过做了一点小小改动:

PROMPT='%{$fg_bold[red]%}➜ %{$fg_bold[green]%}%p%{$fg[cyan]%}%d %{$fg_bold[blue]%}$(git_prompt_info)%{$fg_bold[blue]%}% %{$reset_color%}> '
#PROMPT='${ret_status}%{$fg_bold[green]%}%p %{$fg[cyan]%}%c %{$fg_bold[blue]%}$(git_prompt_info)%{$fg_bold[blue]%} % %{$reset_color%}> '

与原来不同的是,将c(表示当前目录)改为d(表示绝对路径),另外在尾部添加一个>作为隔离符号,效果如下:

modified robbyrussell.png

插件

oh my zsh提供丰富的插件,存放在~/.oh-my-zsh/plugins目录下:

oh my zsh plugins.png
想了解每个插件的功能以及如何使用,只要打开相关插件的目录下zsh文件即可,以git插件为例:
git plugin.png

打开git.plugin.zsh文件,里面有很多命名别来来简化命令的输入。你可以根据自己的需要来启用哪些插件,只需在~/.zshrc配置文件追加内容即可:

plugins=(git autojump osx)

我来介绍一下一些常用插件的使用吧:

git

当你处在一个git受控的目录下时,Shell明确显示gitbranch信息,另外简化git很多命令,具体使用请参考:Plugin:git

autojump

autojump插件使你能够快速切换路径,再也不需要逐个敲入目录,只需敲入目标目录,就可以迅速切换目录。

  • 安装
    如果你是mac用户,可以使用brew安装:
brew install autojump

如果是linux用户,首先下载autojump最近版本,比如:

git clone git://github.com/joelthelion/autojump.git

然后进入目录,执行

./install.py

最近将以下代码加入~/.zshrc配置文件:

[[ -s ~/.autojump/etc/profile.d/autojump.sh ]] && . ~/.autojump/etc/profile.d/autojump.sh
  • 使用
    如果你之前打开过~/.oh-my-zsh/themes目录,现在只需敲入j themes就可以快速切换到~/.oh-my-zsh/themes目录。
autojump.png
osx
  • tab - 在一个新标签打开当前目录
  • cdf - cd到当前Finder目录
  • quick-look - 快速浏览特殊的文件
  • man-preview - 在Preview应用打开特定的man page
  • trash - 将特定的文件移到垃圾桶

使用

  1. 因为zsh兼容bash,所以之前使用bash的人切换到zsh毫无压力
  2. 智能拼写纠正,比如你输入cls,会提示
    auto correct.png
  3. 各种补全:除了支持命令补全和文件补全之外,还支持命令参数补全,插件内容补全,只需要按tab
  4. 使用autojump智能跳转
  5. 目录浏览和跳转:输入d,就显示在会话里访问的目录列表,输入列表前的序号,即可以跳转
list dir and jump.png
  1. 输入..可以返回到上级目录
parent dir.png

YouTube有个演示视频 zsh shell详细介绍如果使用Oh My Zsh

总结

作为的一个程序员,我觉得shell是一个必不可少的工具,使用它能够毫不费劲地操作计算机。在shell提示下,通过调用各种各样的工具,并结合管道,将这些工具根据自己需要组合起来,创建和制定宏工具,甚至编写shell script来将简单而重复的工作自动化,做到Don't repeat your self

扩展阅读

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 195,438评论 5 461
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,235评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 142,635评论 0 323
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,439评论 1 266
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,259评论 4 357
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,248评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,644评论 3 384
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,308评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,603评论 1 292
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,670评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,429评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,291评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,678评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,962评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,241评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,622评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,819评论 2 335

推荐阅读更多精彩内容

  • Linux命令学习 记录小白学习Linux的过程。 常用命令 man命令 常用工具命令 man命令是Linux下的...
    吃蘑菇De大灰狼阅读 2,713评论 1 15
  • 1、Shell介绍 1.1、何为shell 关于shell,一个广义的解释就是在用户与操作系统之间,提供一个工具或...
    子瑜愚阅读 8,728评论 0 4
  • 工欲善其事,必先利其器。工欲利其器,必先思其行。每次换电脑的时候都得重新倒腾一遍,由于时间过得比较久老是忘记,所以...
    程序媛coco阅读 877评论 0 0
  • 一阵晕头转向之后,我终于来到了传说中的“明月七星阵”之下看来小凤所言不虚,这里的确很久没有人来过了,十分古朴但墙上...
    24e2f6668318阅读 288评论 0 0
  • 善良的人不会对天真视而不见 聪明的人不会对懵懂弃之以鼻 大度的人不会对过失耿耿于怀 你得承认自己目光狭窄 才会看不...
    睡莲醒了阅读 491评论 0 0