Я использовал ответ в /unix//a/1292/41729, чтобы включить совместную историю в реальном времени между отдельными терминалами bash. Как объяснено в ответе выше, это достигается путем добавления:
# avoid duplicates..
export HISTCONTROL=ignoredups:erasedups
# append history entries..
shopt -s histappend
# After each command, save and reload history
export PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND"
Это прекрасно работает, если оболочки bash разделены (например, открываются разные терминалы bash с использованием CTRL+ALT+T
. Однако это не работает, если я использую tabs
(с открытого терминала `CTRL + SHIFT + T), а не новые окна. Почему такая разница в поведении? Как я могу поделиться историей Bash также среди различных вкладок?
ОБНОВЛЕНИЕ: я заметил необычное поведение: если я печатаю, CTRL+C
то последняя команда, набранная на любом из других терминалов (с вкладкой или без), отображается правильно. Это как если бы CTRL + C принудительно очищал историю, чтобы затем правильно делиться.
В качестве примера выходы (Т1 обозначает клемму 1, а Т2 - клемму 2):
T1:
ls -lah <enter>
# the list of files and directory is shown
T2:
cd Documents <enter>
T1:
<up> (i.e. I press the up arrow)
ls -lah #i.e the last command in terminal 1 is shown rather than the last of terminal 2
^C (i.e. I press CTRL+C)
<up>
cd Documents #the last command issued in terminal 2 is correctly displayed
Надеюсь, что это может предложить любую подсказку!
~.bashrc
файл? С другой стороны, экспортировать эти переменные бессмысленно; просто впустую пространство окружающей среды.Ответы:
Похоже, вы пытаетесь получить доступ к истории другого терминала, прежде чем произойдет синхронизация.
PROMPT_COMMAND
выполняется непосредственно перед выводом нового приглашения, т. е. после запуска команды и перед вводом следующей команды. Так что это не произойдет сразу же в T1; Вы должны вызвать новое приглашение для отображения.Чтобы проверить это, попробуйте этот вариант на своих шагах (я добавил дополнительный
<enter>
в T1):С помощью этого дополнительного нажатия Enter вы получаете новое приглашение, которое запускает
PROMPT_COMMAND
и синхронизирует вашу историю, и поэтому я ожидаю, что эта стрелка вверх получитcd
вместо тогоls
, что вы хотели. К сожалению, я не думаю, что есть способ сделать синхронизацию мгновенной во всех терминалах без выполнения каких-либо команд, как вам кажется; фактически это потребовало бы, чтобы все ваши сеансы входа в систему постоянно синхронизировали свои списки хронологии, что привело бы к огромным потерям производительности ЦП и дисков.источник
Я задал тот же вопрос, и вот ответ, который я придумал ....
источник
HISTFILESIZE
он изменяется, он автоматически пытается обрезать существующий файл истории. ИзменениеHISTSIZE
имеет аналогичное влияние на текущую историю. Для справки смотрите комментарий вvariables.c
bash src прямо перед этимsv_histsize
.добавить эти строки в ваш
.bashrc
файлнота:
Изначально я выполнял тестовый отсек, отправляя сигнал USR1 на bash с помощью killall, позже я решил использовать уникальное имя оболочки, копию bash с именем testshell, чтобы избежать уничтожения моих собственных оболочек, которые могли работать (например, процессы cron), но, как ни странно, это было не так. работает.
Killall не был достаточно избирательным, я заменил его сценарием, который убивает только процессы bash,
ps a
привязанные к tty ( сообщает только процессы, связанные с tty)Не забудьте перезапустить сеанс, чтобы получить новый PROMPT_COMMAND, когда я тестировал, я видел, как многие из моих предыдущих тестов были сложены внутри PROMPT_COMMAND.
источник
killall
отправить сигнал только процессам того же пользователя с дополнительным-u
аргументом, e.g.
-u $ (whoami) `.killall -q -USR1 -u $(whoami) bash
отправляет сигнал USR1 всем процессам bash текущего пользователя.У меня было такое же странное поведение в Yakuake, когда я пытался создать сложное приглашение bash, которое показывало бы количество других логинов. Количество не увеличивается для вкладок. Мой обходной путь - заставить Yakuake
bash
снова запускаться на каждой новой вкладке, по сути, начиная bash в bash. Это начало работать без нареканий. Может быть, это тоже поможет тебе. Мое слепое предположение состоит в том, что графический интерфейс для консольных загрузок настраивает bash, а затем передает их экземплярам bash. Может быть, это быть в состоянии возиться с ними.источник