Answers:
要请求打印命令而不是在替换历史记录后执行命令,请添加:p
修饰符,例如!42:p
。结果命令也将输入到历史记录中,因此您可以按Up编辑它。
如果您设置了histverify
选项(shopt -s histverify
),您将始终有机会编辑历史记录替换的结果。
该fc
内置给人以历史扩展(无字标志)的机会有限,并且让你在外部编辑器中编辑以前的命令。
您可以!prefix
用来引用以开头的最后一个命令prefix
,也!?substring
可以引用以开头的最后一个命令substring
。当您知道要查找的内容时,可以节省很多时间history | less
。
搜索以前的历史记录的另一种方法是增量搜索:按Ctrl+ R并开始输入要查找的内容的子字符串。按Ctrl+ R转到到目前为止搜索字符串的上一个出现位置,按Ctrl+ S如果您走得太远。比其他大多数键Ctrl+ R,Ctrl+ S,Backspace和普通字符终止增量的搜索,并具有其通常的影响(如箭头键移动光标,你已经达到了线,Enter运行该命令)。
stty -ixon
Ctrl-s的操作。
Ctrl-s
很重要,否则有人会像我一样陷入困境。
查看默认情况下history-expand-line
绑定的命令Alt+^
。它将在适当位置扩展该行,然后可以对其进行编辑。
使用Ctrl+r
您可以搜索历史记录:
pbm@tauri ~ $
(reverse-i-search)`xran': xrandr -o normal
您发现的任何命令都可以编辑...
我认为我完全找到了您需要的东西:运行shopt -s histverify
并在下次要使用!n
命令时将不会执行,而只会放在命令行中...
!n:p
吗
我经常想要这个。当我使用csh(和tcsh)时,我有一个成语:
!:88*:p
该惯用法在您在当前命令行上键入的位置(通常是结尾)插入上一个命令的“单词88至最后一个单词”。在csh中,这样的表达式不产生任何单词不是错误。就是说,不需要88这个词,也不必紧随其后。如果没有单词88,则这不会在要键入的命令的末尾添加任何单词,然后将生成的命令行推入历史记录中而不执行。
您可能知道,
*!(例如!!和!-1)是上一个命令;
*:88是单词88(第一个单词-通常是命令-为零),并且csh会要求存在这样的单词,但是...
*:88 *是所有从单词88开始的单词,然后csh会不要求这个词存在;
*:p表示打印,但不执行命令行。
使用或不使用:p,命令行将添加到命令历史记录中。
“为什么是88?” 你想知道?因为它与我需要的*相同。如果您有那么长的命令,则可能需要!:888 *:p。抱歉,这不适用于bash AFAIK。巴什只会说
bash: :88*: bad word specifier
有趣的事实:您的命令通常不需要先执行。
> /tmp/foo echo My command is word 3
在bash和csh中有效。
我通常使用Ctrl+ r搜索,然后Ctrl+ e转到线的末端不执行。