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

我可以将输出赋值给一个变量:

output=$(command)

但那更多的是打字……


当前回答

我有一个想法,但我没有时间立即尝试实施。

但如果你做了下面这样的事情:

$ MY_HISTORY_FILE = `get_temp_filename`
$ MY_HISTORY_FILE=$MY_HISTORY_FILE bash -i 2>&1 | tee $MY_HISTORY_FILE
$ some_command
$ cat $MY_HISTORY_FILE
$ # ^You'll want to filter that down in practice!

IO缓冲可能有问题。此外,文件可能会变得太大。人们必须想出解决这些问题的办法。

其他回答

一种方法是使用DEBUG陷阱:

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

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

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

受到anubhava回答的启发,我认为这实际上是不可接受的,因为它将每个命令运行两次。

save_output() { 
   exec 1>&3 
   { [ -f /tmp/current ] && mv /tmp/current /tmp/last; }
   exec > >(tee /tmp/current)
}

exec 3>&1
trap save_output DEBUG

这样,最后一个命令的输出就在/tmp/last中,并且该命令不会被调用两次。

你可以使用$(!!) 重新计算(而不是重新使用)上一个命令的输出。

的! !自行执行最后一个命令。

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

我认为使用脚本命令可能会有帮助。类似的,

脚本-c bash -qf fifo_pid . sh 在解析后使用bash特性进行设置。

就像konsolebox说的,你必须黑进bash本身。这里有一个很好的例子来说明如何实现这一点。stderred存储库(实际上是为stdout上色)给出了如何构建它的说明。

我尝试了一下:在.bashrc中定义一些新的文件描述符,比如

exec 41>/tmp/my_console_log

(数字是任意的),并相应地修改stderred.c,以便内容也被写入fd 41。它可以工作,但是包含大量的NUL字节,奇怪的格式,基本上是二进制数据,不可读。也许对C语言很了解的人可以尝试一下。

如果是这样,那么获取最后打印行的所有内容都是tail -n 1 [logfile]。