5.7 Shell 技巧

5.7 Shell 技巧

5.7.1 快捷键表

快捷键快捷键说明
CTRL-A将光标移到行首(在命令行下)
CTRL-B退格 (非破坏性的),这个只是将光标位置往回移动一个位置。
CTRL-C中断,终结一个前台作业。
CTRL-D“EOF” (文件结尾:end of file)。它用于表示标准输入(stdin)的结束。在控制台或 xterm 窗口输入文本时,CTRL-D 删除在光标下的字符。 从一个 shell 中退出 (类似于 exit)。如果没有字符存在,CTRL-D 则会登出该会话。在一个 xterm 窗口中,则会产生关闭此窗口的效果。
CTRL-E将光标移动到行尾(在命令行下)
CTRL-F将光标向前移动一个字符(在命令行下)
CTRL-GBEL。在一些老式打印机终端上,这会引发一个响铃。在 xterm 终端上可能是哔的一声。
CTRL-H擦除(Rubout)(破坏性的退格)。在光标往回移动的时候,同时擦除光标前的一个字符。
CTRL-I水平制表符。
CTRL-J新行(换行[line feed]并到行首)。在脚本中,也可能表示为八进制形式(‘/012′)或十六进制形式(‘/x0a’)。
CTRL-K垂直制表符(Vertical tab)。在控制台或 xterm 窗口输入文本时,CTRL-K 会删除从光标所在处到行尾的所有字符。在脚本中,也可能表示为八进制形式(‘/013′)或十六进制形式(‘/x0b’)。在脚本中,CTRL-K 可能会有不一样的行为,下面的例子给出其不一样的行为:#!/bin/bash## 一个 CTRL-K 垂直制表符的例子 var=KaTeX parse error: Expected 'EOF', got '#' at position 34: …0bTop line/x0a'#̲# 直接输出 echo "var"## 使用 col 来过滤控制字符 echo “$var”
CTRL-L跳纸,换页(Formfeed),清屏。清空终端屏幕。在终端上,这个命令的作用和 clear 命令一样。但当这个命令发送到打印机时,Ctrl-L 会直接跳到纸张(Paper sheet)的末尾。
CTRL-M回车(Carriage return)。
CTRL-N擦除从 history 缓冲区召回的一行文本(在命令行下)。如果当前输入是历史记录中选择的时候,这个是从这个历史记录开始,每按一次,是更接近的一条命令。
CTRL-O产生一个新行(在命令行下)。
CTRL-P从 history 缓冲区召回上一次的命令(在命令行下)。此快捷键召回的顺序是由近及远的召回,即按一次,召回的是前一次的命令,再按一次,是召回上一次之前的命令,这和 CTRL-N 都是以当前的输入为起点,但是两个命令操作刚好相反,CTRL-N 是从起点开始由远及近(如果起点是历史命令的话)。
CTRL-QResume (XON)。恢复/解冻,这个命令是恢复终端的 stdin 用的,可参见 CTRL-S。
CTRL-R回溯搜索(Backwards search)history 缓冲区内的文本(在命令行下)。注意:按下之后,提示符会变成(reverse-i-search)”:输入的搜索内容出现在单引号内,同时冒号后面出现最近最匹配的历史命令。
CTRL-SSuspend(XOFF),挂起。这个是冻结终端的 stdin。要恢复可以按 CTRL-Q。
CTRL-T交换光标位置与光标的前一个位置的字符内容(在命令行下)。比如:echo $var;,假设光标在 a 上,那么,按下 C-T 之后,v 和 a 将会交换位置:echo $avr;。
CTRL-U擦除从光标位置开始到行首的所有字符内容。在某些设置下,CTRL-U 会不以光标位置为参考而删除整行的输入。
CTRL-V在输入文本的时候,按下 C-V 之后,可以插入控制字符。比如:echo -e '/x0a’;和 echo ;这两种效果一样。这点功能在文本编辑器内非常有效。
CTRL-W当在控制台或一个 xterm 窗口敲入文本时, CTRL-W 会删除从在光标处往后(回)的第一个空白符之间的内容。在某些设置里, CTRL-W 删除光标往后(回)到第一个非文字和数字之间的字符。
CTRL-X在某些文字处理程序中,这个控制字符将会剪切高亮的文本并且将它复制到剪贴板中。
CTRL-Y将之前已经清除的文本粘贴回来(主要针对 CTRL-U 或 CTRL-W)。
CTRL-Z暂停一个前台的作业;在某些文本处理程序中也作为替换操作;在 MSDOS 文件系统中作为 EOF(End-of-file)字符。
CTRL-/退出。和 CTRL-C 差不多,也可能 dump 一个”core”文件到你的工作目录下(这个文件可能对你没用)。
CTRL-/撤消操作,Undo。
CTRL-_撤消操作。
CTRL-xx在行首和光标两个位置间进行切换,此处是两个”x”字符。
ALT-B光标往回跳一个词,词以非字母为界(跳动到当前光标所在词的开头)。
ALT-F光标往前跳一个词(移动到光标所在词的末尾)。
ALT-D删除光标所在位置到光标所在词的结尾位置的所有内容(如果光标是在词开头,则删除整个词)。
ALT-BASKSPACE删除光标所在位置到词开头的所有内容。
ALT-C将光标所在位置的字母转为大写(如果光标在一个词的起始位置或之前,则词首字母大写)。
ALT-U将光标所在位置到词尾的所有字母转为大写。
ALT-L将光标位置到词尾的所有字母转为小写。
ALT-R取消所有变更,并将当前行恢复到在历史记录中的原始状态(前提是当前命令是从历史记录中来的,如果是手动输入,则会清空行)。
ALT-T当光标两侧都存在词的时候,交换光标两侧词的位置。如:abc bcd -> bcd abc
ALT-.使用前一次命令的最后一个词(命令本身也是一个词,参见后一篇的 Bang 命令中的词指示符概念)。
ALT-_同 ALT-.。
ALT-数值这个数值可以是正或者是负,这个键单独没有作用,必须后面再接其他内容,如果后面是字符,则表示重复次数。如:[ALT-10,k]则光标位置会插入 10 个 k 字符(负值在这种情况下无效);如果后面接的是命令,则数字会影响后面命令的执行结果,如:[ALT–10,CTRL-D]则向 CTRL-D 默认方向相反(负数)的方向执行 10 次操作。
ALT-<移动到历史记录中的第一行命令。
ALT->移动到历史的最后一行,即当前正在输入的行(没有输入的情况下为空)。
ALT-P从当前行开始向前搜索,有必要则向”上”移动,移动时,使用非增量搜索查找用户提供的字符串。
ALT-N从当前行开始向后搜索,如果有必要向”下”移动,移动时,使用非增量搜索查找用户提供的字符串。
ALT-CTRL-Y在标志点上插入前一个命令的第一个参数(一般是前一行的第二个词)。如果有参数 n,则插入前一个命令的第 n 个词(前一行的词编号从 0 开始,见历史扩展)。负的参数将插入冲前一个命令的结尾开始的第 n 个词。参数 n 通过 M-No.的方式传递,如:[ALT-0,ALT-CTRL-Y]插入前一个命令的第 0 个词(命令本身)。
ALT-Y轮询到删除环,并复制新的顶端文本。只能在 yank[CTRL-Y]或者 yank-pop[M-Y]之后使用这个命令。
ALT-?列出能够补全标志点前的条目。
ALT-*把能够补全[ALT-?]命令能生成的所有文本条目插入到标志点前。
ALT-/试图对标志点前的文本进行文件名补全。[CTRL-X,/]把标志点前的文本当成文件名并列出可以补全的条目。
ALT-~把标志点前的文本当成用户名并试图进行补全。[CTRL-X,~]列出可以作为用户名补全标志点前的条目。
ALT-$把标志点前的文本当成 Shell 变量并试图进行补全。[CTRL-X,$]列出可以作为变量补全标志点前的条目。
ALT-@把标志点前的文本当成主机名并试图进行补全。[CTRL-X,@]列出可以作为主机补全标志点前的条目。
ALT-!把标志点前的文本当成命令名并试图进行补全。进行命令名补全时会依次使用别名、保留字、 Shell 函数、 shell 内部命令,最后是可执行文件名。[CTRL-X,!]把标志点前的文本当成命令名并列出可补全的条目。
ALT-TAB把标志点前的文本与历史记录中的文本进行比较以寻找匹配的并试图进行补全。
ALT-{进行文件名补全,把可以补全的条目列表放在大括号之间,让 shell 可以使用。

自定义快捷键

能永久保存快捷键的地方有两个,全局和用户的配置文件:

  • 全局的是 /etc/inputrc
  • 用户的是在用户的根目录下 ~/.inputrc

5.7.2 命令自动补全功能

在 Bash 中,命令与文件补全是非常方便与常用的功能,我们只要在输入命令或文件时按 Tab,就会自动进行补全。
命令补全是按照 PATH 环境变量所定义的路径查找命令的(后续章节详细介绍),而文件补全是按照文件位置查找文件的。

5.7.3 历史命令

history 命令可以查看曾经输入过什么命令

重复执行

  • 上一次执行

    • 使用向上方向键,并回车执行。
    • 输入 !!,并回车执行。
    • 输入 !-1,并回车执行。
    • 输入 Ctrl+P 组合键并回车执行。
  • 叹号定位法

执行以前执行过的某条命令

!num  #num 通过 history 查看的历史命令编号
  • Ctrl+R 搜索曾经的命令

shell 中按一下 Ctrl+R 组合键,输入关键字,找到需要的命令后回车,命令就会立即执行了。

注意:如果找到的命令和想执行的命令稍微有点不同的话,你可以按一下向左或向右方向键来对命令进行微调,等调整成你想要执行的命令后,再按回车执行。

清除所有的命令

history -c #只是个障眼法,它只是让系统暂时不显示历史命令。当你再次重新登录系统后,以前的历史就又会重新出现。
history -w #用内存中的历史命令覆盖 .bash_histroy 文件的内容,这样,即使 Shell 重新加载也加载不到任何命令了

history 的配置

  1. 设置历史记录的时间显示格式
export HISTTIMEFORMAT='%F %T'     # 注意有个空格, 这样在显示时日期与命令之间会有空格分隔
  1. 控制历史命令记录的总个数
export HISTSIZE=1000         # 设置内存中的 history 命令的个数
export HISTFILESIZE=1000     # 设置文件中的 history 命令的个数
  1. 更换历史命令的存储位置
    一般情况下,历史命令会被存储在 ~/.bash_history 文件中。如果不想存储在这个文件中,而想存储在其他文件中,那么可以通过下面的方式来更改:
export HISTFILE=~/history.log
  1. 其他个性化的配置
export HISTCONTROL=erasedups    # 清除整个命令历史中的重复条目
export HISTCONTROL=ignoredups   # 忽略记录命令历史中连续重复的命令
export HISTCONTROL=ignorespace  # 忽略记录空格开始的命令
export HISTCONTROL=ignoreboth   # 等价于 ignoredups 和 ignorespace

只显示不含有隐私信息的命令

  • 第一种靠谱的解决方案:通过设置 HISTCONTROL=ignorespace,可以让 history 不记录你的特殊输入(命令前加空格),这样可以在一定程度上有效地保护我们的系统。

第 1 步:设置 HISTCONTROL 环境变量:export HISTCONTROL=ignorespace。
第 2 步:输入重要命令时,记得在输入命令前加上空格。
第 3 步:执行 history,可以看到刚输入的重要命令没有出现在 history 中。

  • 第二种靠谱的解决方案:
    第 1 步:设置 HISTIGNORE 环境变量 export HISTIGNORE=*。
    第 2 步:输入重要命令,比如 mysql-uroot -p123。
    第 3 步:查看你的 history,可以看到刚输入的 mysql 命令没有记录在 history 中。
    第 4 步:恢复命令的记录 export HISTIGNORE=。
    第 4 步后,系统又恢复正常,输入的命令又能被正常记录了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值