세션 전체에서 bash 기록을 유지하려면 어떻게합니까?


27

fedora 9를 실행하는 x86 대상에서 작업하고 있습니다.

재부팅 할 때마다 내 기록이 일부 상태로 돌아가고 재부팅 전에 세션에서 한 명령이 없습니다.

재부팅하기 전에 기록을 업데이트하려면 무엇을 변경해야합니까?


그는 쉘 프로그래밍과 관련된 "세션에서 bash 기록을 어떻게 유지합니까?"라고 묻습니다. 재부팅은 쉘을 잃어 버리는 극적인 방법입니다. 주제를 닫을 필요는 없습니다.
Jonathan Leffler

좋은 점 — 이것은 아마도 슈퍼 유저로 옮겨 져야합니다.
BR

@Jonathan 네, 질문이 맞았습니다. 정확히 무엇을 물어보아야할지 모르겠습니다.

세션이 끝날 때가 아니라 실행 직후에 각 명령을 저장하면 도움이됩니다. 두 개의 세션을 동시에 실행 중이라면 아래 줄이 없으면 bash는 세션 1의 기록을 닫습니다 (예 :). session-1이 실행 중이고 session-2 내의 session-1 기록에 즉시 액세스하려는 경우 .bashrc 파일에 아래 행을 추가하지 않으면 사용할 수 없습니다. PROMPT_COMMAND = '역사 -a'
Abhinav

답변:


16

어떤 역사? 배쉬 역사? bash 기록을 잃고 한 번에 여러 세션이있는 경우 각 세션이 다른 세션 기록을 덮어 쓰기 때문입니다.

bash에게 매번 히스토리를 덮어 쓰지 말고 추가하도록 지시하십시오. .bashrc를 수정하여 실행하면 shopt -s histappend됩니다.

또한 HISTSIZE를 큰 숫자로 내 보내서 히스토리 파일의 크기를 늘릴 수 있습니다 (바이트 단위이므로 100000이면 충분 함).


7
HISTSIZE바이트 수가 아니라 기억해야 할 명령의 수입니다.
Chris Down

10

저도 같은 문제를 앓고 -하지만 내 .bashrc파일이 이미 가지고 shopt -s histappend및 올바른 HISTFILE, HISTSIZE, HISTFILESIZE.

나에게 문제는 내 사용자 이름이 아닌 루트 가 내 .bash_history파일을 소유 했기 때문에 사용자가 종료 할 때 해당 파일에 저장할 수 없다는 것입니다.


3
방금 root가 소유 한 .bash_history와 정확히 동일한 문제가 있음을 발견했습니다. 나는 :-) 신경 끄시 내 모든 사랑스러운 역사를 잃어 버리는 줄 전에 깨달았지만 좋겠
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가 명령 기록을 저장할 수있는 곳이 없습니다.

.bash_history가 없으면 touch를 실행하여 작성하십시오.

touch ~/.bash_history

이것은 홈 디렉토리에 빈 .bash_history 파일을 생성합니다.이 파일은 명령으로 채워지며 세션간에 지속되어야합니다.


0

Amazon EC2 Ubuntu 인스턴스가 기록을 저장하지 않았습니다. .bashrc다른 답변에 언급 된 모든 필수 명령이 있었지만 누락 된 것은 파일이었습니다. 제대로 작동하려면 터치해야했습니다.

touch ~/.bash_history

-1

3
수퍼 유저에 오신 것을 환영합니다! 답변자가 외부 링크를 클릭 할 필요가없는 충분한 정보를 답변에 포함하십시오. 또한 답변이 기존 답변을 단순히 복제하지 않는지 확인하십시오 (해당 링크를 한 눈에 볼 때 수행중인 것처럼 보입니다).
Indrek

// 좋은 기사처럼 보입니다. 그러나 나는 stackexchange가 링크 대상과 독립적으로 노력하고 있다고 생각합니다. 약간의 설명을 추가 하시겠습니까?
Nathan Basanese
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.