Section 24.1: 快速参考
历史记录的互动
# 列出所有以前的命令
history
# 清除历史记录,如果您不小心在命令行中输入了密码,这很有用
history -c
事件指示符
# 执行 bash 历史记录的第 n 行
!n
# 执行最后一个命令
!!
# 执行以 “text” 开头的最后一个命令
!text
# 执行包含 “text” 的最后一个命令
!?text
# 执行在 n 行前的命令
!-n
# 执行最后一个命令,并将命令中第一次出现的 “foo” 替换为 “bar”
^foo^bar^
# 执行当前命令
!#
单词指示符
这些由:与它们引用的事件指示符分开。如果单词指示符不以数字开头,则可以省略冒号 :'!^' 与 '!:^' 相同。
# 执行最新命令的第一个参数
!^
# 执行最近命令的最后一个参数( `!!:$` 的缩写)
!$
# 执行最新命令的第三个参数
!:3
# 执行最后一个命令的参数 x 到 y(含)x 和 y 可以是数字或锚字符 `^ $`
!:x-y
# 执行最后一个命令中除第 0 个之外的所有单词。相当于 :^-$
!*
修改符号
这些修改会修改前面的事件或单词指示符。
# 使用 sed 语法在执行中替换,允许在 s 和备用分隔符之前使用标志
:s/foo/bar/ # 用 bar 替换第一次出现的 foo
:gs|foo|bar| # 用 bar 代替所有 foo
# 从最后一个参数中删除前导路径 (“`tail`”)
:t
# 从最后一个参数 (“head”) 中删除尾随路径
:h
# 从最后一个参数中删除文件扩展名
:r
如果 Bash 变量 HISTCONTROL 包含 ignorespace 或 ignoreboth(或者,HISTIGNORE 包含模式 [ ]*),则可以通过在命令前面加上空格来防止命令存储在 Bash 历史记录中:
# 此命令不会保存在历史记录中
foo # 命令前面加了空格
# 此命令将被保存
bar # 命令前面没有空格
Section 24.2: 使用 sudo 重复上一个命令
$ apt-get install r-base
E: Could not open lock file /var/lib/dpkg/lock - open (13: Permission denied)
E: Unable to lock the administration directory (/var/lib/dpkg/), are you root?
$ sudo !!
sudo apt-get install r-base
[sudo] password for <user>:
Section 24.3: 按模式在命令历史记录中搜索
Press control r and type a pattern.
For example, if you recently executed man 5 crontab, you can find it quickly by starting to type "crontab". The prompt will change like this:
按 'control r' 并键入一个模式。
例如,如果您最近执行了 man 5 crontab,则可以通过开始键入 “crontab” 来快速找到它。提示符将更改如下:
(reverse-i-search)`cr`: man 5 crontab
那里的 ''cr'' 是我到目前为止输入的字符串。这是一个增量搜索,因此当您继续键入时,搜索结果将更新以匹配包含该模式的最新命令。
在运行命令之前,按向左或向右箭头键编辑匹配的命令,或按 Enter 键运行命令。
默认情况下,搜索会查找与模式匹配的最近执行的命令。要进一步回顾历史记录,请再次按 'control r'。您可以反复按它,直到找到所需的命令。
Section 24.4: 新创建的目录并切换到该目录使用 !#:N
$ mkdir backup_download_directory && cd !#:1
mkdir backup_download_directory && cd backup_download_directory
这将替换当前命令的第 N 个参数。在这个例子中,'!#:1' 被替换为第一个参数,即 backup_download_directory。
Section 24.5: 使用 !$
使用命令行时,您可以使用 '!$' 来减少重复:
$ echo ping
ping
$ echo !$
ping
您也可以在重复的基础上进行构建
$ echo !$ pong
ping pong
$ echo !$, a great game
pong, a great game
请注意,在最后一个示例中,我们没有得到 ping pong,a great game,因为传递给上一个命令的最后一个参数是 pong,我们可以通过添加引号来避免这样的问题。继续这个例子,我们的最后一个参数是 game:
$ echo "it is !$ time"
it is game time
$ echo "hooray, !$!"
hooray, it is game time!
Section 24.6: 重复上一个命令并替换
$ mplayer Lecture_video_part1.mkv
$ ^1^2^
mplayer Lecture_video_part2.mkv
此命令会将之前执行的命令中的 1 替换为 2。它只会替换字符串的第一个匹配项,并且等效于 '!!:s/1/2/'。
如果要替换所有匹配项,则必须使用 '!!:gs/1/2/' 或 '!!:as/1/2/'。