Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux tcsh,仅当命令成功时才将命令保存在历史记录中_Linux_Shell_Tcsh - Fatal编程技术网

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