Bash 如何自动保存最后一个命令I';我(每次)都跑步吗?

Bash 如何自动保存最后一个命令I';我(每次)都跑步吗?,bash,shell,command-line,Bash,Shell,Command Line,如果我想将最后一个命令的输出存储在一个文件中,比如~/.last_command.txt(覆盖上一个命令的输出),我应该如何在bash中这样做,以便将输出同时发送到stdout和该文件?我想这会涉及到管道到tee~/.last_command.txt,但我不知道管道到哪里,我肯定不想将它添加到我手动运行的每个命令中 另外,我如何扩展它以保存最后n个命令的输出?在bash下,这似乎达到了预期的效果 bind 'RETURN: "|tee ~/.last_command.txt\n"' 您可以将其

如果我想将最后一个命令的输出存储在一个文件中,比如
~/.last_command.txt
(覆盖上一个命令的输出),我应该如何在bash中这样做,以便将输出同时发送到stdout和该文件?我想这会涉及到管道到
tee~/.last_command.txt
,但我不知道管道到哪里,我肯定不想将它添加到我手动运行的每个命令中


另外,我如何扩展它以保存最后n个命令的输出?

在bash下,这似乎达到了预期的效果

bind 'RETURN: "|tee ~/.last_command.txt\n"'
您可以将其添加到bashrc文件中以使其永久化

我应该指出这并不完美。只需按enter键,即可获得:

matt@devpc:$ |tee ~/.last_command.txt
bash: syntax error near unexpected token `|'

所以我认为它需要做更多的工作。

这将打破程序/功能的预期,但是

exec 4>&1
PROMPT_COMMAND="exec 1>&4; exec > >(mv ~/.last_command{_tmp,}; tee ~/.last_command_tmp)"
如果可以记录所有输出,则可以简化:

exec > >(tee ~/.commands)

启动新会话时(登录后或打开终端后),可以启动另一个“嵌套”shell,并重定向其输出:

<...login...>
% bash | tee -a ~/.bash_output
% ls  # this is the nested shell
% exit
% cat ~/.bash_output
% exit

%bash | tee-a~/.bash|u输出
%这是嵌套的外壳
%出口
%cat~/.bash_输出
%出口

实际上,您甚至不必每次都输入嵌套的shell。您只需将
/etc/passwd
中的shell命令从
bash
替换为
bash | tee-a~USERNAME/.bash_输出
覆盖1个命令:

script -c ls ~/.last_command.txt
$ script ~/.last_command.txt
$ command1
$ command2
$ command3
$ exit
如果需要多个命令:

script -c ls ~/.last_command.txt
$ script ~/.last_command.txt
$ command1
$ command2
$ command3
$ exit

如果要在1次登录会话期间保存,请将“脚本”附加到.bashrc

这是错误的方法;许多命令(
while
for
循环、
if
语句等)跨越多行,因此您不希望在每行之后添加管道。这确实可以像您提到的那样工作,但有一些缺点。你提到的那个,就一个。它还可以从
ls
之类的内容中删除诸如颜色和缺少换行符等格式。在命令前面加上
unbuffer
将添加此项,但这意味着
ls--color
的别名不起作用,我必须指定
--color
。最后,查看您刚刚键入的命令和
历史记录的输出,这会导致非常糟糕的终端会话。我希望bash有更好的方法来处理这个问题。你也许应该解释一下你为什么要这么做。我们可能会找到一个更好的解决方案,而不是只关注到目前为止您是如何处理问题的。一个类似的问题,但对于tcsh:您最好在运行shell的终端程序中执行此操作,而不是直接在shell本身中执行此操作。我可以看到一个解决方案,它可能在99.9%的时间内有效,但最后的0.01%将成为一个绝对的灾难。它所需要的只是一个程序以一种奇怪和古怪的方式操纵文件描述符,这种方式与你必须操纵文件描述符的奇怪和古怪方式相冲突。