V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
whileFalse
V2EX  ›  问与答

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

  •  
  •   whileFalse · 2020-02-21 09:15:30 +08:00 · 1673 次点击
    这是一个创建于 1738 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    6 条回复    2020-02-21 21:05:06 +08:00
    Howlaind
        1
    Howlaind  
       2020-02-21 09:29:12 +08:00   ❤️ 2
    历史是 Shell 保存的,以 Bash 为例,它会在每次会话开始时读入~/.bash_history 文件,会话结束时保存。
    所以当多个 Shell 同时运行时,~/.bash_history 只会存为最近一个关闭的 Shell 历史。
    whileFalse
        2
    whileFalse  
    OP
       2020-02-21 09:38:21 +08:00
    @Howlaind #1 谢谢。请问如何解决此问题呢?
    Howlaind
        3
    Howlaind  
       2020-02-21 09:49:48 +08:00   ❤️ 1
    @whileFalse #2 搜索的结果大概是通过修改环境变量 PROMPT_COMMAND,加入'history -a; history -r'让每个命令执行后都写并读一次~/.bash_history 文件来解决。我自己没试过,请谨慎使用。
    whatisnew
        4
    whatisnew  
       2020-02-21 09:54:13 +08:00
    history 1
    whileFalse
        5
    whileFalse  
    OP
       2020-02-21 10:05:23 +08:00
    @whatisnew #4 请问这个命令有什么作用?
    Kobayashi
        6
    Kobayashi  
       2020-02-21 21:05:06 +08:00   ❤️ 1
    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 历史可以同步。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2585 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 00:31 · PVG 08:31 · LAX 16:31 · JFK 19:31
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.