首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >粘贴最后一个输出并在bash中编辑它

粘贴最后一个输出并在bash中编辑它
EN

Stack Overflow用户
提问于 2016-02-16 13:46:11
回答 4查看 625关注 0票数 2

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

我经常遇到以下情况。

代码语言:javascript
复制
$ 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的输出存储在某个地方(可能会杀死??)并使用C-y命令粘贴它,并在终端上编辑它。

有什么好办法吗?(仅在本例中,有一些智能的单行命令。但这些并不是我们想要的答案。我想要一个通用的解决方案。)

另一个例子

假设我记得在与memo...相同的目录中有一个libfreetype.a,但我忘记了目录名。

代码语言:javascript
复制
$ 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适用于这种情况,但如果我想改变路径本身,我需要考虑另一种技术。)

EN

回答 4

Stack Overflow用户

发布于 2017-09-04 19:59:33

正如注释中所指出的,在终端中可能没有这样做的通用方法。但是可以将命令的输出重定向到将stdin复制到剪贴板(如xclip )的程序中。如果要在终端中插入和编辑复制的文本,则需要在复制之前删除换行符。考虑以下脚本:

copy.bash

代码语言:javascript
复制
#!/bin/bash
tr '\n' ' ' | xclip 

用法:

代码语言:javascript
复制
$ locate libfreetype.a | copy
$ cd # now press <shift> + <insert>
$ cd /usr/lib/x86_64-linux-gnu/libfreetype.a # continue editing

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

tr '\n' ' '命令将所有换行符转换为空格。如果要将文本粘贴到命令行中,则需要这样做。如果输出包含多个换行符,它将剥离尾换行符并连接行。如果使用普通xclip,所有换行符都会按字面顺序粘贴,这会导致bash在粘贴后立即运行命令,因此不允许对其进行编辑。

如果命令的输出(例如locate)是多行的,并且您希望只选择其中一个要复制的(而不是复制all),则可以使用iselectiselect读取输入并显示用于选择行/行的交互式菜单,并将其打印到standart输出。像这样使用它:

代码语言:javascript
复制
$ locate pattern | iselect -a | tr '\n' ' ' | xlip
# locate prints several lines
# iselect allows user to select one line interactively
# the result is copied to clipboard
$ # <shift> + <insert>

这也可以是一个脚本:

icopy.bash

代码语言:javascript
复制
#!/bin/bash
iselect -am | tr '\n' ' ' | xclip

( -m选项允许选择几行而不是一行)

用法:

代码语言:javascript
复制
$ locate pattern | icopy

这些办法的缺点:

  • 它只适用于X会话,因为xlcip需要运行X会话
  • 您需要安装新的软件(xclip和可选的iselect)
  • 在运行命令之前,需要显式地重定向输出;因此,从技术上讲,不能将其视为 redirect 。但这是我自己找到的最好的解决办法。

顺便说一句,这里是我的本地机器上我经常使用的脚本:

代码语言:javascript
复制
$ cat ~/bin/copy
#!/bin/bash
paste -sd\ | tr -d '\n' | xsel --clipboard
echo "Copied: $(xsel --clipboard --output)" >&2
$ echo hello | copy
Copied: hello

链接:man iselect人肉夹子曼塔尔扬克

票数 2
EN

Stack Overflow用户

发布于 2021-02-28 13:52:03

您可以从您的script (人工脚本)中运行.bashrc,它生成会话输出的实时日志。并绑定用于在编辑器中打开日志文件的快捷方式,以便将已插入的文本插入到$READLINE_LINE中。

但是script从交互式程序(如编辑器)中捕获原始输出,所以如果可以修改script以跳过交互输出,它就可以工作。下一步将是解析输出,以使导航更快。

下面是一个只用于非交互式工具的.bashrc片段:https://asciinema.org/a/395092

票数 0
EN

Stack Overflow用户

发布于 2022-03-24 19:11:41

我注意到这个问题的解决方案是由终端仿真器基蒂给出的。我们可以使用名为“提示”的特性和默认配置的键盘快捷方式。

和原来的问题一样,让我们考虑一下情况。

代码语言:javascript
复制
$ locate libfreetype.a
/usr/lib/x86_64-linux-gnu/libfreetype.a
$             # you want to input /usr/lib/x86_64-linux-gnu here

如果您使用的是kitty,您可以键入ctrl+shift+p,然后输入l。您将进入一个模式来从屏幕中选择一行。当您可以选择上一行时,它将粘贴到当前终端输入中。

如果在正式文件中找到详细信息的话。与该操作相关的配置如下所示。

代码语言:javascript
复制
map ctrl+shift+p>l kitten hints --type line --program -

这意味着kitten hints --type line --program -是从ctrl+shift+p映射出来的命令,后面是l

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35434291

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档