Bagaimana cara menjaga riwayat bash saya di seluruh sesi?


24

Saya sedang mengerjakan target x86 menjalankan fedora 9.

Setiap kali saya reboot, histori saya kembali ke keadaan tertentu, dan saya tidak punya perintah yang saya lakukan di sesi sebelum reboot.

Apa yang harus saya ubah untuk memperbarui riwayat yang saya miliki sebelum reboot?


Dia bertanya "Bagaimana cara menjaga sejarah bash saya di seluruh sesi?", Yang terkait dengan pemrograman shell. Reboot adalah cara dramatis untuk menghilangkan shell Anda, itu saja. Tidak perlu menutup topik.
Jonathan Leffler

Poin bagus — ini mungkin harus dipindahkan ke SuperUser.
B.R.

@ Jonathan Ya, Anda punya pertanyaan yang benar. Saya tidak yakin apa yang harus saya tanyakan.

Menyimpan setiap perintah tepat setelah dieksekusi, tidak di akhir sesi juga akan membantu. Ini karena jika Anda menjalankan dua sesi secara bersamaan, maka tanpa garis di bawah ini, bash akan menyimpan riwayat dari sesi-1 (katakanlah) ketika ditutup. Jika sesi-1 sedang berjalan dan Anda ingin segera mengakses riwayat sesi-1 di dalam sesi-2, maka Anda tidak akan bisa kecuali Anda menambahkan baris di bawah ini ke file .bashrc. PROMPT_COMMAND = 'history -a'
Abhinav

Jawaban:


13

Sejarah yang mana? bash-history? Jika Anda kehilangan riwayat bash dan Anda memiliki beberapa sesi sekaligus, itu karena setiap sesi menimpa riwayat sesi lainnya.

Anda mungkin ingin memberi tahu bash untuk tidak menimpa sejarah setiap kali, tetapi untuk menambahkannya. Anda dapat melakukan ini dengan memodifikasi .bashrc Anda untuk dijalankan shopt -s histappend.

Anda juga dapat meningkatkan ukuran file riwayat Anda dengan mengekspor HISTSIZE menjadi angka besar (dalam satuan byte, jadi 100000 seharusnya lebih banyak)


7
HISTSIZE adalah jumlah perintah yang harus diingat, bukan jumlah byte.
Chris Down

8

Saya menderita masalah yang sama - tetapi masalah saya .bashrc file sudah punya shopt -s histappend dan benar HISTFILE, HISTSIZE, HISTFILESIZE.

Bagi saya masalahnya adalah milik saya .bash_history file dimiliki oleh akar daripada nama pengguna saya, jadi pengguna saya tidak pernah bisa menyimpan ke file itu saat keluar.


3
Saya baru saja menemukan saya memiliki masalah yang sama persis dengan .bash_history yang dimiliki oleh root. Saya berharap saya menyadari sebelum saya kehilangan semua sejarah saya yang indah, tetapi tidak pernah :-)
SamStephens

sama di sini - berakhir beberapa hari berkeliaran :) terima kasih!
davka

1
sudo chmod your_user_name .bash_history melakukannya! Terima kasih.
wij

sudo chown user_name:user_name ~.bash_history dipecahkan!
alper


2

Saya telah menulis skrip untuk mengatur file riwayat per sesi atau tugas berdasarkan dari berikut ini.

    # 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

Tidak perlu menyimpan setiap perintah sejarah tetapi menyimpan yang saya sayangi dan lebih mudah untuk mengambilnya kemudian melalui setiap perintah. Versi saya juga mencantumkan semua file riwayat dan menyediakan kemampuan untuk mencari semua file itu.

Sumber lengkap: https://github.com/simotek/scripts-config/blob/master/hiset.sh


1

Saya menulis beberapa baris di .bashrc saya yang mencapai sebagai berikut: Simpan setiap sesi setelah setiap perintah ke file. Akan ada banyak file histori seperti yang pernah Anda mulai terminal. Saat memulai terminal baru mulai dari file histori terbaru memuat semua file histori dari sesi sebelumnya ke buffer sejarah hingga ambang batas jumlah baris tercapai.

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

Saya akan memastikan .bash_history ada. Jika tidak, tidak ada tempat bagi bash untuk menyimpan histori perintah.

jika .bash_history tidak ada, buat dengan menjalankan sentuhan:

touch ~/.bash_history

ini hanya membuat file .bash_history kosong di direktori home Anda, yang akan diisi dengan perintah Anda, dan akan tetap ada di antara sesi.


-1

3
Selamat datang di SuperUser! Harap sertakan informasi yang cukup dalam jawaban Anda sehingga penanya tidak perlu mengklik tautan eksternal. Juga, pastikan jawaban Anda tidak hanya menduplikasi jawaban yang ada (yang, sekilas melihat tautan itu, tampaknya berhasil)
Indrek

//, Sepertinya artikel yang bagus. Tapi saya pikir stackexchange mencoba untuk independen dari tujuan tautan, setidaknya sedikit. Pikiran menambahkan sedikit penjelasan?
Nathan Basanese
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.