使用 bash 历史记录获取以前的命令,复制它,然后“运行”它,但是使用注释的命令

只是一个问题,以提高我的 bash技能。我总是这样做:

$ history | grep some_long_command


...
...
123 some_long_command1.........
124 some_long_command2.........
...

然后,我可以运行我通过以下操作找到的命令:

!123

然而,我经常想这样做:

some_long_command1foobar

例如,在我运行命令之前更改它。您可以使用 bash 来运行这个命令吗:

#some_long_command1

所以它得到了评论。

然后,我不必使用我的鼠标来突出显示命令,编辑它,然后运行它(我可以只使用键盘-更快)。

我想我可以编写一个脚本来完成它,但是可能已经在某个地方内置了一些功能... ... ?

52074 次浏览

我建议不要使用 history 命令,而是使用 ctrl+r并开始键入该命令。当您按下一个箭头键,好像要去修改它,它将退出自动完成识别,并会让您编辑前运行。

更新: 另外,如果您想循环遍历包含您刚刚键入的字符串的不同命令,请继续按 ctrl+r

!123:gs/old/new/

将运行命令123,将字符串“ old”替换为字符串“ new”。

你也可以把

shopt -s histverify

.bash_profile中,这会导致任何历史展开显示在命令行上,而不运行它,从而允许您在这样做之前进行编辑。

还可以尝试使用 fc命令在历史记录中编辑该命令。

WIKI 说,

Fc 是 Unix 上的一个标准程序,它列出、编辑和重新执行, 以前输入到交互式 shell 中的命令 命令; 快来帮忙将显示使用信息。


除了 反向增量搜索(Ctrl + R) ,我们还有一些 Bash的快捷键:

来自 man bash:

previous-history (C-p)
Fetch the previous command from the history list, moving back in the list.
next-history (C-n)
Fetch the next command from the history list, moving forward in the list.
beginning-of-history (M-<)
Move to the first line in the history.
end-of-history (M->)
Move to the end of the input history, i.e., the line currently being entered.
reverse-search-history (C-r)
Search backward starting at the current line and moving 'up' through the history as necessary. This is an incremental search.
forward-search-history (C-s)
Search forward starting at the current line and moving 'down' through the history as necessary. This is an incremental search.
non-incremental-reverse-search-history (M-p)
Search backward through the history starting at the current line using a non-incremental search for a string supplied by the user.
non-incremental-forward-search-history (M-n)
Search forward through the history using a non-incremental search for a string supplied by the user.
yank-nth-arg (M-C-y)
Insert the first argument to the previous command (usually the second word on the previous line) at point. With an argument n, insert the nth word from the previous command (the words in the previous command begin with word 0). A negative argument inserts the nth word from the end of the previous command. Once the argument n is computed, the argument is extracted as if the "!n" history expansion had been specified.
yank-last-arg (M-., M-_)
Insert the last argument to the previous command (the last word of the previous history entry). With an argument, behave exactly like yank-nth-arg. Successive calls to yank-last-arg move back through the history list, inserting the last argument of each line in turn. The history expansion facilities are used to extract the last argument, as if the "!$" history expansion had been specified.
shell-expand-line (M-C-e)
Expand the line as the shell does. This performs alias and history expansion as well as all of the shell word expansions. See HISTORY EXPANSION below for a description of history expansion.
history-expand-line (M-^)
Perform history expansion on the current line. See HISTORY EXPANSION below for a description of history expansion.
insert-last-argument (M-., M-_)
A synonym for yank-last-arg.
operate-and-get-next (C-o)
Accept the current line for execution and fetch the next line relative to the current line from the history for editing. Any argument is ignored.
edit-and-execute-command (C-xC-e)
Invoke an editor on the current command line, and execute the result as shell commands.

实际上,您可以将 :p附加到命令后面来打印它,而不必实际运行它:

$ ls -la
$ !!:p

将打印出 ls -la作为以前的命令而不运行它,您可以只按 (向上)找到它并编辑它。

你也可以

!123:p

打印出第123条命令作为你之前的命令。

你可以点击 M-^ 进入编辑模式(Mac 上的选项-shift-6)。

输入:

123M-^

您将编辑命令 # 123。它有点像使用 ctrl-r,但是从感叹号语法开始。

不要使用 history命令,而是将 history-search-backward/history-search-forward绑定到可以很容易记住的键快捷键(我更喜欢 PgUp/PgDown)。要做到这一点,把这个放入你的 .inputrc文件:

"<key code>":  history-search-backward
"<key code>":  history-search-forward

要获得 <key code>,在 shell 中键入 Ctrl-V <key>,并在输出中用 \e替换起始 ^[

设置完成后,您可以键入 some并按 PgUp 获得 some_long_command。如果你需要 some_long_command with_some_arg,但是历史上后面有一个类似的命令 some_long_command with_some_other_arg,你可以循环直到你输入 some然后反复点击 PgUp,或者你可以输入 some,点击 PgUp,移动光标到两个命令开始不同的地方,输入几个字符然后再次点击 PgUp。这种快速浏览/区分相似命令的能力使它在我看来是一个比 Ctrl-R更舒适的工具。

你可能想尝试“建议框”-像历史 https://github.com/dvorka/hstr-它读取 Bash 的历史,并允许快速导航。

hh

要获取最后一个命令,只需键入 hh,导航到该命令并使用右箭头在命令行上获取该命令(您可以在其中编辑该命令和/或添加注释)。

^ p 获取 unix/solaris 中的最后一个类型化命令

放下

别名 r = ‘ fc-s’

在你的 .bashrc(主目录) 然后你就可以输入了

r <whatever>

在命令提示符下,执行历史记录中最后一个 <whatever>命令(相同的参数)的副本。如果你觉得有必要,只需点击箭头查看你执行了什么。