这种奇怪的(对我来说)行为已经让我迷惑了多年。
在 bash 中,可以按向上来引用上一个命令。说然后我不小心按Ctrl+W并且我希望恢复以前的命令,但它似乎已经消失了。如果我清除命令,然后重试,它仍然从历史记录中消失。
例如
假设我运行以下命令:
$ ls /etc/sudoers.d/ 10_at-export 010_pi-nopasswd 010_proxy README
现在按Up:
$ ls /etc/sudoers.d/
现在按Up几次Backspace:
$ ls
现在如何ls /etc/sudoers.d/
从这里返回?
对于长命令,我使用鼠标复制和粘贴上述命令#mouseisuncool。
一旦你弄乱了命令,删除它的其余部分,然后按Enter(所有这些都没有使用向上或向下箭头)shell将“执行”空行并在命令历史记录中创建一个新条目,而不是更改旧的,所以在此之后,您将能够使用向上箭头正常返回到已删除的命令。
尝试这个:
nosuchcommand
并按下Enternosuchcommand
命令并以您想要的任何方式将其删除nosuchcommand
命令重新出现:)您通过向上箭头所做的确实是直接编辑您的命令历史记录。因此,调用命令
ls /etc/sudoers.d/
并对其进行编辑会有效地更改该历史记录项。要有效地“复制”命令并修改副本而不是历史项目,请使用鼠标(...不,开玩笑的!!)
默认 bash 功能
要有效地“复制”命令并修改副本而不是历史项,请使用反向搜索功能,即“ Ctrl+ ” r。键入两个或三个字母,例如,
sud
直到看到命令。如果您的历史记录中有多个匹配项,您可以继续按Ctrl+r直到出现您希望的命令,或者再输入几个字母。看到命令后,按+Ctrl或a箭头键会将命令“复制”到提示符。这将在执行后成为另一个历史项目。HomeLeft
电源提示:模糊查找器
高级用户可以安装模糊查找。它包括替换Ctrl+的默认行为R,其中历史记录中的匹配命令出现在列表中。Enter在所需的行上“复制”它在提示符下。
Alt-r或Esc+r是您正在寻找的内容的 readline 键绑定。
在bash 手册页的 readline 部分:
即使您已经向上或向下箭头离开历史项目然后再次返回它,您也可以使用它。
(M 代表 Meta。在普通键盘/X11/终端设置上,您的 Alt 键将作为终端的“元”。或者等效Esc地,如果您的终端是,您可以在按下另一个键之前手动按下以应用相同的东西设置得不够好,无法让 alt 正常工作。)
该
undo
命令绑定到Ctrl- /,它将撤消上一次击键。对于 control-w (
unix-word-rubout
(Cw)),您也可以使用Ctrl- y(yank
) 将数据粘贴回来,就像在 Emacs 中一样。类似地,对于backward-kill-word
(M-Rubout,在普通键盘/终端/X11 配置上是 Alt+Backspace 或 Escape+Backspace),被终止的文本进入终止环,您可以在其中拉出它。(在 Cy 之后,My 循环通过杀戮环,因此您仍然可以进行较旧的杀戮。)有许多方便的行编辑命令,但所有可用的列表非常庞大且压倒性的。我绝对不认识他们中的大多数。在大多数情况下,能够使用 ctrl+arrows 或 Mb / Mf 一次将光标移动整个“单词”,并杀死向前/向后的单词(和 yank)就足够了。(我在另一个答案中提到了其中一些)
如果你按下Ctrl+ ,这不是 Bash 的工作方式C
此外,运行缩短的命令将恢复历史更改并创建一个新条目。
(
.inputrc
您还可以使用一个设置,revert-all-at-newline
,它可以使提交命令恢复对所有其他历史条目的所有更改。)Ctrl+Y将恢复删除的文本。
逐步撤消:我有时会犯错误,只想修复最后一个更改或最后几个更改。最近我发现了ctrl+ x, ctrl+ u。如果您从头开始,则逐步执行“撤消”,直到您到达原始命令或空行。
您始终可以使用命令查找以前使用的
history
命令,然后使用:!(number of the command in the history):s/(what you wish to correct)/(your correction)/
例如,给定历史记录中的以下命令:
如果我想用连字符替换下划线,因为正确的命令是
brave-browser
,我会使用:更多信息:https ://ss64.com/bash/history.html