Linux tcsh,仅当命令成功时才将命令保存在历史记录中
我是新来的Linux tcsh,仅当命令成功时才将命令保存在历史记录中,linux,shell,tcsh,Linux,Shell,Tcsh,我是新来的tcsh,请给我建议。现在我使用postmd变量保存历史记录: alias postcmd "history -S; history -M;" 问题是,它几乎保存了我输入到终端的所有内容。我想过滤掉一些拼写错误的命令,或者,例如,返回一些非零状态的命令。我的第一次尝试是: alias postcmd "if ($? == 0) history -S; history -M;" 但上述命令仍然保存所有拼写错误的命令和非零退出状态的命令。 问题是,如何使tcsh尽可能过滤掉不合适的命令
tcsh
,请给我建议。现在我使用postmd
变量保存历史记录:
alias postcmd "history -S; history -M;"
问题是,它几乎保存了我输入到终端的所有内容。我想过滤掉一些拼写错误的命令,或者,例如,返回一些非零状态的命令。我的第一次尝试是:
alias postcmd "if ($? == 0) history -S; history -M;"
但上述命令仍然保存所有拼写错误的命令和非零退出状态的命令。
问题是,如何使tcsh
尽可能过滤掉不合适的命令
*更新*
我不知道如何使tcsh
历史按我所希望的方式运行,所以我在这里给自己留了一张便条。我所做的是
set history = 0
就这样
set savehist = (3000 merge lock)
alias precmd 'if($? == 0) history -S; history -c; history -M'
然后
为什么历史记录-c
?
它清除了历史;否则,失败/拼写错误的命令仍将添加到当前(内存中)历史记录中,并且后续的history-S
将保存这些命令,即使仅在命令成功后调用
请注意,在if(..)cmd1中;cmd2;cmd3
cmd2
和cmd3
将无条件运行
为什么precmd
而不是postmd
?
中间别名是否可以对命令进行分组? 否,因为if(…)后面的命令不能是别名:
tcsh% alias ok 'echo ok'
tcsh% ok
ok
tcsh% if (1) ok
ok: Command not found.
从tcsh(1)
手册页:
if(expr)命令
<代码>命令
必须是简单命令,而不是
别名、管道、命令列表或括号中的命令
列表,但它可能有参数
为什么不将多行别名与precmd
或postmd
一起使用?
因为它将递归地调用自身:
tcsh% alias postcmd 'if ($? == 0) then\
echo OK\
endif\
'
OK
OK
<ad nauseam>
^C
tcsh%alias postcmd'如果($?==0)则\
回声OK\
恩迪夫\
'
好啊
好啊
^C
让我检查一下,非常感谢您花时间给出这样一个完整的答案。@。这似乎是迄今为止我能得到的最完整的答案。仍然没有时间让它在我的shell tho中工作。不过,非常感谢。我一定会接受你的回答。
tcsh% alias ok 'echo ok'
tcsh% ok
ok
tcsh% if (1) ok
ok: Command not found.
tcsh% alias postcmd 'if ($? == 0) then\
echo OK\
endif\
'
OK
OK
<ad nauseam>
^C