为什么命令历史记录仅在退出时保存

为什么命令历史记录仅在退出时保存

我正在尝试为每个选项卡/终端保存不同的历史记录文件,但我无法在运行命令后立即保存它。只有在运行“exit”时才会保存历史记录。

这是一个问题,因为我想要实现的是在终端或计算机崩溃时保留历史记录的副本。

在互联网上查找后,我的 .bashrc 文件中的内容如下:

export HISTFILE="$HOME/HISTORIES/bash_history_$(basename $(tty))_$(date '+%Y-%m-%d_%H-%M-%S_%Z')"
export HISTCONTROL=ignoreboth
export HISTFILESIZE=10000
export HISTSIZE=10000
shopt -s histappend
PROMPT_COMMAND=$(history -a; $PROMPT_COMMAND)

知道我做错了什么吗?

谢谢。

答案1

你没有正确分配 PROMPT_COMMAND。当你写

PROMPT_COMMAND=$(history -a; $PROMPT_COMMAND)

您正在运行“history -a”(不产生任何输出),然后运行 ​​$PROMPT_COMMAND(在启动脚本期间可能为空),并将这两个命令的输出(空字符串)分配给 PROMPT_COMMAND。您想要的只是:

PROMPT_COMMAND='history -a'

如果你想将其附加到当前存在的命令,请执行

PROMPT_COMMAND+="history -a${PROMPT_COMMAND+=; }$PROMPT_COMMAND"

答案2

由于某些我无法理解的原因,这是有效的:

export HISTFILE_NEW="$HOME/HISTORIES/bash_history_$(basename $(tty))_$(date '+%Y-%m-%d_%H-%M-%S_%Z')"
export HISTCONTROL=ignoreboth
export HISTFILESIZE=10000
export HISTSIZE=10000
shopt -s histappend
PROMPT_COMMAND="history -w $HISTFILE_NEW; $PROMPT_COMMAND"

虽然这不

export HISTFILE="$HOME/HISTORIES/bash_history_$(basename $(tty))_$(date '+%Y-%m-%d_%H-%M-%S_%Z')"
export HISTCONTROL=ignoreboth
export HISTFILESIZE=10000
export HISTSIZE=10000
shopt -s histappend
PROMPT_COMMAND="history -a; $PROMPT_COMMAND"

当然,第一个解决方案比理论上好的解决方案(第二个)要慢,因为每次写入新命令时都会保存整个历史记录。

因此,如果有人知道为什么会出现这种情况以及如何解决这个问题,我将不胜感激。

答案3

回答意图而不是字面问题:

查看使用脚本。这将为您提供命令及其输出。请注意,这不是万能药,因为任何使用光标定位的命令以后都很难破译。

命名脚本-制作终端会话的typescript

概要脚本 [-a] [-c 命令] [-f] [-q] [-t] [文件]

描述脚本将终端上打印的所有内容打印成一份打字稿。对于需要交互式会话的硬拷贝记录作为作业证明的学生来说,这很有用,因为打字稿文件可以稍后用 lpr(1) 打印出来。

如果给出了参数文件,脚本会将所有对话保存在文件中。如果没有给出文件名,则将 typescript 保存在文件 typescript 中。

选项:

  -a'        Append the output to file or typescript, retaining the priorcontents.

-c COMMAND 运行 COMMAND 而不是交互式 shell。这样,脚本就可以轻松捕获程序的输出,当其 stdout 不是 tty 时,程序的行为会有所不同。-f' 每次写入后刷新输出。这对于远程协作非常有用:一个人执行“mkfifo foo; script -f foo”,另一个人可以使用“cat foo”实时监督正在执行的操作。

-q' 安静。

-t' 将时间数据输出到标准错误。此数据包含两个字段,以空格分隔。第一个字段表示自上次输出以来经过了多少时间。第二个字段表示这次输出了多少个字符。此信息可用于重放具有实际输入和输出延迟的打字脚本。

当分叉的 shell 退出时,脚本结束(control-D 退出 Bourne shell (sh(1)),对于 C-shell,使用 exit、logout 或 control-d(如果未设置 ignoreeof),csh(1))。

某些交互式命令(例如 vi(1))会在 typescript 文件中产生垃圾。脚本最适合不操作屏幕的命令,其结果旨在模拟硬拷贝终端。...

在 Google 上搜索“man script”。如果您有特定的操作系统,请将其包括在内。这是 Linux 版本,但 *BSD、Mac 也存在类似的版本。可能也有 Windows 端口。

相关内容