![为什么命令历史记录仅在退出时保存](https://linux22.com/image/1567164/%E4%B8%BA%E4%BB%80%E4%B9%88%E5%91%BD%E4%BB%A4%E5%8E%86%E5%8F%B2%E8%AE%B0%E5%BD%95%E4%BB%85%E5%9C%A8%E9%80%80%E5%87%BA%E6%97%B6%E4%BF%9D%E5%AD%98.png)
我正在尝试为每个选项卡/终端保存不同的历史记录文件,但我无法在运行命令后立即保存它。只有在运行“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 端口。