我尝试在每次输入的命令后在tcsh中保存历史记录,而不是在"退出"之后保存它。命令。这是因为通常我会同时打开10个标签,之后我只关闭终端窗口而不是输入"退出"在每个标签中。结果是仅为最后一个选项卡保存历史记录。关闭终端窗口时,此解决方案无效: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中写两次。
有什么想法吗?
答案 0 :(得分:3)
要在输入的每个shell命令后自动运行命令,请将命令设置为postcmd
别名。例如:
alias postcmd 'date'
...将导致" date"输入命令后立即运行的命令(尽管它实际上在输入命令之前执行,据我所知)。
而且,正如马克阿姆斯特朗在答案中暗示的那样,history -S
保存了当前的历史。所以,从理论上讲,你可以把
alias postcmd 'history -S'
...在你的.tcshrc中,每次输入命令时都会保存你的历史文件 - 所以不需要为你可能使用的每个命令创建别名,或者使用一些自定义脚本手动写入你的历史文件
我说这在理论上是有效的,因为当我尝试它时(因为当我在关闭终端窗口之前忘记exit
时我的历史被吹走了...),.history文件只写有当前 shell的历史记录,即使merge
变量中指定了savehist
- 非常令人沮丧。但也许你的系统行为不同(我在OS X上),所以也许试一试。
答案 1 :(得分:1)
如果您设置savehist
shell变量,如下所示,它会在每次保存时将历史记录合并到现有历史记录中。以下是history -S
使用的手册页:
使用-S,第二种形式将历史列表保存到文件名。如果savehist shell变量的第一个单词设置为数字,则最多保存许多行。如果savehist的第二个单词设置为“merge”,则历史列表将与现有历史文件合并,而不是替换它(如果有)并按时间戳排序。 (+)合并适用于X Window系统等具有多个shell同时使用的环境。如果savehist的第二个单词是'merge'而第三个单词被设置为'lock',则历史文件更新将与其他可能想要在同一时间合并历史记录的shell会话序列化。
答案 2 :(得分:0)
这可能有效:
set history = 200
set histdup = erase
set savehist = (${history} merge lock)
alias precmd 'history -S'
alias postcmd 'history -M'
历史记录在每个命令之前编写,然后合并。效果:
无论如何,历史只是捏造。
答案 3 :(得分:0)
我尝试了很多,包括Getopt的perl脚本历史记录清理程序。但是我的历史仍然大部分时间都消失了。因此,我在.cshrc中添加了其他历史记录存档方法。它只是将命令保存到文件中:
alias postcmd 'history 1 >>' ~/save.hitory
在我的Linux(Opensuse跨越15)中,postcmd别名在命令执行之前和之后执行,正如我从post一词的含义所假定的那样。更令人惊讶的是,每次我退出外壳程序时,命令退出都会在文件〜/ save.history中出现28次。也许这就是'history -M'破坏〜/ .history文件的原因。