t csh, команда сохранения в истории, только если команда была успешной - PullRequest
0 голосов
/ 10 февраля 2020

Я новичок в tcsh, поэтому, пожалуйста, посоветуйте мне. Теперь я использую переменную postcmd для сохранения истории:

alias postcmd "history -S; history -M;"

Проблема в том, что она сохраняет почти все, что я печатаю, в терминал. Я хочу отфильтровать некоторые команды с ошибками или, например, команды, которые вернули ненулевой статус. Моя первая попытка заключается в следующем:

alias postcmd "if ($? == 0) history -S; history -M;"

Но вышеизложенное сохраняет все команды с ошибками и команды с ненулевым статусом выхода. Вопрос в том, как заставить tcsh отфильтровать как можно больше ненужных команд?

* update *

Понятия не имею, как сделать tcsh история ведет себя так, как я хочу, поэтому я оставляю записку для себя здесь. То, что я сделал, это

set history = 0

И это все.

1 Ответ

0 голосов
/ 11 февраля 2020
set savehist = (3000 merge lock)
alias precmd 'if($? == 0) history -S; history -c; history -M'

затем

tcsh% true
tcsh% false
tcsh% false
tcsh% true
tcsh% history
    20  0:15    true
    21  0:16    true
    22  0:16    history

Почему history -c?

Это очищает историю; в противном случае команды с ошибками / ошибками будут по-прежнему добавляться в текущую историю (в памяти), и последующие history -S сохранят их, даже если они будут вызваны только после успешной команды.

Обратите внимание, что в if(..) cmd1; cmd2; cmd3 cmd2 и cmd3 будут выполняться безоговорочно.

Почему precmd вместо postcmd?

tcsh% alias postcmd 'echo postcmd = $?'
tcsh% alias precmd 'echo precmd = $?'
postcmd = 0
precmd = 0
tcsh% false
postcmd = 0
precmd = 1

Работает ли промежуточный псевдоним для группировки команд?

Нет, потому что команда после if (...) не может быть псевдонимом:

tcsh% alias ok 'echo ok'
tcsh% ok
ok
tcsh% if (1) ok
ok: Command not found.

Из справочной страницы tcsh(1):

if (expr) command

... command должна быть простой командой, , а не псевдонимом , конвейером, списком команд или списком команд в скобках, но она может иметь аргументы

Почему бы не использовать многострочный псевдоним с precmd или postcmd?

Поскольку он будет вызывать себя рекурсивно:

tcsh% alias postcmd 'if ($? == 0) then\
echo OK\
endif\
'
OK
OK
<ad nauseam>
^C
...