如何使用Bash自动将上一个命令的输出捕获到变量中?

148

我想要能够在后续命令中使用最后一个执行的命令的结果。例如:

$ find . -name foo.txt
./home/user/some/directory/foo.txt

现在假设我想要能够使用编辑器打开文件,删除它或者进行其他操作,例如:

mv <some-variable-that-contains-the-result> /some/new/location

我该怎么做?也许可以使用一些bash变量吗?

更新:

澄清一下,我不想手动分配事物。我想要的是像内置的bash变量一样的东西,例如:

ls /tmp
cd $_

$_ 保存上一个命令的最后一个参数。我想要类似的东西,但是希望输出的是上一个命令的结果。

最终更新:

Seth的答案很好用。需要注意的几点是:

  • 在第一次尝试解决方案时不要忘记touch /tmp/x
  • 只有上一个命令的退出码为成功时才会存储结果

看到你的编辑后,我想删除我的答案。不知道你是否正在寻找任何内置的东西。 - taskinoor
我找不到任何内置的东西。我在想是否可能通过.bashrc来实现它?我认为这将是一个非常方便的功能。 - armandino
很抱歉,你只能将输出重定向到文件或管道中,或者捕获它,否则它无法被保存。 - bandi
4
没有 Shell 和终端的合作,您无法完成此操作,而它们通常不会合作。请参见 Unix Stack Exchange 上的 How do I reuse the last output from the command line?Using text from previous commands' output - Gilles 'SO- stop being evil'
6
命令输出未被捕获的主要原因之一是其大小可以任意增大,一次可能有多兆字节。虽然并非总是这么大,但大量输出会引起问题。 - Jonathan Leffler
显示剩余8条评论
22个回答

0
find . -name foo.txt 1> tmpfile && mv `cat tmpfile` /path/to/some/dir/

这是另一种方式,虽然有点不太规范。


找到当前目录下名为foo.txt的文件,将其路径保存到临时文件tmpfile中,并将该文件移动到path/to/some/dir目录下,最后删除临时文件tmpfile。 - Kevin

0

Shell中没有像Perl一样的特殊符号,可以存储上一个命令的echo结果。

学会使用管道符号和awk。

find . | awk '{ print "FILE:" $0 }'

在上面的例子中,你可以这样做:
find . -name "foo.txt" | awk '{ print "mv "$0" ~/bar/" | "sh" }'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接