有没有办法从历史中执行命令?

The*_*One 153 bash command-history

例如:

[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"}'
Run Code Online (Sandbox Code Playgroud)

我只是想知道是否有任何方法可以在不再次键入的情况下执行 636 命令,只需键入一些内容加上数字,例如历史 636 或其他内容。

use*_*825 254

在 bash 中,就!636可以了。

  • `在 Linux 中` - 这更多地与一个人正在运行的 shell(bash、zsh 等)有关,然后是您运行它的操作系统。linux上有不支持历史的shell。 (15认同)
  • 如果你有一个与你想要运行的命令非常相似的命令,你可以附加 `:p` 来打印命令而不运行它,例如 `!636:p`。这意味着您可以通过按向上箭头轻松地从历史记录中再次选择它并进行所需的细微更改 (11认同)

Wil*_*ard 90

是的,这就是所谓的“历史扩展”。看

LESS='+/^HISTORY EXPANSION' man bash
Run Code Online (Sandbox Code Playgroud)

详细信息。

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

!636
Run Code Online (Sandbox Code Playgroud)

但是,您也可以在不知道其历史记录编号的情况下直接运行上次执行的命令:

!!
Run Code Online (Sandbox Code Playgroud)

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

!-2
Run Code Online (Sandbox Code Playgroud)

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

echo this text goes into a file > /tmp/afile.txt
cat !$
Run Code Online (Sandbox Code Playgroud)

或者,假设我正在检查一个文件。使用选项卡完成,我可能会执行以下操作:

ls -l /really/long/path/to/some/file
less !$
Run Code Online (Sandbox Code Playgroud)

再次阅读手册页以获取更多详细信息:

LESS='+/^HISTORY EXPANSION' man bash
Run Code Online (Sandbox Code Playgroud)

  • 在交互方面,`Alt-.` 比 `!$` 更方便。它将最后一个命令 *verbatim* 的最后一个参数插入到行中。 (27认同)
  • `LESS="+/DEFAULT KEY BINDINGS" man 3 readline`、`/etc/inputrc`、`~/.inputrc`。除了 bash 之外,许多程序都使用 libreadline;对于那些这样做的人,您可以免费获得相同的功能,例如`Alt-.`、`Ctrl-XU`(撤消)、`Ctrl-/`(描述快捷方式)、制表符完成等。例如,只需 [三行](http://stackoverflow.com/a/987402/531179) 的 `PYTHONSTARTUP` 就可以在 *stock python REPL* 中启用制表符完成和历史记录。这将(大部分)与在 bash 中的工作方式相同,因为它是 GNU Readline 库来完成这项工作。readline 的联机帮助页详细描述了这些功能。 (5认同)
  • @ulidtko 哪里记录了那些特殊的转义(我知道`!$`,但从未听说过`Alt-.`)?麻烦你发个链接好吗? (2认同)
  • 此外,Ctl-UpArrow(或 bash 上的 AltUpArrow)将在历史列表中向后滚动。键入几个字符,然后 UpArrow 只获取以该字母开头的命令,例如“fr(Ctl-Up)”滚动浏览 OP 列表中的所有“free...”命令。这也适用于使用 readline 的 gnuplot 和 gdb 之类的东西。 (2认同)
  • @ Ajedi32,请参阅我的答案中最后的粗体行。:) 说实话,这个答案几乎没有尝到[历史扩展可以做什么](http://unix.stackexchange.com/a/272866/135943)。请记住,这是在 shell 级别,而不是您正在调用的命令;因此,`echo {1..5}` 后跟`touch !$` 将触及*五个*文件,而不仅仅是一个。所以严格来说,它不是最后一个 *argument* 而是该行的最后一个 shell 词。(也可以尝试 `echo hello >temp` 后跟 `echo goodbye !$`。)如果你能想出更清楚的方法,请随时提出编辑建议。 (2认同)

Oli*_*lac 16

一个不错的,如果你不想第一次历史,记下数字等:

在 bash 中(也许还有其他人):

ctrl-r something 
Run Code Online (Sandbox Code Playgroud)

( ctrl-r= "反向搜索交互") ( something= 前一个命令的一部分)

这将向您显示包含something. 要获得之前的,请再次执行 ctrl-r (单独),每次获得前一行。

前任:

ctrl-r  10
Run Code Online (Sandbox Code Playgroud)

显示包含 '10' 的最新历史行(例如$10,在您的示例中带有,的行),然后ctrl-r再次显示,直到您检索到您要查找的历史行

当您想要的行出现时,只需Enter运行它(或者您也可以编辑它,使用arrow keys, backspace, 并ctrl-a转到行的开头,ctrl-e到达 End, ctrl-k: 以“杀死”从光标到行尾(=deletes+saves it in a buffer), ctrl-y: 从缓冲区恢复之前被杀死的位,等等)

如果要向前搜索(ctrl-s),首先需要禁用 XON:参见/sf/answers/55426031/

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

stty -ixon
Run Code Online (Sandbox Code Playgroud)

"(然后您将能够使用 ctrl-s,而不会冻结终端)


Ste*_*nny 9

您可以使用 shell 内置fc

fc -s 636
Run Code Online (Sandbox Code Playgroud)

  • 这实际上比接受的答案*更好*,但是您必须删除`-s`才能获得好处。如果你运行 `fc 636`,你将打开一个 *editor*,其中包含来自缓冲区历史记录的命令 636,当你保存并退出命令(修改或未修改)时,将运行该命令。更好的是,[这个是符合 POSIX 的](http://pubs.opengroup.org/onlinepubs/9699919799/utilities/fc.html)。 (2认同)

mod*_*lin 5

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
Run Code Online (Sandbox Code Playgroud)

或一步一步:

sudo add-apt-repository ppa:ultradvorka/ppa
sudo apt-get update
sudo apt-get install hh
Run Code Online (Sandbox Code Playgroud)

hh在 Fedora、RHEL 或 CentOS 上安装:

sudo dnf|yum install hstr -y
Run Code Online (Sandbox Code Playgroud)

在 macOS 上homebrew

brew install hh
Run Code Online (Sandbox Code Playgroud)

...然后配置它:

hh --show-configuration >> ~/.bashrc
Run Code Online (Sandbox Code Playgroud)

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

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

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