每当我需要输入长命令时,我发现引用历史的感叹号非常方便。例如,!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?
执行第一个命令。
我相信您想更改 bash 的 HISTCONTROL 的默认行为。来自这篇文章: 为什么 bash 不存储以空格开头的命令?
如果你想跳过!并允许空格,那么我建议您尝试使用 bash 以外的 shell。鱼壳非常适合您的要求:)
要从您的 bash shell 中尝试,只需键入“fish”
如果你喜欢它,你可以坚持:
感谢 Mark Plotnick 的评论。我找到了解决方案。虽然它没有使用 bash 历史扩展。(我相信在阅读 [bash 参考手册的第 9.3.1 节] 之后使用 bash 历史扩展来实现这一点是不可能的。(https://www.gnu.org/software/bash/manual/html_node/Event-Designators.html)
解决方案是将以下行放入
~/.inputrc
,或取消注释相应行以/etc/inputrc
获得全局效果。对应的代码可以通过按CtrlV和PageUp键找到,命令取自bash 手册 8.4.2 节。
之后,我可以使用PageUpkey 转到 Mark 评论的第一个命令。