Как мне сохранить историю bash между сеансами?


27

Я работаю на цели x86 под управлением Fedora 9.

Всякий раз, когда я перезагружаю его, моя история возвращается в какое-то состояние, и у меня нет команд, которые я делал в сеансах до перезагрузки.

Что мне нужно изменить, чтобы обновить историю, которая была у меня до перезагрузки?


Он спрашивает «Как мне сохранить историю bash между сеансами?», Что связано с программированием оболочки. Перезагрузка - это драматический способ потерять оболочку, вот и все. Не нужно закрывать тему.
Джонатан Леффлер

Хороший вопрос - это, вероятно, следует перенести в SuperUser.
BR

@ Джонатан Да, вы правильно поняли вопрос. Я не был уверен, что именно спросить.

Сохранение каждой команды сразу после ее выполнения, а не в конце сеанса, также поможет. Это потому, что если вы запускаете два сеанса одновременно, то без строки ниже bash сохранит историю из сеанса-1 (скажем), когда он будет закрыт. Если сеанс-1 запущен и вы хотите немедленно получить доступ к истории сеанса-1 внутри сеанса-2, вы не сможете этого сделать, если не добавите строку ниже в файл .bashrc. PROMPT_COMMAND = 'history -a'
Абхинав

Ответы:


16

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

Вы, вероятно, хотите сказать bash не переписывать историю каждый раз, а добавлять к ней. Вы можете сделать это, изменив ваш .bashrc для запуска shopt -s histappend.

Вы также можете увеличить размер файла истории, экспортировав HISTSIZE в большое число (оно выражается в байтах, поэтому 100000 должно быть достаточно).


7
HISTSIZEколичество запоминаемых команд, а не количество байтов.
Крис Даун

10

Я страдал от тех же проблем - но мой .bashrcфайл уже имел shopt -s histappendи правильно HISTFILE, HISTSIZE, HISTFILESIZE.

Для меня проблема заключалась в том, что мой .bash_historyфайл принадлежал пользователю root, а не моему имени пользователя, поэтому мой пользователь никогда не мог сохранить этот файл при выходе.


3
Я только что обнаружил, что у меня точно такая же проблема с .bash_history, принадлежащим пользователю root. Хотелось бы, чтобы я понял, прежде чем потерял всю свою прекрасную историю, но не
бери в голову

тут то же самое - закончились несколько дней блуждания :) спасибо!
DAVKA

1
sudo chmod your_user_name .bash_historyсделал это! Спасибо.
Wij

sudo chown user_name:user_name ~.bash_historyрешил это!
Alper


2

Я написал скрипт для установки файла истории для каждой сессии или задачи, основанной на следующем.

    # write existing history to the old file
    history -a

    # set new historyfile
    export HISTFILE="$1"
    export HISET=$1

    # touch the new file to make sure it exists
    touch $HISTFILE
    # load new history file
    history -r $HISTFILE

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

Полный источник: https://github.com/simotek/scripts-config/blob/master/hiset.sh


1

Я написал несколько строк в моем .bashrc, которые выполняют следующее: Сохраняйте каждую сессию после каждой команды в файл. Там будет столько файлов истории, сколько вы когда-либо запускали терминалы. При запуске нового терминала, начиная с самого последнего файла истории, загрузите все файлы истории из предыдущих сессий в буфер истории, пока не будет достигнут порог количества строк.

HISTCONTROL=''
HISTFOLDER=~/.bash_histories
HISTFILEEXT=history      # only files in $HISTFOLDER with this extension will be read
shopt -s histappend   # append when closing session
mkdir -p $HISTFOLDER
HISTFILE=$HISTFOLDER/$(date +%Y-%m-%d_%H-%M-%S_%N).$HISTFILEEXT  # create unique file name for this session. Nanoseconds seems to be unique enough, try: for ((i=0; i<=10; i++)); do date +%Y-%m-%d_%H-%M-%S_%N; done
# if HISTFILE unset, history is not saved on exit -> not really necessary if we save after each command, but its a double net safety
HISTSIZE=-1       # maximum number of commands to hold inside bash history buffer
HISTFILESIZE=-1   # maximum number of lines in history file
# history -a $HISTFILE # bash saves the total history commands entered since startup or since the last save and saves that amount of commands to the file. This means reading a history file after typing commands will trip up bash, but this won't be a problem if the history file is only loaded in the beginning. This means that only new commands are saved not all the old loaded commands, thereby we can load as many history files into the buffer as we want and still only save newly thereafter typed commands
PROMPT_COMMAND="history -a $HISTFILE; $PROMPT_COMMAND"  # This command is executed after very typed command -> save history after each command instead after only closing the session

# Load old histories from last 5 files/sessions
HISTLINESTOLOAD=2000
# --reverse lists newest files at first
names=($(ls --reverse $HISTFOLDER/*.$HISTFILEEXT 2>/dev/null))
toload=()
linecount=0
# Check if is really file and count lines and only append to $toload if linecount under $HISTLINESTOLOAD
for fname in ${names[*]}; do
    if test -f $fname; then
        linecount=$((linecount+$(wc -l < $fname) ))
        if test $linecount -ge $HISTLINESTOLOAD; then
            break
        fi
        toload+=($fname)
    fi
done
# Beginning with the oldest load files in $toload into bash history buffer
for (( i=${#toload[*]}-1; i>=0; i-- )); do
    history -r ${toload[$i]}
done

0

Я хотел бы убедиться, что .bash_history существует. Если это не так, bash некуда сохранить историю команд.

если .bash_history не существует, создайте его, запустив touch:

touch ~/.bash_history

это просто создает пустой файл .bash_history в вашем домашнем каталоге, который будет заполняться вашими командами и должен сохраняться между сеансами.


0

Мой экземпляр Amazon EC2 Ubuntu не сохранял историю. .bashrcимел все необходимые команды, как указано в других ответах, но единственное, чего не хватало, был файл. Я должен был коснуться этого, чтобы заставить это работать.

touch ~/.bash_history

-1

Хороший ответ на этот вопрос здесь:

http://linuxcommando.blogspot.com/2007/11/keeping-command-history-across-multiple.html


3
Добро пожаловать в SuperUser! Пожалуйста, включите в свой ответ достаточно информации, чтобы спрашивающему не приходилось нажимать на внешнюю ссылку. Кроме того, убедитесь, что ваш ответ не просто дублирует существующие ответы (что, на первый взгляд, похоже, делает).
Индрек

// Выглядит как хорошая статья. Но я думаю, что stackexchange пытается быть независимым от мест назначения ссылок, по крайней мере, немного. Не могли бы вы добавить небольшое объяснение?
Натан Басанезе
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.