Могу ли я легко искать свою историю во многих окнах экрана?


11

В моем текущем screenсеансе 12 открытых окон. Он работает уже несколько недель ... Я знаю, что выполнил команду ImageMagick convertв одном из этих 12 экранных окон где-то на прошлой неделе ... Есть ли способ, с помощью которого я могу легко искать в истории Bash всех 12 экземпляров, не закрывая их и не запуская history | grep convertна всех 12 экранах?


1
Я использую ЗШ и я setopt share_historyв /etc/zsh/zshrcтак этой проблемы никогда не случится со мной: P
phunehehe

Ответы:


18

Вы можете запустить history -a; history -cво всех окнах, чтобы сохранить историю. А потом history -rобновить его.

Чтобы решить эту проблему более постоянно, добавьте это в свой .bashrc:

export PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND"

2
Это здорово, спасибо! Единственная проблема в том, что если вы наберете что-то в одной оболочке, а затем перейдете в другую и сразу введете историю, это не будет отображаться в истории. Это связано с тем, что PROMPT_COMMAND еще не выполнен, поэтому обновление не произошло. Сначала вам нужно будет нажать кнопку возврата во втором окне (или выполнить другую команду), а затем ввести историю.
Джавид Джамаэ

1

Звучит сложно. Вот несколько методов, которые могут работать для вас.

Если у вас установлены инструменты учета процессов (в Linux найдите пакет с именем acct) и разрешение на их использование, вы можете узнать, когда и, возможно, на каком терминале вы работали convert:

lastcomm convert

Если это недоступно или неокончательно, вы можете выполнить historyкоманду в каждом экземпляре bash для поиска convertкоманд. Это найдет команды, которые были в файле истории, когда bash также запускался.

: >/tmp/convert.history
for w in $(seq 0 11); do
  screen -p $w -X stuff \
    'history | sed 's/^.*convert/'$w'&/" >>/tmp/convert.history
'; done
  • $(seq 0 11)перебирает номера ваших окон экрана. Обязательно пропустите окна, в которых в данный момент не запущен bash, но какой-то другой процесс, который интерпретирует ввод по-другому.
  • screen -p $w stuff …отправляет следующую строку в качестве ввода в указанное окно. Вам нужен перевод строки в конце строки.
  • Файл /tmp/convert.historyбудет содержать список строк, например 3 convert foo.jpg, если вы запускаете convert foo.jpgв окне 3.

1
К сожалению, это не сработало. :-( Я только что закончил бегать history | grep convertво всех окнах. Я разочарован, я хотел принять еще один отличный ответ от Жиля!
Джош

1

tcsh позволяет вам делиться историей между сеансами с помощью периодического псевдонима.

В вашем файле .cshrc (или .tcshrc):

set tperiod = 60 #(or any other number.  Time in minutes between refreshing)
alias periodic 'history -S; echo "Syncing history"'

Это автоматически выполнит команду истории каждые 60 минут. Это сохранит историю в общий файл истории в вашем домашнем каталоге. Для более частого обновления истории либо уменьшите значение tperiod, либо просто выполните команду «period» для обновления вручную


0

Bash только пишет историю, когда выходит, что в лучшем случае делает это проблематичным. Я слышал, что Zsh может делиться историей между активными сессиями.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.