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

Terminal tcsh-命令后立即保存历史记录,terminal,tcsh,Terminal,Tcsh,我尝试在每次输入命令后在tcsh中保存历史记录,而不是在“退出”命令后保存历史记录。这是因为我通常同时打开大约10个选项卡,然后关闭终端窗口,而不是在每个选项卡中键入“退出”。结果是,仅为最后一个选项卡保存历史记录。关闭终端窗口时,此解决方案不起作用: 因为我仅仅使用历史记录命令找不到解决方案,所以我尝试用不同的方法来解决它:直接将每个命令回显到~/.tcsh_历史记录,并在.tcshrc文件中设置set histfile=~/.tcsh_history。然而,我没有找到一个方法来做到这一点。我

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

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

#!/bin/tcsh -f

echo "$argv" >> ~/.tcsh_history
但这当然有点难看,这样一些命令在关闭窗口后会在~/.tcsh_历史记录中写入两次


有什么想法吗?

如果按如下所示设置
savehist
shell变量,每次保存时,它都会将历史合并到现有历史中。下面是有关使用
历史记录-S
的手册页:

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


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

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

正如马克·阿姆斯特朗在回答中所暗示的那样,
history-S
保存了当前的历史。所以,理论上,你可以

alias postcmd 'history -S'
…在您的.tcshrc中,并且您的历史记录文件将在每次输入命令时保存,因此无需为您可能使用的每个命令创建别名,也无需使用某些自定义脚本手动写入历史记录文件

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

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

这可能会奏效:

  set history = 200
  set histdup = erase
  set savehist = (${history} merge lock)

  alias precmd 'history -S'
  alias postcmd 'history -M'
历史记录在每个命令之前写入,在之后合并。影响:

  • 历史会立即存储,无需结束仪式
  • 平行外壳共享历史

无论如何,历史是虚构的。

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

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

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

Hmm。似乎在某种预命令别名中需要类似于
history-M的东西。(未测试)
别名precmd'history-M'
似乎可以工作,但它会对命令历史编号造成严重破坏。