从 bash 历史记录中交互绘制以构造完整的命令?

从 bash 历史记录中交互绘制以构造完整的命令?

在 bash 提示符下,可以使用向上和向下箭头键浏览命令历史记录。 (我也经常使用 CTRL+R。)是否可以在不替换光标左侧的字符串的情况下执行此操作。

例如,我可能使用 ls 找到两个文件:

$ ls ../../blah/foo/bar/CMakeLists.txt

$ ls /usr/include/c++/4.7.2/armv7l-unknown-linux-gnueabihf/bits/c++config.h

现在我想将第二条路径分流到第一个文件中。我首先按向上箭头;然后按 CTRL+A;然后使用 delete 从开头删除 ls:

$ /usr/include/c++/4.7.2/armv7l-unknown-linux-gnueabihf/bits/c++config.h

我现在想使用 >> 将此路径附加到 CMakeLists.txt 文件;稍后我将在文本编辑器中编辑该文件。我想要创建的命令是:

$ echo /usr/include/c++/4.7.2/armv7l-unknown-linux-gnueabihf/bits/c++config.h >> ../../blah/foo/bar/CMakeLists.txt

如果我可以以交互方式滚动历史记录来找到 CMakeLists.txt 路径,同时保持 .../c++config.h 部分不变,那就太好了。

一种可能性是使用 !! 和 !-N 事件指示器,但如果可能的话,我更喜欢一些交互式的东西;比如向上和向下箭头;或 CTRL+R。

答案1

(我将使用 Readline 文档中使用的键命名法,即 Control 键由 表示C,所以C-k也是CTRL-K

使用 找到第一个C-r,然后按C-d或 Del 3 次删除ls。然后C-k删除(剪切)该行的剩余部分。然后C-r搜索另一个。C-e移动到行尾。输入>>。然后C-y复制(粘贴)第一个路径。

因此,C-k(kill) 和C-y(yank) 可能是完成这项工作的最佳工具。

答案2

如果您熟悉 vi,您可以使用将 bash 设置为 vi 模式set -o vi,然后使用常规 vi 命令。

例如,在您的情况下f.y$,在第一个命令行中拉出路径,然后使用 转到下一行j,键入$p以将先前拉出的文本附加到行尾,最后使用 清理该行0cwecho<esc>f a>><esc>

相关内容