Bash tarihimi oturumlarda nasıl tutarım?


27

Fedora 9'u çalıştıran bir x86 hedefi üzerinde çalışıyorum.

Ne zaman yeniden başlatsam, tarihim bazı durumlara geri döner ve yeniden başlatmadan önceki oturumlarda yaptığım komutlar yoktur.

Yeniden başlatmadan önce sahip olduğum geçmişi güncellemek için neyi değiştirmeliyim?


Kabuk programlaması ile ilgili “Seanslar arasında bash tarihimi nasıl tutabilirim?” Diye soruyor. Yeniden başlatma, kabuğunuzu kaybetmenin çarpıcı bir yoludur, hepsi bu. Konuyu kapatmaya gerek yok.
Jonathan Leffler

İyi nokta — bu muhtemelen SuperUser'a taşınmalıdır.
BR,

@Jonathan Evet, doğru soruyu aldın. Ne soracağımdan tam olarak emin değildim.

Her komutun çalıştırıldıktan hemen sonra kaydedilmesi, oturum sonunda değil de yardımcı olacaktır. Bunun nedeni, aynı anda iki seans çalıştırıyorsanız, o zaman aşağıdaki satır olmadan bash, kapatıldığı zaman seans-1'den (say) gelen geçmişi kaydedecektir. Oturum-1 çalışıyorsa ve oturum-2'deki oturum-1'in geçmişine hemen erişmek istiyorsanız, aşağıdaki satırı .bashrc dosyasına ekleyene kadar kullanamazsınız. PROMPT_COMMAND = 'tarih-a'
Abhinav

Yanıtlar:


16

Hangi tarih bash-tarih? Bash tarihini kaybediyorsanız ve bir kerede birden çok oturumunuz varsa, bunun nedeni her oturumun diğer oturumların geçmişinin üzerine yazmasıdır.

Muhtemelen, bash'a her seferinde tarihin üzerine yazmamasını, bunun yerine onu eklemeyi söylemesini istersiniz. .Bashrc'nizi çalıştırması için değiştirerek bunu yapabilirsiniz shopt -s histappend.

HISTSIZE öğesini büyük bir ish numarası olarak dışa aktararak geçmiş dosyanızın boyutunu da artırabilirsiniz (bayt cinsindendir, yani 100000 bol olmalıdır).


7
HISTSIZEBayt sayısını değil hatırlanması gereken komut sayısıdır.
Chris Down

10

Ben aynı sorundan muzdarip oldu - ama benim .bashrcdosya zaten vardı shopt -s histappendve doğru HISTFILE, HISTSIZE, HISTFILESIZE.

Benim için sorun, dosyamın kullanıcı adımım yerine kök.bash_history tarafından sahiplenilmesiydi , bu yüzden kullanıcım çıkışta o dosyaya asla kaydedemedi.


3
Ben sadece kök tarafından sahip olduğu .bash_history ile tamamen aynı sorunu yaşadım. Keşke tüm güzel geçmişimi kaybetmeden önce
farkedebilseydim

Aynı burada - dolaşıp birkaç gün sona erdi :) teşekkürler!
davka

1
sudo chmod your_user_name .bash_historybaşardı! Teşekkürler.
wij,

sudo chown user_name:user_name ~.bash_historyçözüldü!
08


2

Her oturum için bir tarih dosyası veya görev ayarlamak için bir komut dosyası yazdım.

    # 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

Her tarih komutunu kaydetmeye gerek yoktur, ancak umurumda olanları kaydeder, sonra onları almak daha kolay olur ve her komuttan geçer. Sürümüm ayrıca tüm geçmiş dosyalarını listeliyor ve hepsinde arama yapabilmenizi sağlıyor.

Tam kaynak: https://github.com/simotek/scripts-config/blob/master/hiset.sh


1

.Bashrc içinde aşağıdakileri gerçekleştiren bazı satırlar yazdım: Her komuttan sonra her oturumu bir dosyaya kaydedin. Terminalleri başlattığınız kadar geçmiş dosya olacaktır. En son geçmiş dosyadan başlayarak yeni bir terminal başlatırken, önceki oturumlardan tüm geçmiş dosyalarını bir satır sayısı eşiğine ulaşana kadar geçmiş arabelleğine yükleyin.

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'nin varlığını temin ederim. Olmazsa, bash'ın komut geçmişini kaydedeceği bir yer yoktur.

.bash_history mevcut değilse, dokunarak çalışarak oluşturun:

touch ~/.bash_history

bu sadece ev dizininizde boş .bash_history dosyasını yaratır, bu da komutlarınızı yerine getirir ve oturumlar arasında devam etmelidir.


0

Amazon EC2 Ubuntu örneğim tarihi kaydetmiyordu. .bashrcDiğer cevaplarda belirtildiği gibi gerekli tüm komutları vardı, ancak eksik olan tek şey dosyaydı. Çalışması için ona dokunmak zorunda kaldım.

touch ~/.bash_history

-1

3
SuperUser'a Hoşgeldiniz! Lütfen cevabınıza, sorunuzun harici bir linke tıklamak zorunda kalmayacağı kadar fazla bilgi ekleyin. Ayrıca, cevabınızın sadece mevcut cevapları kopyalamadığından emin olun (ki bu bağlantıya hızlıca bir bakış açıyor gibi görünüyor).
Indrek,

//, iyi bir yazıya benziyor. Ancak bence stackexchange, en azından biraz, bağlantı noktalarından bağımsız olmaya çalışıyor. Küçük bir açıklama ekler misin?
Nathan Basanese,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.