Shell(一):功能、配置和插件(附iTerm 2(for mac) && Oh My Zsh教程)

2023-05-16

关于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. 将任务放在后台运行:command + &


    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 7417和7431之前有-和+两个符号,-表示最近第二个被放到后台的任务号码,+表示最近被放到后台的任务号码。

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

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

    job control 5.png

    看上面打印的PID是7431,确实如此。再次输入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还支持许多的通配符来帮助用户查询和命令执行。我简答地列出常用的几个通配符:



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
aliaspod_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明确显示git和branch信息,另外简化git很多命令,具体使用请参考:Plugin:git

autojump

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

  • 安装
    如果你是mac用户,可以使用brew安装:
    brew install autojump
  • 关于 zsh: command not found: j 报错
    请在.zshrc文件相应的位置,找到 plugins=() 这行,添加 autojump 记得各插件名之间用英文空格隔开  然后重启item即可
    plugins=(git 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
  6. 输入..可以返回到上级目录

    parent dir.pngYouTube有个演示视频 zsh shell详细介绍如果使用Oh My Zsh

总结

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

扩展阅读

  • Linux Shell
    工作管理 (job control)
  • oh my shell
    终极 Shell


转自 http://blog.jobbole.com/86820/

参考 http://uecss.com/zsh-brew-autojump-plugins-shell-for-mac.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Shell(一):功能、配置和插件(附iTerm 2(for mac) && Oh My Zsh教程) 的相关文章

  • 子 shell 何时继承其父 shell 环境?

    什么情况下将shell的环境传递给子shell 子 shell 始终从父 shell 获取所有变量 man bash将描述所有使用子shell的情况 主要是 command command command and command 所谓环境只
  • 使用 cURL 从 shell 发布 4GB 文件

    我尝试将文件大小为 4GB 的文件发布到 REST API cURL 不会上传此大小的文件 而是 POST 内容长度为 0 的文件 curl v i d work large png H Transfer Encoding chunked
  • 让 Emacs ansiterm 和 Zsh 更好地发挥作用

    我一直在尝试在 emacs 会话中使用 Zsh 而无需 emacs 重新映射所有 Zsh 键 我发现 ansi term 对此非常有效 但是我仍然遇到一些问题 我输出了很多垃圾字符 我可以用以下方法修复它 Setup proper term
  • 如何在bash中仅提取两个字符串之间多行的第一个实例?

    我的文件是 abc 123 xyz abc 675 xyz 我想提取 abc 123 xyz 123 可以是任何东西 重点是我想要第一次出现 我尝试使用这个 sed n abc xyz p filename 但这给了我所有的例子 我怎样才能
  • 使用 Jenkins 运行 ios-sim

    我正在尝试使用以下命令从命令行启动我的应用程序ios sim https github com downloads pegli ios sim ios sim xcode4 3 tar gz但这就是我得到的 Started by user
  • 使用脚本自动输入 SSH 密码

    我需要创建一个自动向 OpenSSH 输入密码的脚本ssh client 假设我需要通过 SSH 进入myname somehost用密码a1234b 我已经尝试过 bin myssh sh ssh myname somehost a123
  • 向伪 shell (pty) 发出命令

    我尝试使用 subprocess popen os spawn 来运行进程 但似乎需要伪终端 import pty master slave pty openpty os write master ls l 应该发送 ls l 到从属终端
  • shell脚本“x$VARIABLE”中x的用途[重复]

    这个问题在这里已经有答案了 我正在查看一些 shell 脚本 comarison shcu 中 x 的用途是什么 if x USER x RUN AS USER then su RUN AS USER c CATALINA HOME bin
  • 如何在fish shell脚本中获取程序名称?

    在 bash 中 与在 ruby 中一样 程序名称由 0 给出 鱼里有什么 如果有必要 我可以执行以下操作 set PROGRAM ps no header o args p self egrep o S 2 但我确信程序名称必须已经在某个
  • 如何将命令作为参数传递给 ssh [重复]

    这个问题在这里已经有答案了 我的需要是让这个命令起作用 sshpass p XXXX ssh oStrictHostKeyChecking no email protected cdn cgi l email protection sudo
  • 此 bash 命令在 Makefile 中未正确运行

    在 Makefile 里面我有这样的 release version poetry version cut f2 d echo release version 如果我运行 我的终端中的语句将毫无问题地运行 gt version poetry
  • 将“npm run start”的输出写入文件

    我想捕获的输出npm run start在一个文件中 我遇到了大量错误 我想更好地控制如何筛选输出 当我尝试时 npm run start gt log txt 我得到一个非常简短的文件 8 行 其结尾为 34m 39m 90m wdm 3
  • 给出 5 个参数,但在终端中只得到 3 个参数

    我想将一个文件传递给一个c 程序 如果我在 IDE 中执行此操作 test string string lt test txt return argc 5 但在终端上我刚刚得到argc 3 看来 这是因为 什么是 lt 意思是 我正在使用
  • Bash 解析和 shell 扩展

    我对 bash 解析输入和执行扩展的方式感到困惑 对于输入来说 hello world 作为 bash 中的参数传递给显示其输入内容的脚本 我不太确定 Bash 如何解析它 Example var hello world displaywh
  • 如何在递归调用函数时阻止 bash 创建子 shell

    这是一个计算阶乘的简单 shell 函数 bin bash function factorial if 1 lt 2 then echo 1 else echo 1 factorial 1 1 fi factorial 1 但我发现这个脚本
  • 添加要在给定命令中运行的 .env 变量

    我有一个 env 文件 其中包含如下变量 HELLO world SOMETHING nothing 前几天我发现了这个很棒的脚本 它将这些变量放入当前会话中 所以当我运行这样的东西时 cat env grep v xargs node t
  • 如何从 Artifactory 存储库下载最新的工件?

    我需要来自存储库的最新工件 例如快照 人工工厂 http en wikipedia org wiki Software repository Repository managers 该工件需要通过脚本复制到服务器 Linux 我有什么选择
  • 从 shell 命令调用 SOAP 请求

    我使用curl 向Web 服务发送SOAP 请求 并使用shell 脚本获取响应 请在下面找到我正在使用的命令 curl H Content Type text xml charset utf 8 H SOAPAction d sample
  • 从 UNIX 命令行向串行端口发送字节?

    我想使用命令行将字节流发送到串行端口 这可能吗 我的串口位于 dev cu usbserial A700dYoR在我的 Mac 上 例如 如果我想将整数 50 或字符串 data 发送到该串行端口 我该怎么做 我对 UNIX 的了解非常有限
  • 使用正则表达式模式查找 -name 并使用 cp 替换文件名

    目前我正在使用该命令cron复制 data从源到目标路径 find source path name data exec cp target path 源码结构为 source path category1 001 data source

随机推荐

  • Linux下如何配置Vlan

    VLAN是虚拟局域网的缩写 一个物理交换机上可以共存多个VLAN xff0c 这些交换机通过Linux软件配置 xff0c 而不是通过硬件接口 xff08 您仍然需要配置实际的硬件交换机 xff09 VLAN作为名称建议一次组合多个LAN
  • 附加项-linux下ssh的config文件讲解-闫刚

    在 ssh 下创建 config文件 xff0c 可以添加多个账号 xff0c 减少认证的问题 并以如下格式编辑配置文件 vi config HostName xff1a 是目标主机的主机名 xff0c 也就是平时我们使用ssh后面跟的地址
  • 第一章 第九节 如何Doxygen为代码生成html文档-闫刚

    Doxygen是一款文档生成工具 xff0c 它可以从代码中提取出相应的文档 xff0c 并组织 xff0c 输出成各种漂亮的文档 xff08 如HTML xff0c PDF xff0c RTF等 xff09 doxygen让你变成一位有品
  • 第二章 第二节 px4的uORB工作原理分析 闫刚

    px4中的uorb是px4非常核心的数据通信机制 xff0c 所有线程的通信都是靠uorb完成 xff0c 用过的人可能 xff0c 仅仅知道在想要获取orb数据的时候 xff0c 先进行订阅 xff0c 在发送orb消息之前 xff0c
  • 闫刚 qgroundcontrol地面站通信流代码架构

    qgroundcontrol开发者文档中说明了qgc中的各个链路流向在文档中说明的很清楚 xff0c 下面配套源代码进行讲解整个qgc地面站的数据流向过程 qgroundcontrol通信 在 https dev qgroundcontro
  • 闫刚 linux平台实现IMU的DriverFramework

    文章目录 介绍资源用户态spi包1 spidev的设备节点spidev0 3表示spi0的chip select3 内核态设备树注册spidev设备 介绍 讲解linux的spi驱动架构 包括用户空间和内核空间如何配合使用spi驱动 通过p
  • 闫刚 stm32的usb的hal软件架构原理讲解

    资源 stm32 usb cubemx md 闫刚 stm32的usb的hal软件架构原理讲解 一 usb基础 stm32的usb也是很多公司都在使用的接口 xff0c usb全速可以达到12M s 作为虚拟串口接口 xff0c 还是不错的
  • 闫刚 px4架构的cmake移植到linux上

    文章目录 px4架构的cmake移植到linux上仓库地址 xff1a 图一 PX4的源码cmake架构图二 px4添加一个驱动模块的CMakeLists txt文件图三 openSTM的源码架构图四 openSTM中添加子模块CMakeL
  • 闫刚 nuttx workqueue实现原理

    文章目录 资源工作队列实现添加工作对象工作队列执行进程 使用注意 资源 nuttx wqueue md 工作队列实现 优点 xff1a 最短时间调度 缺点 xff1a 工作队列执行完后 xff0c 需要重新创建 添加工作对象 span cl
  • 闫刚 px4的gps驱动原理

    文章目录 资源1 rcS启动2 gps status内容 资源 px4 gps md 标题 xff1a 闫刚 px4的gps驱动原理 1 rcS启动 固件版本 xff1a V1 8 0 gps start 2 gps status内容 IN
  • 闫刚 px4_uavcan_dsdl的原理

    文章目录 资源简介1 cannode构建分析1 1 找到uavcan的单板1 2 分析一下UAVCAN下的CAMKE1 3 1 查看dsdl下的文件1 3 2 查看输出路径下的include dsdlc generated 2 我们添加自己
  • 常用的 Stress / Performance 测试工具(Linux环境)

    压力测试 Stress 要如何在 Linux 下針對不同的 I O 與系統做壓力測試 可以參考下面幾種方式 SysBench http benjr tw 8715 Linux 下常見的壓力測試工具不多 而且通常很分散 要不然就是協力廠商所開
  • 关于四旋翼往某个方向飘的问题

    经过测试 xff0c 在飞控没有gps定位和其他定位传感器的辅助下 xff0c 漂移是肯定存在的 因为在水平校准时 xff1b 1 xff09 肯定存在肉眼观察不到的水平问题 xff1b 2 xff09 再加上多旋翼装配不对称 xff0c
  • 浅谈进程和线程的个人理解

    进程和线程 首先什么是进程 xff1f 进程是操作系统动态执行的基本单元 xff0c 进程就可以说是一段程序的执行过程 xff0c 当我们有很多程序同时执行时 xff0c 就有了一种类似于排队的模式 xff0c 就如说我们去银行柜台取钱 x
  • 从零开始学OpenCV(一)——OpenCV的安装

    文章目录 前置条件一 OpenCV的安装总结 前置条件 提示 xff1a 本教程的安装环境如下 xff1a 操作系统 xff1a windows10 VisualStudio版本 xff1a 2017 提示 xff1a 以下是本篇文章正文内
  • Android学习记录(十二) http之base/digest鉴权。

    说下背景 xff0c 我们实现的http的文件下载是基于webdav协议的 这个肯定是需要鉴权的 xff5e android 5 1不再推荐使用apache的client 今天努力想尝试一下用httpurlconnection替换一下 大家
  • Unix unix network programming——第一章 简介

  • Jmeter使用流程及简单分析监控

    一 安装Jmeter 1 下载 Jmeter 下载地址 xff1a http jmeter apache org download jmeter cgi 目前最新版为2 9 xff0c 其余文件如源代码等也可从如下官网下载 xff1a ht
  • 通过VMware Fusion将 Mac 中的文件夹共享到虚拟机

    方法一 将 Mac 中的文件夹共享到虚拟机 2074940 Symptoms 免责声明 xff1a 本文为 Sharing a folder from your Mac to a virtual machine 1004055 的翻译版本
  • Shell(一):功能、配置和插件(附iTerm 2(for mac) && Oh My Zsh教程)

    关于shell xff0c 一个广义的解释就是在用户与操作系统之间 xff0c 提供一个工具或接口给用户来操作计算机系统 xff1b 用户在shell中通过输入命令行 xff0c 按下回车键 xff0c shell执行命令后就能返回结果 x