Почему история команд сохраняется только при выходе?

Почему история команд сохраняется только при выходе?

Я пытаюсь сохранить другой файл истории для каждой вкладки/терминала, но не могу сохранить его сразу после запуска команды. История сохраняется только тогда, когда я запускаю "exit".

Это проблема, поскольку я хочу иметь копию истории на случай сбоя терминала или компьютера.

Покопавшись в интернете, вот что у меня есть в файле .bashrc:

export HISTFILE="$HOME/HISTORIES/bash_history_$(basename $(tty))_$(date '+%Y-%m-%d_%H-%M-%S_%Z')"
export HISTCONTROL=ignoreboth
export HISTFILESIZE=10000
export HISTSIZE=10000
shopt -s histappend
PROMPT_COMMAND=$(history -a; $PROMPT_COMMAND)

Есть идеи, что я делаю не так?

Спасибо.

решение1

Вы неправильно назначаете PROMPT_COMMAND. Когда вы пишете

PROMPT_COMMAND=$(history -a; $PROMPT_COMMAND)

Вы запускаете 'history -a' (которая не выводит ничего), а затем запускаете $PROMPT_COMMAND (которая во время ваших скриптов запуска может быть пустой) и назначаете вывод этих двух команд (пустую строку) PROMPT_COMMAND. То, что вы хотите, это просто:

PROMPT_COMMAND='history -a'

Если вы хотите добавить его к существующей команде, выполните:

PROMPT_COMMAND+="history -a${PROMPT_COMMAND+=; }$PROMPT_COMMAND"

решение2

По какой-то непонятной мне причине это работает:

export HISTFILE_NEW="$HOME/HISTORIES/bash_history_$(basename $(tty))_$(date '+%Y-%m-%d_%H-%M-%S_%Z')"
export HISTCONTROL=ignoreboth
export HISTFILESIZE=10000
export HISTSIZE=10000
shopt -s histappend
PROMPT_COMMAND="history -w $HISTFILE_NEW; $PROMPT_COMMAND"

Хотя это не так

export HISTFILE="$HOME/HISTORIES/bash_history_$(basename $(tty))_$(date '+%Y-%m-%d_%H-%M-%S_%Z')"
export HISTCONTROL=ignoreboth
export HISTFILESIZE=10000
export HISTSIZE=10000
shopt -s histappend
PROMPT_COMMAND="history -a; $PROMPT_COMMAND"

Конечно, первое решение медленнее теоретически хорошего (второго), поскольку вся история сохраняется каждый раз при записи новой команды.

Поэтому, если кто-нибудь знает, ПОЧЕМУ это так и как это можно решить, я был бы очень признателен.

решение3

Отвечая на намерение, а не на буквальный вопрос:

Посмотрите на использование скрипта. Это даст вам команды и их вывод. Обратите внимание, что это не панацея, так как любые команды, использующие позиционирование курсора, впоследствии трудно расшифровать.

Имя скрипта - создать скрипт терминальной сессии

Скрипт-синтаксис [-a] [-c КОМАНДА] [-f] [-q] [-t] [файл]

Описание Скрипт создает машинописный текст всего, что печатается на вашем терминале. Это полезно для студентов, которым нужна печатная запись интерактивного сеанса в качестве доказательства задания, так как файл машинописного текста можно распечатать позже с помощью lpr(1).

Если указан аргумент file, скрипт сохраняет весь диалог в file. Если имя файла не указано, машинописный текст сохраняется в файле typescript.

Параметры:

  -a'        Append the output to file or typescript, retaining the priorcontents.

-c КОМАНДА Запустить КОМАНДУ, а не интерактивную оболочку. Это упрощает для скрипта захват вывода программы, которая ведет себя по-другому, когда ее stdout не является tty. -f' Очищать вывод после каждой записи. Это удобно для телекооперации: один человек выполняет 'mkfifo foo; script -f foo', а другой может контролировать в реальном времени то, что делается, с помощью 'cat foo'.

-q' Молчи.

-t' Вывод данных о времени в стандартный поток ошибок. Эти данные содержат два поля, разделенные пробелом. Первое поле указывает, сколько времени прошло с момента предыдущего вывода. Второе поле указывает, сколько символов было выведено в этот раз. Эту информацию можно использовать для воспроизведения машинописных текстов с реалистичными задержками ввода и вывода.

Скрипт завершается при выходе из разветвленной оболочки (control-D для выхода из оболочки Bourne (sh(1)) и exit, logout или control-d (если не задан параметр ignoreeof) для оболочки C, csh(1)).

Некоторые интерактивные команды, такие как vi(1), создают мусор в файле typescript. Script лучше всего работает с командами, которые не манипулируют экраном, результаты предназначены для эмуляции терминала с печатной копией. ...

Поищите "man script" в Google. Если у вас определенная ОС, укажите ее. Это версия для Linux, но существуют почти идентичные версии для *BSD, Mac. Вероятно, порты для Windows тоже есть.

Связанный контент