Bash将命令的输出捕获为命令行的未完成输入

Bash将命令的输出捕获为命令行的未完成输入,bash,terminal,io-redirection,tty,Bash,Terminal,Io Redirection,Tty,我不知道这是否可行,但肯定会很方便。我想获取bash命令的输出,并以交互方式使用它在bash shell中构造下一个命令。下面是一个简单的例子: > find . -name myfile.txt /home/me/Documents/2015/myfile.txt > cp /home/me/Documents/2015/myfile.txt /home/me/Documents/2015/myfile.txt.bak 现在,我可以做: find . -name myfile.

我不知道这是否可行,但肯定会很方便。我想获取bash命令的输出,并以交互方式使用它在bash shell中构造下一个命令。下面是一个简单的例子:

> find . -name myfile.txt
/home/me/Documents/2015/myfile.txt

> cp /home/me/Documents/2015/myfile.txt /home/me/Documents/2015/myfile.txt.bak
现在,我可以做:

find . -name myfile.txt -exec cp {} {}.bak \;
or
cp `find . -name myfile.txt` `find . -name myfile.txt`.bak
or
f=`find . -name myfile.txt`; cp $f $f.bak
我知道。但有时您需要做一些更复杂的事情,而不仅仅是向文件名添加扩展名,而不是参与${f%%txt}.text.bak等随着复杂度的不断提高,只需将最后一个命令的结果弹出到交互式shell命令行中,并使用emacs样式的编辑键即可完成所需操作,这将变得更简单、更快

那么,是否有某种方法可以将命令的结果通过管道传回交互式shell,并将其挂起。或者通过管道将其直接传输到剪切/粘贴缓冲区,并使用快速ctrl-v进行恢复

键入M-C-e可展开当前命令行,包括命令替换:

$ $(echo bar)
现在输入M-C-e将把您的行更改为

$ bar
M-C-e是Readline函数shell expand line的默认绑定

对于您的特定示例,您可以从

$ cp $(find . -name myfile.txt)
它通过外壳展开线展开到

然后,您可以使用

$ cp /home/me/Documents/2015/myfile.txt
从这里开始,您可以选择许多选项来完成命令行。其中两个比较简单的是

您可以使用历史扩展!:1.txt扩展到目标文件名。 您可以使用大括号扩展/home/me/Documents/2015/myfile.txt{.bak}。 键入M-C-e可展开当前命令行,包括就地替换命令:

$ $(echo bar)
现在输入M-C-e将把您的行更改为

$ bar
M-C-e是Readline函数shell expand line的默认绑定

对于您的特定示例,您可以从

$ cp $(find . -name myfile.txt)
它通过外壳展开线展开到

然后,您可以使用

$ cp /home/me/Documents/2015/myfile.txt
从这里开始,您可以选择许多选项来完成命令行。其中两个比较简单的是

您可以使用历史扩展!:1.txt扩展到目标文件名。 您可以使用大括号扩展/home/me/Documents/2015/myfile.txt{.bak}。
如果您在Mac上,可以使用pbcopy将命令的输出放入剪贴板,以便将其粘贴到下一个命令行:

find . -name myfile.txt | pbcopy

在X显示器上,您可以使用xsel-input-clipboard或-primary执行相同的操作,也可以使用其他一些选择名称,具体取决于您的窗口管理器。您还可以使用xclip,其工作原理与此类似。

如果您在Mac上,您可以使用pbcopy将命令输出放入剪贴板,以便将其粘贴到下一个命令行:

find . -name myfile.txt | pbcopy

在X显示器上,您可以使用xsel-input-clipboard或-primary执行相同的操作,也可以使用其他一些选择名称,具体取决于您的窗口管理器。您也可能有可用的xclip,其工作原理类似。

如果您使用vi模式,shell expand line默认情况下不会绑定到任何内容,但您可以使用bind命令来修复此问题。在vi的正常模式下,我把它绑定到了*上,所以我可以按ESC-*来做这件事。bind-mvi命令“*:shell-expand-line”谢谢,这对我有用。默认情况下,我没有xterm中的keybinding,但我可以创建它。我只需要命令行上的输出,这样我就可以将ctrl-k输入我的readline kill ring,然后在需要时ctrl将其拉回来。顺便说一句,由于我使用的是触摸板,所以用鼠标方式进行操作对我来说非常尴尬。它需要选择上一行,按住拇指并精确拖动,然后用鼠标中键单击,同时用三个手指轻触。不知道我在这个动作中损失了多少小时。如果你使用vi模式,默认情况下shell expand line不会绑定到任何东西,但是你可以使用bind命令来修复这个问题。在vi的正常模式下,我把它绑定到了*上,所以我可以按ESC-*来做这件事。bind-mvi命令“*:shell-expand-line”谢谢,这对我有用。默认情况下,我没有xterm中的keybinding,但我可以创建它。我只需要命令行上的输出,这样我就可以将ctrl-k输入我的readline kill ring,然后在需要时ctrl将其拉回来。顺便说一句,由于我使用的是触摸板,所以用鼠标方式进行操作对我来说非常尴尬。它需要选择上一行,按住拇指并精确拖动,然后用鼠标中键单击,同时用三个手指轻触。不知道我在这次演习中损失了多少小时。是的!如果我使用-primary而不是-clipboard,它最终会进入我的x选择缓冲区Yes!如果我使用-primary而不是-clipboard,它最终会出现在我的x选择缓冲区中