我正在使用一个命令行工具,该工具提供了许多子命令,这些子命令都使用相同的二进制文件,例如tool foo
、tool bar
等,并且在我工作时,这些命令被放入我的 Bash shell 历史记录中,例如:
7322 [2021-04-16 15:37:45 +0000] tool foo .
7323 [2021-04-16 15:37:47 +0000] tool bar
7324 [2021-04-16 15:37:50 +0000] tool baz
7325 [2021-04-16 15:38:01 +0000] tool qux -a -b asdf -c=100 /var/lib/foo/...
7326 [2021-04-16 15:38:15 +0000] htop
7327 [2021-04-16 15:38:21 +0000] tool foo . -x
确切的工具是专有的(其确切功能无关),并且不具有帮助跟踪和调用其自身命令的特定功能。
例如,我想回忆一下命令 7325 tool qux -a -b asdf -c=100 /var/lib/foo/...
(假设它还不够新,无法多次点击向上箭头)。命令和参数经常变化,以至于建立 Bash 别名似乎不实用或不方便(要么编辑 .bashrc,要么在 shell 关闭时丢失别名)。我非常有信心最后的当我运行时tool qux
,它具有我想要使用的正确参数,或者是我无论如何都需要编辑的相当安全的参数集。
我知道我可以运行 history | grep qux
查找历史索引,然后运行!7325
。有什么办法我可以直接地通过在 Bash 提示符中输入一组按键来回忆起它吗?!tool qux
不起作用,因为在这种情况下它将运行tool foo . -x qux
。我尝试引用它,但看起来扩展发生得更早。
答案1
您可以使用 bash 的“反向交互式搜索”,通常可以通过Ctrl+访问R。该组合键将弹出此提示:
(reverse-i-search)`':
在那里,您可以开始编写命令,它将从您的历史记录中自动完成,最新的先完成。但是,它与您输入的整个字符串匹配,因此tool q
会立即带回tool qux -a -b asdf -c=100 /var/lib/foo/...
.那应该做你想做的事。
从man bash
:
reverse-search-history (C-r)
Search backward starting at the current line and moving `up'
through the history as necessary. This is an incremental
search.