Bash 无疑是使用最多的一种 shell。作为用户向操作系统“发号施令”的重要通道,Bash 必须具备接收各种命令,并“安排”各种命令执行的能力(参见 Bash 点滴)。为此,Bash 为用户提供了一个命令编辑环境,在该环境下,用户可以输入编辑各种指令,并对命令执行方式进行各种控制。了解并熟练掌握 Bash 命令编辑环境下的各种操作,是高效使用 Bash,充分发挥 Bash 威力的必然前提。
一、命令编辑控制
Bash 首要定位是一个“命令编辑器”,需为高效编辑各种指令和控制提供便利。“编辑模式”的设计是一个关键问题,即采用何种操作(如键位组合)来处理编辑中的各种需求和要素。无论光标移动抑或编辑,减少方向键操作,提供整体性操作都必不可少,典型如 line 操作和 word 操作。当前已有很多久经考验、广泛使用高效编辑工具及其成熟的“编辑模式”可以借鉴,Bash 无需“重新发明轮子”,提供充分融合利用当前高效编辑工具的模式或机制即可。Bash 命令编辑器模式默认即采用 “emacs 模式”,即 Bash 的编辑快捷键与 emacs 基本一致。当然,Bash 也可根据用户需要配置为其他编辑模式(如 vim 模式)。
1. 光标移动
a)行操作
- Ctrl + a :移动光标到行首 (与 vim 对 a 的定位完全相反)
- Ctrl + e :移动光标到行尾
b)word 操作
- Alt + f :以 word 为单位前移 (与 vim 对 f 的定位一致)
- Alt + b :以 word 为单位后移 (与 vim 对 b 的定位一致)
c)character 操作
- Ctrl + f :以 character 为单位前移
- Ctrl + b :以 character 为单位后移
2. 命令基本编辑操作
1) 删除
a)行操作
- Ctrl + u :从光标处删除至行首(带剪切功能,可与 Ctrl + y 配合使用)
- Ctrl + k :从光标处删除至行尾(带剪切功能,可与 Ctrl + y 配合使用)
b)word 操作
- Ctrl + w :从光标处向前删除一个 word(带剪切功能,可与 Ctrl + y 配合使用)
- Alt + d :从光标处向后删除一个 word(带剪切功能,可与 Ctrl + y 配合使用)
c)character 操作
- Ctrl + d :从光标处向后删除一个 character(相当于backspace)
当整个行没有 character 时,此操作关闭整个 Bash。
2) 复制
- Ctrl + y :在光标后粘贴 (yank 操作)
注:< c-y> 也是 bash 的进程内复制,想要跨进程,必须借助操作系统剪切板,使用 < c-s-v>,这一点 vim 也有类似设置。
3) 屏幕控制
- Ctrl + l :清屏操作。清除 Bash 屏幕已有显示内容,光标置顶行。
- Ctrl + s :锁屏操作。输入编辑操作可继续执行,但内容不在屏幕显示。
- Ctrl + q :解锁操作。Ctrl + s 的逆操作。
3. Bash 默认编辑模式设置
在 ~/.bashrc 中,添加 set -o vi / emacs
来调整 Bash 默认编辑模式。
4. 历史命令的搜索
- ctrl + r :输入关键字,即可在历史命令中查找与关键字匹配的命令并输出。
这项操作可极大提高 bash 的使用效率,非常重要!
二、命令执行控制
Bash 为命令提供了 “前台” 和 “后台” 两种执行方式。
1. Bash 启动关闭
- Ctrl + Alt + T :启动 Bash
- Ctrl + d :关闭 Bash
2. 前后台切换
- & :将命令 “前台–>后台” 执行
- Ctrl + z :将命令 “前台–>后台” 暂停
- fg :将命令 “后台–>前台” 处理
Ctrl + z 与 fg 命令在只用单 bash 进行编辑时非常有用。例如,进行 vim 编辑时,有时需要获取外部信息填入 vim,则此时使用 Ctrl + z 退出 vim,在 bash 中找到相关信息后,再使用 fg 进入 vim,拷贝复制相关信息后继续编辑,可有效提升 vim 的编辑效率。
3. 执行控制
- Ctrl + c :前台命令终止
- kill :后台命令终止或重启
- bg :后台命令执行
三、跨进程(全环境)的复制粘贴(非 Bash 编辑器)
Bash 命令编辑器提供了 “emacs 模式” 的剪切粘贴,但这类操作(参见”命令基本编辑操作“)只局限于 Bash 命令编辑光标环境,即仅限于单个 Bash 进程内部。除此之外,Bash 还提供了利用操作系统剪切板的范围更广的全环境(跨进程)复制粘贴操作。这些操作不仅适用于命令编辑光标环境中的字符串复制粘贴操作,还可应用于其他不可编辑字符的复制粘贴,如 prompt 提示符等;以及其他外部进程(如浏览器)与目标 Bash 进程之间的字符的复制粘贴。
首先,选中要操作的内容(高亮),这是最重要的前提条件,之后可选择如下操作:
option 1. 键盘操作
- Ctrl + Shift + c :复制
- Ctrl + Shift + v :粘贴
option 2. 鼠标操作
鼠标选中要传递数据的目的地位置,点击鼠标中键,即完成数据粘贴的操作。这项操作是 Unix GUI 文化中特有设定,在 Unix 系统 GUI 操作中效率非常高。
这里涉及一个 linux 软件进行数据交换的共性的问题,即软件既有进程内部进行数据交换的需求,也有不同进程之间进行数据交换的需求,尤其是数据处理类软件,类似的需求更为凸显(如 vim,bash),软件设计上也必须提供相应的机制满足上述两种需求。一般来说,软件进程内部数据交换用内部存储机制(如寄存器)完成,软件与外部(不同进程之间)进行数据交换通过操作系统剪切板来实现。在交互式软件中(如 vim,bash),这种不同往往也对应着不同的按键操作。
四、引用变量 — !
作为命令编辑器,bash 中要编辑并执行大量的指令,其中涉及大量的完全重复或部分重复的操作,提供便捷的手段对执行过的指令进行重复利用,可极大提供编辑效率,“引用变量 – !(叹号)” 即为此需求设计。
首先,通过 history 给出编号的历史执行指令,如
$ history
1 echo 1 2 3 4 5
2 ls 6 7 8 9 10
3 echo 11 12 13 14 15
4 cat 16 17 18 19 20
5 echo 21 22 23 24 25
1. 针对 “完整历史指令” 的引用:“! + 数字/字符串”
! 指令 | 说明 |
---|---|
! + n | 引用编号为 n 的历史指令 |
! + -n | 引用倒数第 n 条命令 |
! + ! | 引用上一条命令,与 !-1 等价 |
! + string | 引用以 string 开始 的最近的一条命令, 如 !echo 表示引用 echo 21 22 23 24 25 |
! + ?string? | 引用含有 string 的最近的一条命令, 如 !?6? 表示引用 cat 16 17 18 19 20 |
! + # | 引用当前命令行中现在已经输入的部分, 如 echo 1 2 !# 会执行 echo 1 2 echo 1 2 |
2. 针对 “历史指令中某参数” 的引用:“: + 参数位置”
bash 将命令行指令中的各个字符串元素进行了参数化,从第一个字符串(往往是指令字符串本身)开始,向后的各个参数进行索引编号,索引是从零开始,0 代表指令字符串本身,1 代表第一个参数,$ 代表最后一个参数。
- 先通过 “!操作” 引用历史指令,
- 然后在 “!操作” 后面加上 “: + 参数位置” 来完成对历史指令中特定参数的引用。
指令 | 说明 |
---|---|
!! + : 0 | 引用上一命令的第 0 个参数,即命令本身, 得到的是 echo |
!! + : ^ | 引用上一命令第 1 个参数,可简写为 !^ ,与 !!:1 同义,得到的是 21 |
!! + : $ | 引用上一命令的最后一个参数,可简写为 !$ ,得到的是 25 |
!! + : x-y | 引用上一命令第 x 到第 y 个参数,-y 意为 0-y, 如 !-2:3-4 得到的是 18 19 |
!! + : * | 引用上一命令的所有参数部分,可简写为 !* ,如 !!:* 得到的是 21 22 23 24 25 |
!2 + : n | 引用第 2 个历史命令的第 n 个参数, 如 !2:2 得到的是 7 |
针对 !! 的所有参数引用都可以省略一个 !,如直接使用 !:0, !:1, !: $