重新使用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
在剪贴板中。
顺便说一下, pbcopy
和pbpaste
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,并允许您操作它。