bash 是否提供了将前一个命令的最后一行输出插入到命令行的方法?
例如,假设我刚刚运行ls -1
,输出是
file1
file2
file3
file3
是否有一个组合键可以在光标位置插入文本?
(类似于Alt+ .,插入前一个命令的最后一个参数,但在这里我想粘贴输出,而不是命令本身。)
答案1
这是一个不完整的解决方案。我认为它或多或少可以发挥作用。
首先,我们安排通过在环境中运行来捕获所有键盘输出script
。(这样做有很多问题;见下文。)我们需要将标志传递-f
给,script
以便它立即将输出刷新到 typescript 文件。我们还在中选择一个文件名/tmp
:
script -f /tmp/typescript
在脚本环境中,我们定义了一个键盘快捷键来提取打字稿文件的最后一行并将其推送到历史记录中:(我假设您不经常输入这些命令。bash 中的一个错误会阻止您将命令绑定到长度超过两个字节的序列,例如,Ctl+yCtl+y这会消除所有键。)Fn
bind -x '"\C-y\C-y":history -s $(tail -n2 X|head -n1)'
现在,要将最后一行输出插入当前命令行,我们“只需”输入ctl-y ctl-y ! ! esc ^
将最后一行输出复制到历史记录中,然后插入历史记录扩展,然后触发历史记录扩展。可能有更好的方法可以做到这一点,但这种方法可行。不过,这需要很多按键,所以我们将其分配给键盘宏:
bind '"\eOP":"\C-y\C-y!!\e^"'
在某种程度上,这是可行的。然而,现在我们需要处理 的丑陋之处script
,这可以节省输出就像它生成时一样、VT-102 控制代码等。它会保存您输入的内容,与您输入的内容完全一样,包括您用退格键覆盖的所有错误、退格键和新字符。它会保存ctl-m
在每行末尾发送的回车符 ( )。简而言之,它并不是您想要插入到命令行中的真正文本。
但从概念上讲,它是可行的。它所需要的只是一个更好的工具来保存会话输出,也许还有一种更优雅的方式来插入调用 shell 命令的结果,而不是将其推送到历史记录中然后再将其取出。
答案2
我认为您最接近的答案是:
$ do_something_with "$(!!|tail -1)"
答案3
http://www.gnu.org/software/bash/manual/bashref.html#Miscellaneous-Commands
壳扩展线 (MCe)
像 shell 一样扩展行。这将执行别名和历史扩展以及所有 shell 字扩展(请参阅 Shell 扩展)。
例如:
$ touch one two three four
$ echo `ls | tail -n1`
ctrl+ alt+e
$ echo two
答案4
对我来说有用的解决方案(尽管不是 100% 真实的答案)基于 rici 和 glenn jackman 的回答,以及将键绑定到该命令。
Glenn 的命令将再次运行最后一个程序,捕获其最后一行并用命令行上的行内容替换自身:
"$(!!|tail -1)"
我想明确地说:这个技巧将 再次运行命令,所以,根据具体情况,它可能是有害的、缓慢的、或完全错误的 - 根据具体情况。
最后一件事是绑定组合键:
我使用Alt+因为它类似于给出最后输入参数+/的组合键 Alt.
bind '"^[/":"\"$(!!|tail -1)\""'
现在将绑定命令添加到我的配置文件(.bashrc 或 .profile 或其他文件)。