Я знаю, что этот вопрос не является неясным, так как он задается здесь, обновлять (и дублировать здесь).
То, что я пытаюсь достичь, немного другое. Мне не нравится идея моей подсказки переписывать файл каждый раз, когда ls
я печатаю ( history -a; history -c; history -r
).
Я хотел бы обновить файл при выходе. Это легко (на самом деле, по умолчанию), но вам нужно добавить вместо переписывания:
shopt -s histappend
Теперь, когда терминал закрыт, я бы хотел, чтобы все остальные, которые остаются открытыми, знали об обновлении.
Я предпочитаю делать это без проверки через $PS1
все, command
что я печатаю. Я думаю, что было бы лучше захватить какой-то сигнал. Как бы Вы это сделали? Если не возможно, может быть, просто cronjob
?
Как мы можем решить эту загадку?
bash
shell
command-history
signals
Доктор Беко
источник
источник
bash
. Может быть, пришло время проверить что-то новое, просто для удовольствия.Ответы:
Вы говорите креативно и привлекательно? OK:
Брось это
.bashrc
и иди. При этом используются сигналы, чтобы каждыйbash
процесс проверял наличие новых записей в истории при выходе другого. Это довольно ужасно, но это действительно работает.Как это работает?
trap
устанавливает обработчик сигнала для системного сигнала или одного из внутренних событий Bash.EXIT
Событие любое контролируемое прекращение оболочки, в то время какUSR1
этоSIGUSR1
, бессмысленный сигнал мы присваивая.Всякий раз, когда оболочка выходит, мы:
SIGUSR1
обработчик и заставьте эту оболочку игнорировать сигнал.bash
процессам от одного и того же пользователя.Когда
SIGUSR1
прибывает, мы:Из-за способом Баша ручки сигналов, не будет на самом деле получить новые данные истории , пока вы не попали Enterв следующий раз, так что это не делает лучше на этом фронте , чем положить
history -n
вPROMPT_COMMAND
. Тем не менее, он сохраняет чтение файла постоянно, когда ничего не происходит, и запись вообще не происходит, пока оболочка не выйдет.Однако здесь есть еще пара вопросов. Во-первых, ответом по умолчанию
SIGUSR1
является завершение оболочки. Любые другиеbash
процессы (например, запуск сценариев оболочки) будут уничтожены..bashrc
не загружается неинтерактивными оболочками. Вместо этого загружается файл с именемBASH_ENV
: вы можете установить эту переменную в вашей среде глобально, чтобы указывать на файл с помощью:в нем игнорировать сигнал в них (что решает проблему).
Наконец, хотя это и делает то, что вы просили, заказ, который вы получите, будет немного необычным. В частности, биты истории будут повторяться в разных порядках по мере их загрузки и сохранения отдельно. Это, по сути, присуще тому, что вы просите, но имейте в виду, что история со стрелкой вверх становится намного менее полезной на данном этапе. Тем не менее, подстановки истории и тому подобное будут распространяться и работать хорошо.
источник
.bashrc
файле, а затем появилось что-то вроде cronjob и периодически прибегали к файлу, посылаяSIGUSR1
фрагмент кода, можете ли вы восстановить хронологическую историю со стрелками вверх?linux bug
?? Почему другие процессы ловят USR1? (Я знаю, что это не должно обсуждаться здесь, но, может быть, я расскажу об этом в правильном месте)BASH_ENV
как указано в этом ответе? Или вы знаете более стандартный способ выключить это зло?