【问题标题】:tcsh - save history right after commandtcsh - 在命令后立即保存历史记录
【发布时间】:2014-04-06 13:39:37
【问题描述】:

我尝试在每次输入命令后将历史记录保存在 tcsh 中,而不是在“退出”命令之后保存。这是因为通常我会同时打开大约 10 个选项卡,然后我只是关闭终端窗口,而不是在每个选项卡中输入“exit”。结果是仅保存最后一个选项卡的历史记录。当我关闭终端窗口时,此解决方案不起作用:https://stackoverflow.com/a/3577709/2773143

因为我没有找到仅使用历史命令的解决方案,所以我尝试通过不同的方式解决它:将每个命令直接回显到 ~/.tcsh_history 并在 .tcshrc 文件中设置 set histfile= ~/.tcsh_history。但是我也没有找到办法做到这一点。我想过在.alias 中对所有命令做一个别名,比如alias * '*; ~/someScript.tcsh(还有许多其他版本),但它没有用。我找到了如何通过对每个命令执行不同的别名来使其工作,但这有点难看。
例如:
alias cd 'cd \!*; ~/saveHist.tcsh \!:0 \!*'
alias grep 'grep \!*; ~/saveHist.tcsh \!:0 \!*'
(等)
并在 ~/saveHist.tcsh 文件中:

#!/bin/tcsh -f

echo "$argv" >> ~/.tcsh_history

但这当然有点难看,这样一些命令将在关闭窗口后在 ~/.tcsh_history 中写入两次。

有什么想法吗?

【问题讨论】:

    标签: terminal tcsh


    【解决方案1】:

    要在您输入的每个 shell 命令后自动运行命令,请将命令设置为 postcmd 别名。例如:

    alias postcmd 'date'
    

    …将导致“日期”命令在您输入命令后立即运行(尽管据我所知,它实际上在您输入的命令之前执行)。

    而且,正如 Mark Armstrong 在他的回答中所暗示的那样,history -S 保存了当前的历史记录。所以,理论上,你可以把

    alias postcmd 'history -S'
    

    ...在您的 .tcshrc 中,您的历史文件将在您每次输入命令时保存 - 因此无需为您可能使用的每个命令创建别名,或使用一些自定义脚本手动写入您的历史文件.

    (编辑:尽管下面写的是,上面的行现在可以在 macOS 上运行,至少使用 MacPorts 安装的 tcsh。)

    我说这在理论上是可行的,因为当我尝试它时(因为当我在关闭终端窗口之前忘记exit 时,我的历史也会被吹走......),.history 文件只写有历史current shell,即使在savehist 变量中指定了merge - 非常令人沮丧。但也许你的系统表现不同(我在 OS X 上),所以不妨试一试。

    【讨论】:

    • 嗯。看来您需要某种预命令别名中的 history -M 之类的东西。 (未经测试)
    • alias precmd 'history -M' 似乎有效,但它会破坏命令历史编号。
    【解决方案2】:

    这可能有效:

      set history = 200
      set histdup = erase
      set savehist = (${history} merge lock)
    
      alias precmd 'history -S'
      alias postcmd 'history -M'
    

    历史写在每个命令之前,之后合并。效果:

    • 历史立即存储,无需关闭仪式
    • 并行 shell 共享历史

    无论如何,历史都是捏造的。

    【讨论】:

      【解决方案3】:

      如果您设置savehist shell 变量如下所示,它会在您每次保存时将历史合并到现有历史中。下面来自使用history -S 的手册页:

      使用-S,第二种形式将历史列表保存到文件名。如果 savehist shell 变量的第一个单词设置为一个数字,最多可以保存那么多行。如果 savehist 的第二个单词设置为 'merge',历史列表将与现有历史文件合并而不是替换它(如果有的话)并按时间戳排序。 (+) 合并适用于像 X Window 系统这样同时使用多个 shell 的环境。如果 savehist 的第二个单词是 'merge' 并且第三个单词设置为 'lock',历史文件更新将与可能希望同时合并历史的其他 shell 会话序列化。

      【讨论】:

        【解决方案4】:

        我尝试了很多,包括来自 Getopt 的 perl 脚本历史清理器。但我的历史大部分时间都丢失了。所以我在我的 .cshrc 中添加了一个额外的历史归档方法。它只是将命令保存到文件中:

        alias postcmd 'history 1 >>' ~/save.hitory
        

        在我的 linux(Opensuse jump 15)中,postcmd 别名在命令执行之前和之后执行,正如我从 post 一词的含义所假设的那样。更令人惊讶的是,每次退出 shell 时,命令 exit 在 ~/save.history 文件中出现了 28 次。也许这就是“history -M”破坏 ~/.history 文件的原因。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-03-11
          • 2021-04-20
          • 1970-01-01
          • 1970-01-01
          • 2012-03-26
          • 2020-07-14
          • 2021-02-10
          相关资源
          最近更新 更多