ฉันจะเก็บประวัติทุบตีของฉันไว้ตลอดเซสชันได้อย่างไร


27

ฉันกำลังทำงานบนเป้าหมาย x86 ที่ใช้งาน fedora 9

เมื่อใดก็ตามที่ฉันรีบูตประวัติของฉันกลับสู่สถานะบางอย่างและฉันไม่มีคำสั่งที่ฉันทำในเซสชันก่อนที่จะรีบูต

ฉันต้องเปลี่ยนอะไรเพื่อให้มีการอัปเดตประวัติที่ฉันมีก่อนรีบูต


เขากำลังถามว่า "ฉันจะเก็บประวัติทุบตีของฉันไว้ตลอดเซสชันได้อย่างไร" ซึ่งเกี่ยวข้องกับการเขียนโปรแกรมเชลล์ การรีบูตเป็นวิธีที่น่าทึ่งมากในการเสียกระสุนของคุณนั่นคือทั้งหมด ไม่จำเป็นต้องปิดหัวข้อ
Jonathan Leffler

จุดดี - สิ่งนี้น่าจะถูกย้ายไปที่ SuperUser
BR

@ โจนาธานใช่คุณได้รับคำถามที่ถูกต้อง ฉันไม่แน่ใจว่าจะถามอะไร

การบันทึกแต่ละคำสั่งทันทีหลังจากที่ถูกเรียกใช้งานไม่ได้ในตอนท้ายของเซสชันจะช่วยได้เช่นกัน นี่เป็นเพราะถ้าคุณกำลังรันสองเซสชันพร้อมกันดังนั้นโดยไม่มีบรรทัดด้านล่าง bash จะบันทึกประวัติจาก session-1 (พูด) เมื่อมันถูกปิด หาก session-1 กำลังทำงานและคุณต้องการเข้าถึงประวัติของ session-1 ทันทีใน session-2 คุณจะไม่สามารถยกเว้นว่าคุณจะเพิ่มบรรทัดด้านล่างลงในไฟล์. bashrc PROMPT_COMMAND = 'history -a'
Abhinav

คำตอบ:


16

ประวัติศาสตร์ใด ทุบตีประวัติศาสตร์? หากคุณสูญเสียประวัติทุบตีและคุณมีหลายครั้งในแต่ละครั้งนั่นเป็นเพราะแต่ละเซสชันกำลังเขียนทับประวัติของเซสชันอื่น

คุณอาจต้องการบอกให้ทุบตีว่าจะไม่เขียนทับประวัติในแต่ละครั้ง คุณสามารถทำได้โดยการปรับเปลี่ยน .bashrc shopt -s histappendของคุณทำงาน

นอกจากนี้คุณยังสามารถเพิ่มขนาดไฟล์ประวัติของคุณโดยการส่งออก HISTSIZE ให้เป็นตัวเลขขนาดใหญ่ (มีหน่วยเป็นไบต์ดังนั้น 100,000 ควรมีมากมาย)


7
HISTSIZEคือจำนวนคำสั่งที่ต้องจำไม่ใช่จำนวนไบต์
Chris Down

10

ฉันกำลังทุกข์ทรมานจากปัญหาเดียวกัน - แต่.bashrcไฟล์ของฉันมีshopt -s histappendและถูกต้องHISTFILEแล้วHISTSIZE, HISTFILESIZE.

สำหรับฉันปัญหาคือ.bash_historyไฟล์ของฉันเป็นของrootแทนที่จะเป็นชื่อผู้ใช้ของฉันดังนั้นผู้ใช้ของฉันจะไม่สามารถบันทึกลงในไฟล์นั้นเมื่อออก


3
ฉันเพิ่งพบว่าฉันมีปัญหาเดียวกันกับ. bash_history ที่เป็นเจ้าของโดย root ฉันหวังว่าฉันจะรู้ก่อนที่ฉันจะสูญเสียประวัติศาสตร์ที่น่ารักของฉันทั้งหมด แต่ไม่เป็นไร :-)
SamStephens

เหมือนกันที่นี่ - จบไปหลายวันแล้ว :) ขอบคุณ!
davka

1
sudo chmod your_user_name .bash_historyทำมัน! ขอบคุณ
Wij

sudo chown user_name:user_name ~.bash_historyแก้ไขมัน!
alper


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:

touch ~/.bash_history

นี่เป็นเพียงการสร้างไฟล์. bash_history ที่ว่างเปล่าในโฮมไดเร็กตอรี่ของคุณ, ซึ่งจะเติมคำสั่งของคุณ, และควรคงอยู่ระหว่างเซสชัน


0

อินสแตนซ์ Amazon EC2 Ubuntu ของฉันไม่ได้บันทึกประวัติ .bashrcมีคำสั่งที่จำเป็นทั้งหมดตามที่ระบุไว้ในคำตอบอื่น ๆ แต่สิ่งเดียวที่ขาดหายไปคือไฟล์ ฉันต้องแตะมันเพื่อให้มันใช้งานได้

touch ~/.bash_history

-1

คำตอบที่ดีสำหรับคำถามนี้อยู่ที่นี่:

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


3
ยินดีต้อนรับสู่ SuperUser! โปรดระบุข้อมูลที่เพียงพอในคำตอบของคุณที่ผู้ถามไม่จำเป็นต้องคลิกที่ลิงก์ภายนอก นอกจากนี้ตรวจสอบให้แน่ใจว่าคำตอบของคุณไม่เพียง แต่ทำซ้ำคำตอบที่มีอยู่ (ซึ่งจากการดูอย่างรวดเร็วที่ลิงก์ดูเหมือนว่ากำลังทำอยู่)
Indrek

//, ดูเหมือนบทความที่ดี แต่ฉันคิดว่า stackexchange กำลังพยายามเป็นอิสระจากปลายทางลิงก์อย่างน้อยที่สุด หากใจเพิ่มคำอธิบายเล็กน้อย
Nathan Basanese
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.