Як зберігати історію башів протягом сеансів?


27

Я працюю над ціллю x86 під керуванням Fedora 9.

Кожного разу, коли я його перезавантажую, моя історія повертається до певного стану, і я не маю команд, які я робив на сесіях перед перезавантаженням.

Що потрібно змінити, щоб оновлена ​​історія була перед перезавантаженням?


Він запитує "Як я можу зберігати історію баш-сеансів протягом сеансів?", Що пов'язано з програмуванням оболонок. Перезавантаження - це драматичний спосіб втратити оболонку, ось і все. Тут не потрібно закривати тему.
Джонатан Леффлер

Хороший момент - це, мабуть, слід перенести на SuperUser.
BR

@Jonathan Так, у вас питання правильне. Я не знав, що саме запитати.

Збереження кожної команди відразу після її виконання, а не в кінці сеансу також допоможе. Це тому, що якщо ви виконуєте два сеанси одночасно, то без рядка нижче, bash збереже історію з сесії-1 (скажімо), коли її закриють. Якщо сесія-1 запущена і ви хочете негайно отримати доступ до історії сесії-1 всередині сеансу-2, тоді ви не зможете зробити це, якщо ви не додасте нижній рядок до файлу .bashrc. PROMPT_COMMAND = 'історія -a'
Абхінав

Відповіді:


16

Яка історія? баш-історія? Якщо ви втрачаєте історію башів і у вас є кілька сеансів одночасно, це пов’язано з тим, що кожен сеанс переписує історію інших сесій.

Напевно, ви хочете сказати 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вирішив це!
Альпер


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_history не існує, створіть його за допомогою дотику:

touch ~/.bash_history

це просто створює порожній файл .bash_history у вашому домашньому каталозі, який заповнюватиметься вашими командами та має зберігатися між сесіями.


0

Мій екземпляр Ubuntu Amazon EC2 не зберігав історію. .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.