每当我需要输入长命令时,我发现感叹号来引用历史非常方便。例如,!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 转到第一个命令,正如马克评论的那样。