行操作
2023-1-19
| 2023-8-2
0  |  阅读时长 0 分钟
type
status
date
slug
summary
tags
category
icon
password
Property
 

 
Bash内置了Readline库,具有这个库提供的很多“行操作”功能,比如命令的自动补全,可以大大加快操作速度。默认采用 Emacs 快捷键,也可以改成 Vi 快捷键。
 
如果想永久性更改编辑模式(Emacs / Vi),可以将命令写在~/.inputrc文件,这个文件是 Readline 的配置文件。
 
Bash 默认开启这个库,但是允许关闭。
 
下面介绍的快捷键都属于 Emacs 模式。

光标移动

Readline 提供快速移动光标的快捷键:
  • Ctrl + a:移到行首。
  • Ctrl + b:向行首移动一个字符,与左箭头作用相同。
  • Ctrl + e:移到行尾。
  • Ctrl + f:向行尾移动一个字符,与右箭头作用相同。
  • Alt + f:移动到当前单词的词尾。
  • Alt + b:移动到当前单词的词首。
上面快捷键的 Alt 键,也可以用 ESC 键代替。
 

清除屏幕

Ctrl + l快捷键可以清除屏幕,即将当前行移到屏幕的第一行,与clear命令作用相同。
 

编辑操作

下面的快捷键可以编辑命令行内容。
  • Ctrl + d:删除光标位置的字符(delete)。
  • Ctrl + w:删除光标前面的单词。
  • Ctrl + t:光标位置的字符与它前面一位的字符交换位置(transpose)。
  • Alt + t:光标位置的词与它前面一位的词交换位置(transpose)。
  • Alt + l:将光标位置至词尾转为小写(lowercase)。
  • Alt + u:将光标位置至词尾转为大写(uppercase)。
使用Ctrl + d的时候,如果当前行没有任何字符,会导致退出当前 Shell,所以要小心。
 
剪切和粘贴快捷键如下:
  • Ctrl + k:剪切光标位置到行尾的文本。
  • Ctrl + u:剪切光标位置到行首的文本。
  • Alt + d:剪切光标位置到词尾的文本。
  • Alt + Backspace:剪切光标位置到词首的文本。
  • Ctrl + y:在光标位置粘贴文本。
同样地,Alt 键可以用 Esc 键代替。
 

自动补全

命令输入到一半的时候,可以按一下 Tab 键,Readline 会自动补全命令或路径。比如,输入cle,再按下 Tab 键,Bash 会自动将这个命令补全为clear
如果符合条件的命令或路径有多个,就需要连续按两次 Tab 键,Bash 会提示所有符合条件的命令或路径。
除了命令或路径,Tab 还可以补全其他值。如果一个值以$开头,则按下 Tab 键会补全变量;如果以~开头,则补全用户名;如果以@开头,则补全主机名(hostname),主机名以列在/etc/hosts文件里面的主机为准。
 
自动补全相关的快捷键如下:
  • Tab:完成自动补全。
  • Alt + ?:列出可能的补全,与连按两次 Tab 键作用相同。
  • Alt + /:尝试文件路径补全。
  • Ctrl + x /:先按Ctrl + x,再按/,等同于Alt + ?,列出可能的文件路径补全。
  • Alt + !:命令补全。
  • Ctrl + x !:先按Ctrl + x,再按!,等同于Alt + !,命令补全。
  • Alt + ~:用户名补全。
  • Ctrl + x ~:先按Ctrl + x,再按~,等同于Alt + ~,用户名补全。
  • Alt + $:变量名补全。
  • Ctrl + x $:先按Ctrl + x,再按$,等同于Alt + $,变量名补全。
  • Alt + @:主机名补全。
  • Ctrl + x @:先按Ctrl + x,再按@,等同于Alt + @,主机名补全。
  • Alt + *:在命令行一次性插入所有可能的补全。
  • Alt + Tab:尝试用.bash_history里面以前执行命令,进行补全。
上面的Alt键也可以用 ESC 键代替。
 

操作历史

Bash 会保留用户的操作历史。有了操作历史以后,就可以使用方向键的,快速浏览上一条和下一条命令。
退出当前Shell时,Bash会将用户在当前Shell的操作历史写入~/.bash_history文件,默认储存500个操作。环境变量HISTFILE指向这个文件:
history命令会输出这个文件的全部内容:
 
输入命令时,按下Ctrl + r快捷键,就可以搜索操作历史,选择以前执行过的命令。这时键入命令的开头部分,Shell 就会自动在历史文件中,查询并显示最近一条匹配的结果,这时按下回车键,就会执行那条命令。
下面的方法可以快速执行以前执行过的命令:
 
同理,!echo也会执行最近一条以echo开头的命令。
注:!string语法只会匹配命令,不会匹配参数。所以!echo H不会执行echo Hello World,而是会执行echo Goodbye,并把参数H附加在这条命令之后。同理,!echo H G也是等同于echo Goodbye命令之后附加H G
 
由于!string语法会扩展成以前执行过的命令,所以含有!的字符串放在双引号里面,如果后面有非空格的字符,就很有可能报错。
 
history 命令
history命令能显示操作历史,即.bash_history文件的内容:
使用该命令,而不是直接读取.bash_history文件的好处是,它会在所有的操作前加上行号,最近的操作在最后面,行号最大。
通过定制环境变量HISTTIMEFORMAT,可以显示每个操作的时间:
%F相当于%Y - %m - %d%T相当于%H : %M : %S
只要设置HISTTIMEFORMAT这个环境变量,就会在.bash_history文件保存命令的执行时间戳。如果不设置,就不会保存时间戳。
环境变量HISTSIZE设置保存历史操作的数量:
 
如果不希望保存本次操作的历史,可以设置HISTSIZE等于0。
如果HISTSIZE=0写入用户主目录的~/.bashrc文件,那么就不会保留该用户的操作历史。如果写入/etc/profile,整个系统都不会保留操作历史。
环境变量HISTIGNORE可以设置哪些命令不写入操作历史:
 
如果想搜索某个以前执行的命令,可以配合grep命令搜索操作历史:
 
操作历史的每一条记录都有编号。知道了命令的编号以后,可以用感叹号 + 编号执行该命令。执行.bash_history里面的第8条命令:
history命令的-c参数可以清除操作历史:
 
相关快捷键
下面是一些与操作历史相关的快捷键。
  • Ctrl + p:显示上一个命令,与向上箭头效果相同(previous)
  • Ctrl + n:显示下一个命令,与向下箭头效果相同(next)
  • Alt + <:显示第一个命令
  • Alt + >:显示最后一个命令,即当前的命令
  • Ctrl + o:执行历史文件里面的当前条目,并自动显示下一条命令。这对重复执行某个序列的命令很有帮助
 
感叹号!的快捷键如下:
  • !!:执行上一个命令
  • !nn为数字,执行历史文件里面行号为n的命令
  • !-n:执行当前命令之前n条的命令
  • !string:执行最近一个以指定字符串string开头的命令
  • !?string:执行最近一条包含字符串string的命令
  • !$:代表上一个命令的最后一个参数
  • !*:代表上一个命令的所有参数,即除了命令以外的所有部分
  • ^string1^string2:执行最近一条包含string1的命令,将其替换成string
 
^string1^string2的例子:
如果希望确定是什么命令,然后再执行,可以打开histverify选项。这样的话,使用!快捷键所产生的命令,会先打印出来,等到用户按下回车键后再执行。
 
 

其他快捷键

  • Ctrl + j:等同于回车键(LINEFEED)。
  • Ctrl + m:等同于回车键(CARRIAGE RETURN)。
  • Ctrl + o:等同于回车键,并展示操作历史的下一个命令。
  • Ctrl + v:将下一个输入的特殊字符变成字面量,比如回车变成^M
  • Ctrl + [:等同于 ESC。
  • Alt + .:插入上一个命令的最后一个词。
  • Alt + _:等同于Alt + .
Alt + .快捷键,对于很长的文件路径,有时会非常方便。因为 Unix 命令的最后一个参数通常是文件路径。
cd命令后按下Alt + .,就会自动插入foo_bar
 
  • 计算机基础
  • Linux
  • Shell脚本
  • 运算脚本(script)
    目录