从历史记录中运行带有参数的命令

从历史记录中运行带有参数的命令

每当我需要输入长命令时,我发现感叹号来引用历史非常方便。例如,!ssh可用于调用ssh我最后使用的命令。但是,当将空格分隔的参数添加到搜索中时,我无法让它工作。

通过执行!ssh -i,我希望执行以字符串“ssh -i”开头的最后一个命令。但是,调用的实际命令是ssh带有任何参数的最后一个命令,然后将“-i”附加到该命令。

我可以使用!?ssh -i?,但这意味着做一些不同的事情,我相信应该有一个简单的方法来实现这一点。我也懒得history|grep ...每次打字。

那么,如上所述,我如何引用历史中以包含空格的字符串开头的命令呢?

编辑看来我对问题的解释还不够清楚。假设我有以下历史

ssh -i identity host1
echo ssh -i
ssh host2

现在如果我运行!ssh,第三个命令ssh host2将被执行。我希望键入!ssh -i以执行第一个命令,但是ssh host2 -i实际上却执行了(这会导致错误)。我可以用来!?ssh -i?执行第一个命令仅当第二个命令不存在时

答案1

我相信您想更改 bash 的 HISTCONTROL 的默认行为。从这篇文章: 为什么 bash 不存储以空格开头的命令?

组织控制

以冒号分隔的值列表,控制命令如何保存在历史列表中。如果值列表包含ignorespace,则以空格字符开头的行不会保存在历史列表中。 ignoredups 值会导致不保存与先前历史记录条目匹配的行。 ignoreboth 的值是ignorespace 和ignoredups 的简写。

如果您想跳过!并允许空格,那么我建议您尝试 bash 以外的 shell。鱼壳非常适合您的要求:)

须藤 apt-get 安装鱼

要在 bash shell 中尝试,只需输入“fish”

如果你喜欢它,你可以坚持下去:

chsh -s /usr/bin/fish

答案2

感谢马克·普洛特尼克的评论。我找到了解决办法。虽然它没有使用 bash 历史扩展。 (我相信在阅读[bash参考手册第9.3.1节]后使用bash历史扩展来实现这一点是不可能的。(https://www.gnu.org/software/bash/manual/html_node/Event-Designators.html

解决方案是将以下行放入 中~/.inputrc,或取消注释相应行/etc/inputrc以获得全局效果。

"\e[5~": history-search-backward
"\e[6~": history-search-forward

可以通过按 找到对应的CtrlV代码PageUp,命令取自bash 手册第 8.4.2 节

之后,我可以使用PageUpkey 转到第一个命令,正如马克评论的那样。

相关内容