粘贴最后一个输出并在bash中

时间:2016-02-16 13:46:12

标签: bash

我喜欢在不触碰鼠标的情况下使用bash(在linux上)。

我经常遇到以下情况。

$ locate libfreetype.a
/usr/lib/x86_64-linux-gnu/libfreetype.a
$ cd /usr/lib/x86_64-linux-gnu 

在这种情况下,我复制/usr/lib/x86_64-linux-gnu/并使用鼠标粘贴或键入它。我不想那样做。

理想情况下,locate libfreetype.a的输出存储在某个地方(可能是killring ??)并用C-y命令粘贴它并在终端上编辑它。

有没有好方法呢? (仅针对此示例情况,有智能的单行命令。但这些并不是理想的答案。我想要一个通用的解决方案。)

另一个例子

假设我记得memo...libfreetype.a位于同一目录中,但我忘记了目录名称。

$ locate libfreetype.a
/usr/lib/x86_64-linux-gnu/libfreetype.a  
$ nano /usr/lib/x86_64-linux-gnu/memo  # Tab completion here
$ nano /usr/lib/x86_64-linux-gnu/memo_xxx.txt 

如果我可以缓存输出/usr/lib/x86_64-linux-gnu/libfreetype.a并粘贴它,那么事情就很容易了。 (nano $(dirname $(locate libfreetype.a))/memo_xxx.txt适用于这种情况,但如果我想改变路径本身,我需要考虑另一种技术。)

3 个答案:

答案 0 :(得分:1)

可能这个小脚本会帮助你:

复制

#!/bin/bash
tr '\n' ' ' | xclip 

用法:

$ locate libfreetype.a | copy
$ cd 
# now press <shift> + <insert>
$ cd /usr/lib/x86_64-linux-gnu/libfreetype.a
# you can continue editing

xclip命令将其输入复制以粘贴到X应用程序中。

tr '\n' ' '命令将所有换行符转换为空格。如果要将文本粘贴到命令行中,则需要此选项。它剥离尾部换行符,如果要复制的输出包含多行,则将这些行连接在一起。使用普通xclip时,所有换行符都是字面上粘贴的。这将导致bash运行命令,并且不允许您编辑任何内容。

此外,如果您的命令输出(例如locate)包含多行,并且您想选择一个进行复制(而不是复制所有这些行),您可能会发现它方便使用iselectiselect读取输入并显示用于选择行/行的交互式菜单,并将其打印到标准输出。

你可以这样使用它:

$ locate pattern | iselect -a | tr '\n' ' ' | xlip
# locate prints several lines
# you select one of them interactively with iselect
# the result is copied to clipboard and you can use it now
$ # <shift> + <insert>

如果您愿意,请将其放在脚本中:

<强> icopy

#!/bin/bash
iselect -am | tr '\n' ' ' | xclip

-m选项允许选择多行而不是一行

现在:

$ locate pattern | icopy

此解决方案的缺点:

  • 它仅适用于X会话,因为xlcip需要运行X会话
  • 您需要安装新软件(xclip,并且可选择iselect
  • 在运行命令
  • 之前,您需要手动重定向输出

另见:

  • man iselect(链接:man.cx/iselect)
  • man xclip(链接:linux.die.net/man/1/xclip)
  • man tr(链接:linux.die.net/man/1/tr)
  • yank

(不能发布2个以上的链接)

答案 1 :(得分:0)

您可以从 .bashrc 运行 script (man script),它会生成会话输出的实时日志。并绑定一个在编辑器中打开日志文件的快捷方式,这样你就可以将抽取的文本插入到 $READLINE_LINE 中。

但是 script 捕获来自交互式程序(例如编辑器)的原始输出,因此如果可以修改 script 以跳过交互式输出,它会起作用。下一步是解析输出,以加快导航速度。

这是一个仅对非交互式工具执行此操作的 .bashrc 片段:https://asciinema.org/a/395092

答案 2 :(得分:-3)

你可以使用

!$

shell$ echo myDir/                                                                                                                                                                                                                                    
myDir/                                                                                                                                                                                                                                                 
shell$ cd !$                                                                                                                                                                                                                                          
cd myDir/                                                                                                                                                                                                                                              
shell$ pwd                                                                                                                                                                                                                                            
/home/myDir