Jak zachować moją historię bashów między sesjami?

27

Pracuję nad celem x86 z Fedorą 9.

Za każdym razem, gdy go ponownie uruchamiam, moja historia wraca do pewnego stanu i nie mam poleceń, które wykonałem w sesjach przed ponownym uruchomieniem.

Co muszę zmienić, aby zaktualizować historię, którą miałem przed ponownym uruchomieniem?

BЈовић
źródło
Pyta: „Jak zachować moją historię bashów między sesjami?”, Co jest związane z programowaniem powłoki. Ponowne uruchomienie to dramatyczny sposób na utratę powłoki - to wszystko. Nie trzeba zamykać tematu.
Jonathan Leffler
Dobra uwaga - prawdopodobnie należy to przenieść do SuperUser.
BR
@Jathanathan Tak, masz poprawne pytanie. Nie byłem pewien, o co dokładnie zapytać.
Pomoże również zapisanie każdego polecenia zaraz po jego wykonaniu, a nie na końcu sesji. Dzieje się tak, ponieważ jeśli prowadzisz dwie sesje jednocześnie, to bez wiersza poniżej bash zapisze historię z sesji-1 (powiedzmy) po jej zamknięciu. Jeśli sesja-1 jest uruchomiona i chcesz natychmiast uzyskać dostęp do historii sesji-1 w sesji-2, nie będziesz w stanie tego zrobić, chyba że dodasz poniższy wiersz do pliku .bashrc. PROMPT_COMMAND = 'historia -a'
Abhinav

Odpowiedzi:

16

Która historia bash-history? Jeśli tracisz historię bash i masz wiele sesji na raz, to dlatego, że każda sesja zastępuje historię innych sesji.

Prawdopodobnie chcesz powiedzieć bashowi, aby nie zastępował historii za każdym razem, ale raczej do niej dołączał. Możesz to zrobić, modyfikując plik .bashrc, aby działał shopt -s histappend.

Możesz również zwiększyć rozmiar pliku historii, eksportując HISTSIZE do dużej liczby (jest on w bajtach, więc 100000 powinno być wystarczające).

BR
źródło
7
HISTSIZEto liczba poleceń do zapamiętania, a nie liczba bajtów.
Chris Down,
10

I cierpi z tego samego problemu - ale mój .bashrcplik już miał shopt -s histappendi prawidłowe HISTFILE, HISTSIZE, HISTFILESIZE.

Dla mnie problem polegał na tym, że mój .bash_historyplik był własnością root, a nie mojej nazwy użytkownika, więc mój użytkownik nigdy nie mógł zapisać tego pliku przy wyjściu.

icc97
źródło
3
Właśnie odkryłem, że mam dokładnie ten sam problem z .bash_history należącą do roota. Chciałbym
zdać
tak samo tutaj - zakończyło się kilka dni wędrówki :) dzięki!
davka
1
sudo chmod your_user_name .bash_historyzrobił to! Dzięki.
wij
sudo chown user_name:user_name ~.bash_historyrozwiązałem to!
alper
3

Wyszukaj zmienne środowiskowe HISTFILE, HISTSIZE, HISTFILESIZE.

Jonathan Leffler
źródło
2

Napisałem skrypt do ustawiania pliku historii na sesję lub zadania w oparciu o następujące.

    # 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

Nie trzeba zapisywać każdego polecenia historii, ale zapisuje te, na których mi zależy, i łatwiej je odzyskać niż wykonać każde polecenie. Moja wersja zawiera także listę wszystkich plików historii i umożliwia przeszukiwanie ich wszystkich.

Pełne źródło: https://github.com/simotek/scripts-config/blob/master/hiset.sh

simotek
źródło
1

Napisałem kilka wierszy w moim .bashrc, które spełniają następujące warunki: Zapisz każdą sesję po każdym poleceniu do pliku. Będzie tyle plików historii, ile kiedykolwiek uruchomiłeś terminale. Po uruchomieniu nowego terminala, zaczynając od najnowszego pliku historii, ładuj wszystkie pliki historii z poprzednich sesji do bufora historii, aż do osiągnięcia progu liczby wierszy.

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
mxmlnkn
źródło
0

Zapewniłbym, że istnieje .bash_history. Jeśli tak się nie stanie, bash nie będzie mógł zapisać historii poleceń.

jeśli .bash_history nie istnieje, utwórz ją, uruchamiając touch:

touch ~/.bash_history

to po prostu tworzy pusty plik .bash_history w twoim katalogu domowym, który wypełni się twoimi poleceniami i powinien pozostać między sesjami.

Ray Shah
źródło
0

Moja instancja Amazon EC2 Ubuntu nie zapisywała historii. .bashrcmiał wszystkie wymagane polecenia, jak wspomniano w innych odpowiedziach, ale brakowało tylko pliku. Musiałem go dotknąć, aby działał.

touch ~/.bash_history
Chankey Pathak
źródło
-1

Dobra odpowiedź na to pytanie jest tutaj:

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

DanJ
źródło
3
Witamy w SuperUser! Podaj w odpowiedzi wystarczającą ilość informacji, aby pytający nie musiał klikać linku zewnętrznego. Upewnij się także, że twoja odpowiedź nie powiela istniejących odpowiedzi (które, na pierwszy rzut oka, wydają się działać).
Indrek
//, wygląda na dobry artykuł. Ale myślę, że stackexchange próbuje przynajmniej być niezależnym od miejsc docelowych linków. Chcesz dodać małe wyjaśnienie?
Nathan Basanese