有什么方法可以执行历史记录中的命令?


99

例如:

[root@ip-10-0-7-125 ~]# history | grep free
  594  free -m
  634  free -m | xargs | awk '{print "free/total memory" $17 " / " $ 8}'
  635  free -m
  636  free -m | xargs | awk '{print "free/total memory" $9 " / " $ 10}'
  736  df -h | xargs |  awk '{print "free/total disk: " $11 " / " $9}'
  740  df -h | xargs |  awk '{print "free/total disk: " $11 " / " $8}'
  741  free -m | xargs | awk '{print "free/total memory: " $17 " / " $8 " MB"}'

我只是想知道是否有任何方法可以执行636命令而无需再次键入它,只需键入一些内容加上数字,例如历史记录636之类的内容。


14
你知道ctrl-r吗?
卡洛斯·坎德罗斯

1
是的,我知道,但这并不是我想要的。
将一个

Answers:


170

用bash,就!636可以了。


12
In Linux-这与一个人正在运行的外壳(bash,zsh等)有关,然后与您正在运行该外壳的OS有关。linux上有一些外壳,不支持历史记录。
Zoredache

@Zoredache同样,在Windows上bash的大多数实现中,这也可以正常工作。
Ajedi32

1
当然,不仅是bash,还有其他shell,包括csh。
提请

5
例如,如果您有一个与要运行的命令非常相似的命令,则可以追加:p以打印该命令而不运行它!636:p。这意味着您可以通过按向上箭头轻松地从历史记录中再次选择它,并进行所需的较小更改
AJefferiss 16-4-14

78

是的,这叫做“历史扩展”。看到

LESS='+/^HISTORY EXPANSION' man bash

有关详细信息。

使用感叹号后跟数字可能是最简单的用法:

!636

但是,您也可以直接运行最后执行的命令,而无需知道其历史记录号:

!!

或者您可以运行两个命令:

!-2

但是,我最经常使用的形式是重复最后一个命令的最后一个参数:

echo this text goes into a file > /tmp/afile.txt
cat !$

或者说我正在检查文件。使用制表符补全,我可以执行以下操作:

ls -l /really/long/path/to/some/file
less !$

同样,请阅读手册页以获取更多详细信息:

LESS='+/^HISTORY EXPANSION' man bash

25
交互式Alt-.地比可以更方便!$。它插入的最后一个命令的最后一个参数逐字入行。
ulidtko '16

2
@ulidtko那些特殊的转义记录在哪里(我知道!$,但从未听说过Alt-.)?请问您可以发布链接吗?
edmz '16

5
LESS="+/DEFAULT KEY BINDINGS" man 3 readline/etc/inputrc~/.inputrc。除了bash之外,许多程序都使用libreadline。对于那些这样做的人,您可以免费获得Alt-.,,Ctrl-X-U(撤消),Ctrl-/(描述快捷方式),制表符完成等功能。例如,只需三行PYTHONSTARTUP就可以在标准python REPL中启用制表符补全和历史记录。它将(在大多数情况下)与bash中的工作相同,因为它是由GNU Readline库完成的。阅读专线的手册页详细介绍了这些功能。
ulidtko '16

2
同样,Ctl-UpArrow(或bash上的AltUpArrow)将在历史记录列表中向后滚动。键入几个字符,然后UpArrow仅获得以该字母开头的命令,例如,“ fr(Ctl-Up)”滚动显示OP列表中的所有“ free ...”命令。这也适用于使用readline的gnuplot和gdb之类的东西。
jamesqf

2
@ Ajedi32,请参阅我的答案中的最后粗体行。:)坦率地说,这个答案几乎不了解历史扩展可以做什么。请记住,这是在外壳程序级别上,而不是您正在调用的命令。因此,echo {1..5}随后touch !$将触摸五个文件,而不仅仅是一个。因此严格来说,它不是该行的最后一个参数,而是最后一个外壳程序单词。(也可以尝试echo hello >temp紧随其后echo goodbye !$。)如果您可以想到一种更清晰地表达它的方法,请随时提出建议。
通配符

14

一个不错的选择,如果您不想第一次使用历史记录,请记下数字,等等:

用bash(也许还有其他):

ctrl-r something 

ctrl-r=“交互式反向搜索”)(something=上一个命令的一部分)

这将向您显示包含的最新历史记录行something。要获得以前的版本,请在每次获得前一行时再次执行ctrl -r(单独)。

例如:

ctrl-r  10

以显示包含“ 10”的最新历史记录行(例如,以表示的行$10),并ctrl-r再次显示,直到您找到要查找的历史记录行

当你想要的线出现,只要Enter运行它(或者你也可以对其进行编辑,使用arrow keysbackspacectrl-a去行的开头,ctrl-e去年底, ctrl-k:“杀死”从光标到行尾(=删除+将其保存在缓冲区中) ctrl-y,:从缓冲区中恢复以前杀死的位等)

如果要向前搜索(ctrl-s),则首先需要禁用XON:请参阅https://stackoverflow.com/a/791800/1841533

”只是通过运行禁用XON / XOFF

stty -ixon

”(这样您就可以使用ctrl -s,而无需冻结终端)


如果我这样做并且不小心按了ctrl -r一次,是否有某种方法可以再次在历史记录中进行搜索?
kasperd '16

@kasperd:是的,可以。关于se的许多答案指出:ctrl -s用于正向搜索。
奥利维尔·杜拉克

不幸的是ctrl -s用于冻结终端,bash不会禁用该终端,因此在默认配置下不起作用。(其他程序-例如emacs-禁用按键绑定以冻结终端,以便可以使用ctrl-s进行搜索。)
kasperd 16'Apr9'16

@kasperd:是的,很抱歉没有更早提及(我指出“很多答案”,因为它们确实做到了这一点,但是我没有花时间在评论中键入此内容或提供链接...(我正在使用我的我现在回到家,可以在上面的答案中进行编辑。用于bash历史记录搜索的ctrl-s首先需要您stty -ixon
Olivier Dulac,

该命令将中断ctrl -s的常规使用,因此这不是一个选择。
kasperd '16

7

您可以使用shell内置的fc

fc -s 636

2
这实际上比接受的答案更好,但是您必须删除-s才能获得好处。如果运行fc 636,则将使用缓冲区中历史记录中的命令636 打开编辑器,并且在保存和退出命令(已修改或未修改)时将运行该编辑器。甚至更好的是,这是POSIX兼容的
通配符

@StevenPenny谢谢。是的,我确实知道POSIX是什么,尽管我看不到相关性。无论如何,一些易于访问和包含的文档会很好。
法赫姆·米莎

@FaheemMitha尝试运行“帮助fc”。
通配符

@Wildcard help不是POSIX-可能必须这样做man dash或类似
Steven Penny

@Wildcard谢谢。我倾向于忘记help存在。另一个内置的shell。对于那些想要在新系统上寻求帮助的粗心用户来说,这令人困惑,而他们却面临着大量的垃圾。:-(
Faheem Mitha

3

HSTR- hh命令bashzsh交互式命令选择,比Ctrl-R反向搜索更好:

hh交互式历史记录命令示例

它是交互式的,因此您可以在执行命令之前搜索并编辑该命令。

在Ubuntu上,您可以hh使用以下单行安装:

sudo add-apt-repository ppa:ultradvorka/ppa && sudo apt-get update && sudo apt-get install hh && hh --show-configuration >> ~/.bashrc

或逐步:

sudo add-apt-repository ppa:ultradvorka/ppa
sudo apt-get update
sudo apt-get install hh

hh在Fedora,RHEL或CentOS上安装:

sudo dnf|yum install hstr -y

在macOS上具有homebrew

brew install hh

...然后使用以下命令进行配置:

hh --show-configuration >> ~/.bashrc

这将替换默认的Ctrl-R行为。

运行hh --show-configuration以确定将添加到您的Bash配置文件的内容。

Github的项目主页上提供了更多配置选项:https : //github.com/dvorka/hstr

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.