![从 bash 历史记录中交互绘制以构造完整的命令?](https://linux22.com/image/1370311/%E4%BB%8E%20bash%20%E5%8E%86%E5%8F%B2%E8%AE%B0%E5%BD%95%E4%B8%AD%E4%BA%A4%E4%BA%92%E7%BB%98%E5%88%B6%E4%BB%A5%E6%9E%84%E9%80%A0%E5%AE%8C%E6%95%B4%E7%9A%84%E5%91%BD%E4%BB%A4%EF%BC%9F.png)
在 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>