tcsh - 在命令后立即保存历史记录

use*_*143 6 terminal tcsh

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

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

#!/bin/tcsh -f

echo "$argv" >> ~/.tcsh_history
Run Code Online (Sandbox Code Playgroud)

但是当然这有点难看,这样一些命令会在关闭窗口后在〜/ .tcsh_history中写两次.

有任何想法吗?

Gar*_*ght 5

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

\n\n
alias postcmd \'date\'\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

而且,正如马克·阿姆斯特朗在回答中提到的那样,history -S拯救了当前的历史。所以,理论上,你可以把

\n\n
alias postcmd \'history -S\'\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

(编辑:不管下面写了什么,上面的行现在可以在 macOS 上运行,至少可以在与 MacPorts 一起安装的 tcsh 上运行。)

\n\n

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

\n

  • `alias precmd 'history -M'` 似乎有效,但它对命令历史记录数字造成了严重破坏。 (2认同)

Mar*_*ong 1

如果您如下所示设置savehistshell 变量,则每次保存历史记录时,它都会将历史记录合并到现有历史记录中。以下来自有关使用的手册页history -S

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