
Я пытаюсь сохранить другой файл истории для каждой вкладки/терминала, но не могу сохранить его сразу после запуска команды. История сохраняется только тогда, когда я запускаю "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 тоже есть.