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

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

output=$(command)

但那更多的是打字……


当前回答

仅用于非交互式命令的演示:http://asciinema.org/a/395092

为了也支持交互式命令,您必须从util-linux中修改脚本二进制以忽略任何屏幕重画控制台代码,并从bashrc运行它以将登录会话的输出保存到一个文件中。

其他回答

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

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

$ 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缓冲可能有问题。此外,文件可能会变得太大。人们必须想出解决这些问题的办法。

可以使用-exec命令在命令的输出信息上执行命令。所以这将是一个输出的重用作为一个例子给出了下面的find命令:

find . -name anything.out -exec rm {} \;

你在这里说->找到一个名为anything的文件。在当前文件夹中,如果找到,删除它。如果没有找到,则将跳过-exec之后的剩余部分。

如果你在mac上,并且不介意将输出存储在剪贴板中,而不是写入到变量中,你可以使用pbcopy和pbpaste作为解决方案。

例如,与其这样做来查找一个文件并将其内容与另一个文件进行区分:

$ 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

当你运行第一个命令时,字符串/var/bar/app/one.php就在剪贴板中。

顺便说一下,pbcopy和pbpaste中的pb代表粘贴板,是剪贴板的同义词。

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

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

exec 41>/tmp/my_console_log

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

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

答案是否定的。Bash不向内存中的任何参数或块分配任何输出。此外,您只能通过允许的接口操作来访问Bash。Bash的私人数据是无法访问的,除非你黑进去。