tcsh - сохранить историю сразу после команды
Я стараюсь сохранять историю в tcsh после каждой введенной команды, а не сохранять ее сразу после команды "exit". Это потому, что обычно я открываю около 10 вкладок одновременно, а после этого я просто закрываю окно терминала вместо того, чтобы вводить "выход" на каждой вкладке. В результате история сохраняется только для последней вкладки. Это решение не работает, когда я закрываю окно терминала: /questions/7867585/vklyuchit-vedenie-istorii-v-obolochke-tcsh/7867599#7867599.
Поскольку я не нашел решения, используя только команды истории, я попытался решить его другим способом: вывести каждую команду в ~/.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 после закрытия окна.
Есть идеи?
5 ответов
Чтобы автоматически запускать команду после каждой введенной вами команды оболочки, установите команду на postcmd
псевдоним. Например:
alias postcmd 'date'
… Заставит команду "date" запускаться сразу после ввода команды (хотя, насколько я могу судить, она фактически выполняется перед введенной вами командой).
И, как намекает Марк Армстронг в своем ответе, history -S
сохраняет текущую историю. Таким образом, теоретически вы могли бы поставить
alias postcmd 'history -S'
... в вашем.tcshrc, и ваш файл истории будет сохраняться каждый раз, когда вы вводите команду - поэтому нет необходимости создавать псевдонимы для каждой команды, которую вы, возможно, можете использовать, или использовать какой-либо пользовательский сценарий для записи в файл истории вручную.
Я говорю, что это работает теоретически, потому что, когда я пытаюсь это сделать (поскольку я также страдаю от того, что моя история сдувается, когда я забываю exit
перед закрытием окна терминала…) файл.history записывается только с историей текущей оболочки, даже если merge
указан в savehist
переменная - очень расстраивает. Но, возможно, ваша система ведет себя по-другому (я на OS X), так что, возможно, попробуйте.
Это может сработать:
set history = 200
set histdup = erase
set savehist = (${history} merge lock)
alias precmd 'history -S'
alias postcmd 'history -M'
История пишется перед каждой командой, объединяется после. Последствия:
- история сразу сохраняется, нет необходимости закрывать ритуалы
- параллельные оболочки делятся историей
Во всяком случае, история это выдумка.
Вы пытались добавить «history -S» в свой ~/.logout ? Это должно решить вашу проблему с потерей истории при закрытии терминала вместо вызова выхода.
Если вы установите savehist
Переменная shell, как показано ниже, будет сливать историю в существующую историю каждый раз, когда вы сохраняете ее. Ниже со страницы руководства по использованию history -S
:
С -S вторая форма сохраняет список истории в имя файла. Если первое слово переменной оболочки savehist установлено в число, то самое большее количество строк сохраняется. Если второе слово в savehist установлено как "объединить", список истории объединяется с существующим файлом истории вместо его замены (если он есть) и сортируется по отметке времени. (+) Слияние предназначено для среды, такой как X Window System с несколькими оболочками, которые используются одновременно. Если второе слово в savehist - "слияние", а третье слово - "блокировка", обновление файла истории будет сериализовано с другими сеансами оболочки, которые, возможно, захотят объединить историю в одно и то же время.
Я много пробовал, в том числе и средство очистки истории Perl-скриптов от Getopt. Но все же моя история по большей части теряется. Поэтому я добавил в свой.cshrc дополнительный метод архивирования истории. Он просто сохраняет команды в файл:
alias postcmd 'history 1 >>' ~/save.hitory
в моем Linux (Opensuse leap 15) псевдоним postcmd выполняется до выполнения команды и после, как я предполагал из значения слова post. Более удивительно то, что команда exit появляется 28 раз в файле ~/save.history каждый раз, когда я выхожу из оболочки. Возможно, это причина того, что 'history -M' повреждает файл ~/.history.