重新使用Bash中最后一个命令的输出

Bash命令的输出是否存储在任何寄存器中? 例如类似于$?东西$? 捕获输出而不是退出状态。

我可以将输出分配给一个variables:

 output=$(command) 

但是这是更键入…

你可以使用这个: $(!!)重新计算(不重新使用)最后一个命令的输出。

!! 自己执行最后的命令。

 $ > echo pierre pierre $ > echo my name is $(!!) echo my name is $(echo pierre) my name is pierre 

答案是不。 Bash不会将任何输出分配给其内存中的任何参数或任何块。 此外,您只能通过允许的接口操作访问Bash。 Bash的私人数据是不可访问的,除非你破解它。

一种方法是使用trap DEBUG

 f() { bash -c "$BASH_COMMAND" >& /tmp/out.log; } trap 'f' DEBUG 

现在最近执行的命令的stdout和stderr将在/tmp/out.log可用

唯一的缺点是会执行两次命令:一次是将输出和错误redirect到/tmp/out.log ,一次是正常的。 也许有一些方法可以防止这种行为。

如果你在Mac上,不介意把你的输出存储在剪贴板而不是写入一个variables,你可以使用pbcopy和pbpaste作为解决方法。

例如,而不是这样来find一个文件,并将其内容与另一个文件进行比较:

 $ find app -name 'one.php' /var/bar/app/one.php $ diff /var/bar/app/one.php /var/bar/two.php 

你可以这样做:

 $ find app -name 'one.php' | pbcopy $ diff $(pbpaste) /var/bar/two.php 

运行第一个命令时,string/var/bar/app/one.php在剪贴板中。

顺便说一下, pbcopypbpaste pb代表剪贴板的同义词。

像konsolebox说的,你必须破解自己的bash。 这是一个很好的例子,说明如何实现这个目标。 stderred存储库(实际上意味着着色stdout)给出了如何构build它的说明。

我试了一下:在.bashrc里面定义了一些新的文件描述符

 exec 41>/tmp/my_console_log 

(数字是任意的),并相应地修改stderred.c ,以便内容也被写入到fd 41. 这种工作,但包含负载NUL字节,奇怪的格式,基本上是二进制数据,不可读。 也许某个对C有很好理解的人可以尝试一下。

如果是这样,所有需要得到最后打印的行是tail -n 1 [logfile]

不确定你需要什么,所以这个答案可能不相关。 你总是可以保存命令的输出: netstat >> output.txt ,但我不认为这就是你要找的。

当然有编程选项, 你可以简单地得到一个程序来读取上面的文本文件,然后将其与一个variables相关联,在Ruby中,我select的语言是,你可以使用'反引号'在命令输出中创build一个variables:

 output = `ls` #(this is a comment) create variable out of command if output.include? "Downloads" #if statement to see if command includes 'Downloads' folder print "there appears to be a folder named downloads in this directory." else print "there is no directory called downloads in this file." end 

将其粘贴在一个.rb文件中,然后运行: ruby file.rb ,它会在命令之外创build一个variables,并允许您操作它。