我喜欢我的 bash 历史。有时我发出了很长的命令,我真的依赖我的 bash 历史记录来快速恢复它们。我通过以下方式增加了历史记录大小:
HISTSIZE=100000
HISTFILESIZE=200000
在我的 .bashrc 中
我也有别名:
alias h='history | tail'
alias hg='history | grep'
这让我可以做h
,hg some_text
这就是真的便利
我的问题是:我可以将此历史文件移动到新机器吗?例如,我的机器最近崩溃了,我不得不重建它。我在放入不同的 .history 文件(可能会替换已有的文件)时会遇到任何问题吗?我是否需要确保替换它,或者我实际上可以将两个历史文件附加在一起而不会出现问题吗?
答案1
是的。您可以将旧的历史记录文件复制到新的安装中。您还可以将其与旧/新合并。
- 如果没有
HISTTIMEFORMAT
设置历史文件只保存命令。 如果设置了,则每个命令都有一个时间戳,前面有一个哈希值:
#1122334455 command1 #1122334459 command2
但请注意,如果您发出例如:
$ echo 'foo
> bar
> baz' >> some_file
它将被保存为:
#1122334459
echo 'foo
bar
baz' >> some_file
但history
将显示:
4 CMD_TIME echo 'foo
5 CUR_TIME bar
6 CUR_TIME baz' >> some_file
命令如下:
$ foo | \
bar | \
baz
如果您设置 ,则将保留为一个shopt -s cmdhist
。
我使用各种但经常使用的东西,例如:
HISTSIZE=500000
HISTFILESIZE=500000
# Ignore dupes and space commands
HISTCONTROL=ignoreboth
# Save and show timestamps
HISTTIMEFORMAT='%F %T '
# append to the history file, don't overwrite it
shopt -s histappend
# Save and reload the history after each command finishes
# This one I have a function to turn on/off. Effect is that commands are
# accessible in all terminals after execution.
export PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND"
我还定期备份历史文件,并使用一些脚本和别名来搜索历史记录——甚至可以追溯到很多年前。有时我会想起1.5年前我做过类似现在正在做的事情,并且可以快速查找历史。
至于时间戳,我使用两种变体。通过临时设置为“”history
显示带时间戳的内容和不带时间戳的另一个显示内容。HISTTIMEFORMAT
如果时间戳丢失,则使用当前时间(大约)。如果存在时间戳,历史记录将按时间排序。
因此:
.bash_history
(简化的时间戳)
#timestamp 000012
some command
#timestamp 000002
some other command
$ history
1 13 aug 2013 10:44 some other command
2 13 aug 2013 12:13 some command
然而,有理由相信排序的历史文件更有效(bash 不必进行任何洗牌)。
答案2
我认为您可以毫无问题地移动文件,或者也可以追加。
对于附加:
cd ~
mv .bash_history .bash_history_new
cp /mnt/oldfs/home/olduser/.bash_history ~/
cat .bash_history_new >> .bash_history
如果您遇到任何问题,您可以撤消此操作:
mv .bash_history_new .bash_history
答案3
My.bash_history
通常只是一个符号链接/dev/null
(即,我的历史记录从未保存在磁盘上)。因此,当我启动 shell 时,没有历史记录可供访问。 然而,历史记录确实会累积,这意味着 bash 在内存中而不是在历史文件中执行此操作。事实上man bash
说(下历史):
启动时,历史记录从变量 HISTFILE 命名的文件(默认 ~/.bash_history)初始化。 [...] 读取历史文件时,以历史注释字符开头并紧随其后的数字的行将被解释为前一个历史行的时间戳。根据 HISTTIMEFORMAT 变量的值,可以选择性地显示这些时间戳。当交互式 shell 退出时,最后的 $HISTSIZE 行将从历史列表复制到 $HISTFILE。
我留下了有关时间戳的部分,因为如果您查看它,这有助于解释历史文件的格式(它是纯文本列表)。这里的要点是历史文件仅在 shell 首次启动时使用,然后在退出时再次使用(以附加最近的历史记录)。
由于格式只是散布有时间戳的命令列表,并且即使文件不包含任何内容(例如 /dev/null 链接),bash 也能正常工作,所以我无法想象导入一个命令会产生任何负面后果。您甚至可以手动将内容附加到其中,省略时间戳 - 至少,您可以尝试一下。如果 shell 出了问题,只需退出并恢复旧的历史记录即可。
如果需要,您还应该能够通过$HISTFILE
在启动 shell 之前交换文件或导出来将多个历史记录用于多种目的。如果将它们设置为只读(或者可能$HISTFILE
随后重置?这取决于 shell 是否在最后检查该变量,或使用初始值),那么当 shell 退出时它们也不会被附加。