V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
whileFalse
V2EX  ›  问与答

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

  •  
  •   whileFalse · Feb 21, 2020 · 2035 views
    This topic created in 2263 days ago, the information mentioned may be changed or developed.

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

    6 replies    2020-02-21 21:05:06 +08:00
    Howlaind
        1
    Howlaind  
       Feb 21, 2020   ❤️ 2
    历史是 Shell 保存的,以 Bash 为例,它会在每次会话开始时读入~/.bash_history 文件,会话结束时保存。
    所以当多个 Shell 同时运行时,~/.bash_history 只会存为最近一个关闭的 Shell 历史。
    whileFalse
        2
    whileFalse  
    OP
       Feb 21, 2020
    @Howlaind #1 谢谢。请问如何解决此问题呢?
    Howlaind
        3
    Howlaind  
       Feb 21, 2020   ❤️ 1
    @whileFalse #2 搜索的结果大概是通过修改环境变量 PROMPT_COMMAND,加入'history -a; history -r'让每个命令执行后都写并读一次~/.bash_history 文件来解决。我自己没试过,请谨慎使用。
    whatisnew
        4
    whatisnew  
       Feb 21, 2020
    history 1
    whileFalse
        5
    whileFalse  
    OP
       Feb 21, 2020
    @whatisnew #4 请问这个命令有什么作用?
    Kobayashi
        6
    Kobayashi  
       Feb 21, 2020   ❤️ 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 历史可以同步。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2491 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 35ms · UTC 08:41 · PVG 16:41 · LAX 01:41 · JFK 04:41
    ♥ Do have faith in what you're doing.