Как получить общую историю с разбивкой между различными вкладками

18

Я использовал ответ в ссылке , чтобы включить совместную историю в режиме реального времени между отдельными терминалами 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), а не новый windows. Почему это различие в поведении? Как я могу поделиться историей bash также между различными вкладками?

ОБНОВЛЕНИЕ: Я заметил необычное поведение: если я набираю CTRL+C , тогда отображается последняя команда, введенная на любом из других терминалов (как на вкладке, так и на ней). Это похоже на то, что CTRL + C заставляет поток истории, чтобы затем он был правильно разделен.

В качестве примера выходы (T1 обозначает клемму 1 и клемму 2 T2):

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

Надеюсь, это может предложить любой намек!

    
задан lucacerone 23.06.2013 в 18:25
источник

4 ответа

2

Похоже, вы пытаетесь получить доступ к истории другого терминала до , когда происходит синхронизация. PROMPT_COMMAND выполняется до того, как будет напечатано новое приглашение, т. е. после , вы запустите команду и перед тем, как ввести следующую команду. Так что это не произойдет сразу в T1; вы должны вызвать новое приглашение для отображения.

Чтобы проверить это, попробуйте этот вариант на своих шагах (я добавил дополнительный <enter> в T1):

T1:
ls -lah <enter>
# the list of files and directory is shown

T2:
cd Documents <enter>

T1:
<enter>
<up> (i.e. I press the up arrow)

С помощью этого дополнительного нажатия кнопки ввода вы получите новое приглашение, которое запускает PROMPT_COMMAND и синхронизирует вашу историю, и поэтому я ожидал бы, что эта стрелка вверх отобразит cd вместо ls , как вы хотели , К сожалению, я не думаю, что есть способ сделать синхронизацию мгновенно на всех терминалах без каких-либо команд, как вам кажется; это потребует, чтобы все ваши сеансы входа в систему постоянно синхронизировали свои хронологические списки, что было бы огромной потерей производительности процессора и диска.

    
ответ дан Paul 28.06.2013 в 20:08
1

Я задал тот же вопрос, и вот ответ, который я придумал ....

HISTSIZE=9000
HISTFILESIZE=$HISTSIZE
HISTCONTROL=ignorespace:ignoredups

history() {
  _bash_history_sync
  builtin history "[email protected]"
}

_bash_history_sync() {
  builtin history -a         #1
  HISTFILESIZE=$HISTSIZE     #2
  builtin history -c         #3
  builtin history -r         #4
}

PROMPT_COMMAND=_bash_history_sync
    
ответ дан Scott Goodgame 26.06.2013 в 10:38
1

добавьте эти строки в файл .bashrc

# avoid duplicates..
export HISTCONTROL=ignoredups:erasedups  
# append history entries..
shopt -s histappend

trap 'history -r' USR1 
export PROMPT_COMMAND="history -a ; history -c; ps a | awk '/ bash$/ {system (\"kill -USR1 \" $1)}'; $PROMPT_COMMAND"

Примечание:

Изначально я сделал свой тестовый отсек, передавая сигнал USR1, чтобы bash с killall, позже я подумал использовать имя оболочки uniquee, копию bash с именем testhell, чтобы не убивать мои собственные оболочки, которые могли бы работать (например, процессы cron), но strangelly который не работал.

Killall не был достаточно избирательным, я заменил его скриптом, который убивает только процессы bash, жесткие к tty ( ps a сообщает только процессы, привязанные к tty)

Не забудьте перезапустить сеанс, чтобы иметь свежий PROMPT_COMMAND, когда я тестировал, я видел, что многие из моих предыдущих тестов были сложены внутри PROMPT_COMMAND.

    
ответ дан Emmanuel 01.07.2013 в 17:46
0

У меня было такое же странное поведение в Yakuake, когда он пытался создать сложную подсказку bash, которая показывала бы количество других логинов. Число не увеличивалось для вкладок. Мое обходное решение состояло в том, чтобы сказать, что Yakuake снова запускает bash на каждой новой вкладке, по сути, начиная bash в bash. Он начал работать безупречно. Может быть, это тоже поможет. Мое слепое мнение состоит в том, что GUI для консоли загружает bash configs сам, а затем передает их в экземпляры bash. Может быть, это возможность сражаться с ними.     

ответ дан Barafu Albino 26.06.2013 в 10:41