Назад | Перейти на главную страницу

Экран GNU теряет (части) истории команд

я использую GNU screen с 5 различными сеансами, в каждом из которых хранится собственная история команд. Но часто я не нахожу команду в истории, хотя уверен, что использовал ее именно в той сессии, в которой сейчас нахожусь, несколько недель назад.

Кажется, есть жесткое ограничение на размер истории? Как я могу установить это на бесконечность?

Связанный вопрос: как я могу контролировать, где хранится история сеанса? Часто наш системный администратор перезагружает компьютер (ы), и я теряю все свои сеансы, и мне приходится делать screen -wipe потому что сеансы повреждены. Тогда все истории исчезнут. :( Я бы хотел найти сохраненные истории в этом случае и связать их во вновь созданном сеансе.

P.S .: Пользуюсь bash во всех сеансах экрана.

ОБНОВИТЬ: Я не спрашиваю о том, как объединить истории сеансов. Просто я хочу, чтобы у каждого сеанса была бесконечная история, и я хочу иметь возможность «загружать» эту историю в новый сеанс, если старый будет поврежден или удален.

ОБНОВЛЕНИЕ 2: Вы, наверное, догадались: Когда я сказал я использую GNU screen с 5 различными сеансами Я действительно имею в виду GNU screen сеанс с 5 разными окнами в нем. Сожалею.

Вам лучше использовать историю Bash, чем screen. Экран сохраняет буфер прокрутки (вероятно, в памяти, а не в файле). Когда вы вызываете команды, используя Ctrl-а { на самом деле он перебирает все, что появлялось на экране и все еще находится в буфере, и выглядит так, как будто оно следует за символом приглашения. На самом деле нет истории команд. Вы можете увеличить размер буфера обратной прокрутки, используя screen -h num или defscrollback num или scrollback num кстати экранные команды.

Ты можешь использовать Уорренпредлагает обновлять историю Bash. И / или вы можете использовать одну из найденных мной функций регистрации Вот который может сохранить ваш IP-адрес или идентификатор сеанса экрана вместе с датой, временем, текущим рабочим каталогом и фактической командой. Я сам постоянно этим пользуюсь. Возможно, вам придется установить переменную $hcmntextra, который используется моими функциями, чтобы включить $STY так что имя сеанса экрана также регистрируется.

Я задал похожий вопрос по SU немного назад: https://superuser.com/questions/37576/can-history-files-be-unified-in-

Процитировать принятые ответ:


вот две вещи, которые вам нужно сделать:

Вставьте команду shopt -s histappend в вашем .bashrc. Это будет добавлено к файлу истории, а не перезаписано.
Также в вашем .bashrc, вставить PROMPT_COMMAND="$PROMPT_COMMAND;history -a; history -n" и файл истории будет переписываться и перечитываться каждый раз, когда bash показывает подсказку.


См. Также history страницы руководства.

Мое предпочтительное решение этой проблемы - это вариант одного из предыдущих ответов.

Мне нравится хранить отдельный файл для каждой комбинации сеанса экрана / окна, и каждый файл добавляется каждый раз, когда отображается соответствующая подсказка:

if [[ "$STY" = "" ]]; then STY="none"; fi
if [[ "$WINDOW" = "" ]]; then WINDOW="none"; fi
export HISTFILE=~/.bash_history.$STY.$WINDOW;


PROMPT_COMMAND="$PROMPT_COMMAND; history -a"

Это создает следующие файлы истории:

.bash_history.none.none
.bash_history.2756.pts-9.linux.0
.bash_history.2756.pts-9.linux.1
.bash_history.2881.pts-9.linux.0

Если вы хотите, чтобы окно {x} всегда использовало свой собственный файл истории, но использовало один и тот же файл независимо от сеанса экрана, вы можете просто опустить переменные STY:

if [[ "$WINDOW" = "" ]]; then WINDOW="none"; fi
export HISTFILE=~/.bash_history.$WINDOW;


PROMPT_COMMAND="$PROMPT_COMMAND; history -a"

Это создаст следующие файлы истории:

.bash_history.none
.bash_history.0
.bash_history.1
.bash_history.2

История команд для каждого окна находится в памяти для каждого сеанса bash. Вам нужно, чтобы bash записывал в разные файлы истории, чтобы они сохранялись и оставались отдельными, как вы просите.

Вы можете сделать это, установив HISTFILE за сеанс экрана. Я предполагаю, что это будет примерно так в вашем файле запуска:

if [[ "$WINDOW" != "" ]] ; then export HISTFILE=~/.bash_history.$WINDOW ; fi

Обратите внимание, что это не решает проблему обновления файла истории, когда ваши оболочки завершаются перезагрузкой.