Làm cách nào để giữ lịch sử bash của tôi qua các phiên?


27

Tôi đang làm việc trên một mục tiêu x86 chạy fedora 9.

Bất cứ khi nào tôi khởi động lại nó, lịch sử của tôi trở lại trạng thái nào đó và tôi không có các lệnh tôi đã thực hiện trong các phiên trước khi khởi động lại.

Những gì tôi phải thay đổi để cập nhật lịch sử tôi có trước khi khởi động lại?


Anh ấy đang hỏi "Làm thế nào để tôi giữ lịch sử bash của mình qua các phiên?", Có liên quan đến lập trình shell. Khởi động lại là một cách mất kịch tính của bạn, đó là tất cả. Nó không cần kết thúc chủ đề.
Jonathan Leffler

Điểm tốt này có lẽ nên được chuyển sang SuperUser.
BR

@Jonathan Vâng, bạn đã trả lời đúng câu hỏi. Tôi không chắc chính xác những gì cần hỏi.

Lưu từng lệnh ngay sau khi nó được thực thi, không phải vào cuối phiên cũng sẽ giúp ích. Điều này là do nếu bạn đang chạy hai phiên cùng một lúc, sau đó không có dòng bên dưới, bash sẽ lưu lịch sử từ phiên 1 (giả sử) khi nó đóng. Nếu phiên-1 đang chạy và bạn muốn truy cập ngay vào lịch sử của phiên-1 bên trong phiên-2, thì bạn sẽ không thể trừ khi bạn thêm dòng dưới đây vào tệp .bashrc. PROMPT_COMMAND = 'history -a'
Abhinav

Câu trả lời:


16

Lịch sử nào? bash-lịch sử? Nếu bạn đang mất lịch sử bash và bạn có nhiều phiên cùng một lúc, thì đó là vì mỗi phiên sẽ ghi đè lên lịch sử của các phiên khác.

Bạn có thể muốn nói với bash không ghi đè lên lịch sử mỗi lần, mà là để thêm vào nó. Bạn có thể làm điều này bằng cách sửa đổi .bashrc của bạn để chạy shopt -s histappend.

Bạn cũng có thể tăng kích thước tệp lịch sử của mình bằng cách xuất HISTSIZE thành số lớn (tính bằng byte, vì vậy 100000 sẽ rất nhiều).


7
HISTSIZElà số lượng lệnh cần nhớ, không phải số byte.
Chris Down

10

Tôi đã mắc cùng một vấn đề - nhưng tôi .bashrctập tin đã có shopt -s histappendvà chính xác HISTFILE, HISTSIZE, HISTFILESIZE.

Đối với tôi, vấn đề là .bash_historytệp của tôi được sở hữu bởi root chứ không phải tên người dùng của tôi, vì vậy người dùng của tôi không bao giờ có thể lưu vào tệp đó khi thoát.


3
Tôi chỉ thấy rằng tôi có cùng một vấn đề với .bash_history thuộc sở hữu của root. Tôi ước tôi đã nhận ra trước khi tôi mất tất cả lịch sử đáng yêu của mình, nhưng
đừng bận tâm

cùng ở đây - kết thúc vài ngày lang thang :) cảm ơn!
davka

1
sudo chmod your_user_name .bash_historyđã làm nó! Cảm ơn.
wij

sudo chown user_name:user_name ~.bash_historyđã giải quyết nó
vào


2

Tôi đã viết một tập lệnh để thiết lập một tệp lịch sử cho mỗi phiên hoặc tác vụ dựa trên các phần sau.

    # 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

Nó không cần thiết lưu mọi lệnh lịch sử nhưng nó lưu những thứ tôi quan tâm và dễ dàng lấy chúng hơn sau đó đi qua mọi lệnh. Phiên bản của tôi cũng liệt kê tất cả các tệp lịch sử và cung cấp khả năng tìm kiếm thông qua tất cả chúng.

Nguồn đầy đủ: https://github.com/simotek/scripts-config/blob/master/hiset.sh


1

Tôi đã viết một số dòng trong .bashrc của mình để thực hiện các thao tác sau: Lưu mỗi phiên sau mỗi lệnh vào một tệp. Sẽ có nhiều tệp lịch sử như bạn đã từng bắt đầu thiết bị đầu cuối. Khi bắt đầu một thiết bị đầu cuối mới bắt đầu từ tệp lịch sử gần đây nhất, tải tất cả các tệp lịch sử từ các phiên trước vào bộ đệm lịch sử cho đến khi đạt đến ngưỡng đếm dòng.

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

Tôi sẽ đảm bảo .bash_history tồn tại. Nếu không, không có nơi nào để bash lưu lịch sử lệnh.

nếu .bash_history không tồn tại, hãy tạo nó bằng cách chạy touch:

touch ~/.bash_history

điều này chỉ tạo tệp .bash_history trống trong thư mục chính của bạn, tệp này sẽ điền vào các lệnh của bạn và sẽ tồn tại giữa các phiên.


0

Ví dụ Ubuntu Amazon EC2 của tôi không lưu lịch sử. .bashrccó tất cả các lệnh cần thiết như được đề cập trong các câu trả lời khác nhưng điều duy nhất còn thiếu là tệp. Tôi đã phải chạm vào nó để làm cho nó hoạt động.

touch ~/.bash_history

-1

Câu trả lời tốt cho câu hỏi này là ở đây:

http://linuxcommando.blogspot.com/2007/11/keep-command-history-across-mult Môn.html


3
Chào mừng bạn đến với SuperUser! Vui lòng bao gồm đủ thông tin trong câu trả lời của bạn rằng người hỏi không phải nhấp vào liên kết bên ngoài. Ngoài ra, hãy chắc chắn rằng câu trả lời của bạn không đơn giản lặp lại các câu trả lời hiện có (mà, từ cái nhìn nhanh vào liên kết đó, dường như nó đang được thực hiện).
Indrek

//, Có vẻ như một bài viết tốt. Nhưng tôi nghĩ rằng stackexchange đang cố gắng độc lập với các điểm đến liên kết, ít nhất là một chút. Tâm thêm một chút giải thích?
Nathan Basan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.