【问题标题】:How to have history in two files in linux如何在linux中的两个文件中拥有历史记录
【发布时间】:2011-10-21 01:26:21
【问题描述】:

除了作为 HISTFILE 提到的默认文件之外,是否可以将特定用户的历史记录保存在多个文件中? 如果主文件被删除,我希望将其作为备份文件,并让它成为那个文件的备份。

问候, 斯里哈莎·卡鲁鲁。

【问题讨论】:

  • 我认为这是 bash shell,你能确认一下吗?
  • 抱歉回复晚了。是的,它是一个 bash shell。

标签: linux


【解决方案1】:

您可以创建文件的硬链接

cp --link --verbose /home/$USER/.bash_history /somewhere/else/users_history

当他家中的原始文件被删除时,文件仍然存在并且内容不会丢失。

【讨论】:

  • 请注意,虽然硬链接仅在删除其中一个名称时才会保留文件内容。如果某个进程覆盖或以其他方式损坏了文件,它也会影响链接名称。
  • @bigendian:没错。我只建议了这个解决方案,因为它完全符合 OP 删除文件的场景。感谢您的澄清!
【解决方案2】:

很多时候我发现自己在 Bash 中使用 Ctrl-R 来获取一个四倍于终端宽度的旧命令,只是为了发现已经过去了太多天并且它不再在 .bash_history 文件中。这里有两行将跟踪您在 bash 提示符下键入的每个命令行,并且根本不使用任何外部进程,只是简单的 bash。

我解决这个问题的第一个方法是将历史记录中的最大行数增加到一个非常大的数量。但不管它有多大,总有那么一刻我需要一个很长的命令,我在几个月前就输入了它,它已经离开了历史。当我了解 PROMPT_COMMAND 变量时,我想到了当前的解决方案,这是 bash 在显示每个提示之前执行的命令。这是两行:

export HISTTIMEFORMAT="%s "
PROMPT_COMMAND="${PROMPT_COMMAND:+$PROMPT_COMMAND ; }"'echo $$ $USER \
           "$(history 1)" >> ~/.bash_eternal_history'

我为自己设定的一个目标是在不使用任何外部进程的情况下实现它,因此 bash 不必在每次按 ENTER 后派生一个新进程。第一行设置历史行的格式以包含日期作为 Unix 时间戳,因此您现在可以在键入每个命令时。第二行是解决方案的核心,首先确保如果之前设置了 PROMPT_COMMAND,它会在我们的内容之前执行,然后附加一行格式:

PID USER INDEX TIMESTAMP COMMAND

到当前用户主目录中名为 .bash_eternal_history 的文件。

添加用户名,起初似乎没有必要,后来在区分“sudo -s”会话和为“~/”保留相同值的普通会话之间变得有用,因此将行附加到相同的 .bash_eternal_history 文件。

我希望你们中的一些人发现这两行代码和我一样有用。 :-)

【讨论】:

  • 您好,感谢您提供的信息,这正是我需要的,但是如果我们输入一个空命令,前一个命令将存储在永恒文件中。所以请让我知道是否有办法克服这个问题。
【解决方案3】:

hard links 能解决你的问题吗?

您也可以阅读手册页here

【讨论】:

  • 我不认为用另一个问题来回答一个问题实际上很有用。 RTFM 的反答案都不是。
【解决方案4】:

我会编写一个 cronjob,每隔一分钟左右将原始 histfiel 复制到备份位置。您不必担心定义第二个历史文件。 否则您可以将用户输入的每个命令写入备用文件 对于这种方法,请看这里:

bash, run some command before or after every command entered from console

【讨论】:

    猜你喜欢
    • 2014-07-25
    • 1970-01-01
    • 2013-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-19
    • 1970-01-01
    相关资源
    最近更新 更多