macOS 下 Terminal 的 history 是如何工作的?

2020-02-21 09:15:30 +08:00
 whileFalse

在多窗口下,history 无法收集全部命令历史。想知道它是以何种规律收集历史的。

1602 次点击
所在节点    问与答
6 条回复
Howlaind
2020-02-21 09:29:12 +08:00
历史是 Shell 保存的,以 Bash 为例,它会在每次会话开始时读入~/.bash_history 文件,会话结束时保存。
所以当多个 Shell 同时运行时,~/.bash_history 只会存为最近一个关闭的 Shell 历史。
whileFalse
2020-02-21 09:38:21 +08:00
@Howlaind #1 谢谢。请问如何解决此问题呢?
Howlaind
2020-02-21 09:49:48 +08:00
@whileFalse #2 搜索的结果大概是通过修改环境变量 PROMPT_COMMAND,加入'history -a; history -r'让每个命令执行后都写并读一次~/.bash_history 文件来解决。我自己没试过,请谨慎使用。
whatisnew
2020-02-21 09:54:13 +08:00
history 1
whileFalse
2020-02-21 10:05:23 +08:00
@whatisnew #4 请问这个命令有什么作用?
Kobayashi
2020-02-21 21:05:06 +08:00
shell != terminal. 你这是 shell 问题。

既然上边回答 Bash 你没有反驳,我就当你是在用 Bash。Bash 历史存储在 $HISTFILE,默认为 ~/.bash_history. 问题在于历史并不是即时读写,而是当前 shell 退出时才写入。

解决方案:

# Share history by PROMPT_COMMAND {{{
# make history share across sessions
shopt -s histappend # dependency
PROMPT_COMMAND="history -n;history -w;history -c;history -r${PROMPT_COMMAND:+;$PROMPT_COMMAND}"

# }}}

通过钩子(实际 Bash 没有完善的钩子设计),每次将文件中历史与当前 shell 历史合并,并即时写入文件。这样所有开着的 shell 历史可以同步。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/646259

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX