高效 Bash 使用技巧

这是一篇 Bash 的使用技巧内容,部分内容需要先具备一些基础知识及 Linux 的基础操作能力 主要内容分两部分,一部分是关于 history 的,另一部分是关于操作的

我们在日常使用中,难免会使用到一些历史命令或者有时需要对历史命令进行更正,那么如何更加高效的来完成这些操作呢?

History

history 格式化

首先我们肯定会想到 history 命令,history 可以返回之前使用过的命令列表,就像这样:

(Tao) ➜  ~ history 10
    1  cd myzh
    2  cd zsh
    3  ls
    4  cat zshrc
    5  brew info tmux
    6  brew install tmux
    7  cd .tmux
    8  cd tmux
    9  cp tmux.conf ~/
   10  mv tmux.conf .tmux.conf

我们可以很方便的通过后面指定数字来返回固定数量的历史记录,但是这样得到的结果,我们也只是知道使用它们的先后顺序,我们想要得到更加详细的信息,例如执行时间,那么我们可以这样做:

(Tao) ➜  ~ export HISTTIMEFORMAT='%F %T '

(Tao) ➜  ~ history 10
    1 2016-02-09 15:38:40  cd myzh
    2 2016-02-09 15:38:44  cd zsh
    3 2016-02-09 15:38:51  ls
    4 2016-02-09 15:38:59  cat zshrc
    5 2016-02-09 15:39:04  brew info tmux
    6 2016-02-09 15:48:13  brew install tmux
    7 2016-02-09 15:48:17  cd .tmux
    8 2016-02-09 15:49:04  cd tmux
    9 2016-02-09 15:49:23  cp tmux.conf ~/
   10 2016-02-09 15:49:47  mv tmux.conf .tmux.conf

通过设置 HISTTIMEFORMAT 的环境变量,在历史记录中显示了时间。

使用指定历史命令

想要使用某条历史记录改如何操作呢? 我们使用 !序号, 比如我们想要执行第3条命令,那我们输入 !3 即可:

(Tao) ➜  ~ history 6
    1  cd myzh
    2  cd zsh
    3  ls
    4  cat zshrc
    5  brew info tmux
    6  brew install tmux

(Tao) ➜  ~ !3
(Tao) ➜  ~ ls

zshrc

重复执行了上面第 3 条命令。 如果我们想要执行倒数第n条,那就直接输入 !-n

使用上条命令

当想要使用上条命令的时候,我们有下面 4 种方式:

  • !-1 回车
  • !! 回车
  • 输入 Ctrl + p 回车
  • 按上箭头回车

有兴趣的小伙伴可以试下,这几种用法都比较常见。

使用某些字符开头或者包含这些字符在内的命令

比如,我们想要使用之前执行过的一条导入环境变量的语句,那么我可以执行 !export:

# 当然export也可以不输完整
(Tao) ➜  ~ !export    
(Tao) ➜  ~ export HISTTIMEFORMAT='%F %T '

如果只记得命令中包含 xport 呢? 那当然也可以, 只要加个 ? 就可以:

(Tao) ➜  ~ !?xport    
(Tao) ➜  ~ export HISTTIMEFORMAT='%F %T '

获取上条命令中的参数

比如 touch 了某个文件,现在要编辑它,那么只要执行 !$ 或者 !!:$ 即可:

(Tao) ➜  ~ touch test.sh   
(Tao) ➜  ~ vi !$   
vi test.sh

(Tao) ➜  ~ vi !!:$
vi test.sh

这种方式只是获取到了最后一位的参数, 那么假如我们想要获取的不只是最后一个参数呢?使用 !* 或者 !!:* 即可:

(Tao) ➜  ~ touch a b c
(Tao) ➜  ~ vim !*
vim a b c
3 files to edit

(Tao) ➜  ~ vim !!:*
vim a b c
3 files to edit

对上条命令中的参数做替换

难免有手误的时候,那么如何快速进行替换呢? 我们可以使用 ^old^new 的命令,例如:

(Tao) ➜  ~ cp /usr/local/etc/redis-sen.conf .
cp: /usr/local/etc/redis-sen.conf: No such file or directory
(Tao) ➜  ~ ^sen^sentinel
cp /usr/local/etc/redis-sentinel.conf .

或者 我们还可以使用 !!:gs/old/new 这样进行操作,例如:

(Tao) ➜  ~ cp /usr/local/etc/redis-sen.conf .
cp: /usr/local/etc/redis-sen.conf: No such file or directory
(Tao) ➜  ~ !!:gs/sen/sentinel
cp /usr/local/etc/redis-sentinel.conf .

如果我们只是部分内容做替换呢? 该如何操作?

只要使用 !!:x-y 来选择上条记录中的参数范围,然后进行替换即可:

(Tao) ➜  ~ mkdir -p data/db1 data/dc2 data/dc3
(Tao) ➜  ~ mkdir -p !!:3-4:gs/c/b
mkdir -p data/db2 data/db3

组合使用

聪明的你应该已经发现, 上面我先写了如何使用历史命令,后来又介绍了如何对上条命令操作,那么把这两部分内容组合起来会产生什么样的效果呢?

(Tao) ➜  ~ mkdir -p data/db1 data/dc2 data/dc3
(Tao) ➜  ~ ls **/**
data/db1:

data/dc2:

data/dc3:
(Tao) ➜  ~ mkdir -p !mkdir:3-4:gs/c/b
mkdir -p data/db2 data/db3
(Tao) ➜  ~ ls **/**
data/db1:

data/db2:

data/db3:

data/dc2:

data/dc3:

对,就像上面这样,我们可以通过各种组合来是我们对以前命令的修改执行更加灵活方便! Enjoy it !

操作部分

操作快捷键(emacs 模式)

  • Ctrl + a : 光标返回首位
  • Ctrl + e : 光标移至末尾
  • Ctrl + p : 上一个命令
  • Ctrl + n : 下一个命令
  • Ctrl + l : 清屏
  • Ctrl + d : 删除当前光标处的内容
  • Ctrl + h : 回退一位
  • Ctrl + b : 光标向左一位
  • Ctrl + f : 光标向右一位
  • Ctrl + u : 剪切光标前的内容(全部)
  • Ctrl + w : 剪切光标前的内容(按词)
  • Ctrl + k : 剪切光标后的内容
  • Ctrl + y : 将剪切的内容复制到光标后
  • Ctrl + t : 交换光标前的两个字符顺序

设置操作模式为 Vi 模式

set -o vi

搜索

Ctrl + r : 搜索历史中输入过的命令

原文发布于微信公众号 - MoeLove(TheMoeLove)

原文发表时间:2017-03-10

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏喃小柯站的原创

彻底地给自己的Android手机来一次清理

手机清理一直是一个烦心事。用清理软件清理虽方便,但每次清理完并没有腾出多少空间。而且第三方清理软件经常会时不时来个弹窗,来个推送。久而久之也就让人为之烦躁。如果...

14720
来自专栏Petrichor的专栏

csdn: 添加站内搜索框

CSDN博客 对我来说是一个很重要的 Online Notebook,我日常会把每天新学到的东西都记录下来以方便将来查阅。

26320
来自专栏腾讯Bugly的专栏

《iOS APP 性能检测》

| 导语 最近组里在做性能优化,既然要优化,就首先要有指标来描述性能水平,并且可以检测到这些指标,通过指标值的变化来看优化效果,于是笔者调研了iOS APP性能...

1.8K50
来自专栏腾讯NEXT学位

webpack 4 测试版 —— 现在让我们先一睹为快吧!

38150
来自专栏小白课代表

软件分享 | C4D R17 安装教程

12140
来自专栏前端架构

批量删除腾讯专栏文章的脚本

批量删除腾讯专栏文章的脚本,腾讯云专栏签约后,抓取文章不插入原来连接,这个我怎么评价了呢!只好删除,走人了

38330
来自专栏美团技术团队

美团点评前端无痕埋点实践

构建一个数据平台,大体上包括数据采集、数据上报、数据存储、数据计算以及数据可视化展示等几个重要的环节。其中,数据采集与上报是整个流程中重要的一环,只有确保前端数...

1.1K60
来自专栏SDNLAB

SDN中的Segment Routing

作者简介:晏志文,原就职于中兴通讯,目前供职于安徽皖通邮电股份有限公司。数通测试专家,本领域从业深耕多年,熟悉传统网络技术及行业解决方案,密切关注新兴网络,IC...

28240
来自专栏FreeBuf

软件逆向之陌路寻踪:突破未注册版软件的限制功能

摘要:试图对一个“太监版”的程序进行完整化,也就是把限制的功能恢复,把阉割的功能添加等等。 试验软件:PixtopianBook.exe (一个通讯录软件) 试...

26450
来自专栏北京马哥教育

干货:Web应用上线之前程序员应该了解的技术细节

问题 Web 应用上线前,程序员应考虑哪些技术细节呢? 如果 Jeff Atwood 忘记把 HttpOnly cookies、sitemaps 和 cros...

35950

扫码关注云+社区

领取腾讯云代金券