Bash捕获命令输出作为命令行

时间:2016-07-14 17:43:42

标签: bash terminal io-redirection tty

无法弄清楚这是否可行,但确实很方便。我想获取bash命令的输出并以交互方式使用它来构建Bash中的下一个命令贝壳。一个简单的例子可能如下:

> 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恢复它?

2 个答案:

答案 0 :(得分:4)

键入M-C-e扩展当前命令行,包括命令替换,就地:

$ $(echo bar)

现在键入M-C-e会将您的行更改为

$ bar

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

对于您的具体示例,您可以从

开始
$ cp $(find . -name myfile.txt)

shell-expand-line扩展为

$ cp /home/me/Documents/2015/myfile.txt

然后您可以使用

进一步扩充
$ cp /home/me/Documents/2015/myfile.txt

从这里开始,您有很多选项可以完成命令行。其中两个更简单

  1. 您可以使用历史记录扩展(!#:1.txt)扩展到目标文件名。
  2. 您可以使用大括号扩展(/home/me/Documents/2015/myfile.txt{,.bak})。

答案 1 :(得分:2)

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

find . -name myfile.txt | pbcopy

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