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

问题描述 投票:0回答:6

我尝试在每次输入命令后将历史记录保存在 tcsh 中,而不是在“退出”命令后保存它。这是因为我通常会同时打开大约 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 \!*'

(等)
在 ~/saveHist.tcsh 文件中:

#!/bin/tcsh -f

echo "$argv" >> ~/.tcsh_history

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

有什么想法吗?

terminal tcsh
6个回答
4
投票

要在输入每个 shell 命令后自动运行命令,请将命令设置为

postcmd
别名。例如:

alias postcmd 'date'

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

而且,正如马克·阿姆斯特朗在回答中提到的那样,

history -S

 保存了当前的历史。所以,理论上,你可以把

alias postcmd 'history -S'

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

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

我说这在理论上是有效的,因为当我尝试它时(因为当我在关闭终端窗口之前忘记

exit

 时,我的历史记录也被吹走了......),.history 文件仅写入 
的历史记录当前 shell,即使在 merge
 变量中指定了 
savehist
 - 非常令人沮丧。但也许你的系统表现不同(我使用的是 OS X),所以也许可以尝试一下。


3
投票
这可能有用:

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

历史记录在每个命令之前写入,之后合并。功效:

    历史立即存储,无需关闭仪式
  • 并行 shell 共享历史
无论如何,历史都是捏造的。


1
投票
如果您如下所示设置

savehist

 shell 变量,则每次保存历史记录时,它都会将历史记录合并到现有历史记录中。  下面是有关 
history -S
 用法的手册页:

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


1
投票
我尝试了很多,包括 Getopt 的 Perl 脚本历史记录清理器。但我的历史大部分时间还是丢失了。因此,我在 .cshrc 中添加了一个额外的历史归档方法。它只是将命令保存到文件中:

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


1
投票
您是否尝试过将“history -S”添加到您的 ~/.logout 中? 它应该解决您在关闭终端而不是调用 exit 时丢失历史记录的问题。


0
投票
我成功地能够使用 Corn(Tcsh) shell 打开两个到服务器的 SSH 会话...在其中一个中运行命令,然后运行

history

 显示合并的内容。就像BASH方法一样
PROMPT_COMMAND="${PROMPT_COMMAND:+$PROMPT_COMMAND$'\n'}history -a; history -c; history -r"

~/.cshrc 的内容

set history = 500 set histdup = erase set savehist = ( 500 merge lock ) alias precmd 'history -M ~/.historycsh; history -c; history -L ~/.historycsh' alias postcmd 'history -S ~/.historycsh'
特殊变量在 shell 内置帮助中定义,用于控制历史记录的行为。此外,在启动命令之前,我们将历史记录合并到文件中,然后清除历史记录并加载文件(添加新条目)。然后,在执行命令后,我们保存其他 shell 的历史文件。

参考资料:

  • https://www.mankier.com/1/tcsh#Reference-Builtin_commands
© www.soinside.com 2019 - 2024. All rights reserved.