명령 기록이 종료 시에만 저장되는 이유

명령 기록이 종료 시에만 저장되는 이유

탭/터미널별로 다른 기록 파일을 저장하려고 하는데 명령 실행 후 즉시 저장할 수 없습니다. "exit"를 실행하면 기록이 저장됩니다.

내가 달성하고 싶은 것은 터미널이나 컴퓨터가 충돌할 경우를 대비해 기록의 복사본을 갖는 것이므로 이것이 문제입니다.

인터넷을 둘러본 후 내 .bashrc 파일에 다음과 같은 내용이 있습니다.

export HISTFILE="$HOME/HISTORIES/bash_history_$(basename $(tty))_$(date '+%Y-%m-%d_%H-%M-%S_%Z')"
export HISTCONTROL=ignoreboth
export HISTFILESIZE=10000
export HISTSIZE=10000
shopt -s histappend
PROMPT_COMMAND=$(history -a; $PROMPT_COMMAND)

내가 뭘 잘못하고 있는지 아시나요?

감사해요.

답변1

PROMPT_COMMAND를 잘못 할당하고 있습니다. 당신이 쓸 때

PROMPT_COMMAND=$(history -a; $PROMPT_COMMAND)

'history -a'(출력을 생성하지 않음)를 실행한 다음 $PROMPT_COMMAND(시작 스크립트 중에 비어 있을 수 있음)를 실행하고 두 명령의 출력(빈 문자열)을 PROMPT_COMMAND에 할당합니다. 당신이 원하는 것은 단지 :

PROMPT_COMMAND='history -a'

현재 존재하는 명령에 추가하려면 다음을 수행하십시오.

PROMPT_COMMAND+="history -a${PROMPT_COMMAND+=; }$PROMPT_COMMAND"

답변2

내가 이해할 수 없는 어떤 이유로 인해 다음과 같이 작동합니다.

export HISTFILE_NEW="$HOME/HISTORIES/bash_history_$(basename $(tty))_$(date '+%Y-%m-%d_%H-%M-%S_%Z')"
export HISTCONTROL=ignoreboth
export HISTFILESIZE=10000
export HISTSIZE=10000
shopt -s histappend
PROMPT_COMMAND="history -w $HISTFILE_NEW; $PROMPT_COMMAND"

반면에 그렇지 않습니다

export HISTFILE="$HOME/HISTORIES/bash_history_$(basename $(tty))_$(date '+%Y-%m-%d_%H-%M-%S_%Z')"
export HISTCONTROL=ignoreboth
export HISTFILESIZE=10000
export HISTSIZE=10000
shopt -s histappend
PROMPT_COMMAND="history -a; $PROMPT_COMMAND"

물론 첫 번째 솔루션은 새 명령이 작성될 때마다 전체 기록이 저장되기 때문에 이론적으로 좋은 솔루션(두 번째)보다 속도가 느립니다.

그러므로 왜 이런 일이 발생했는지, 어떻게 해결할 수 있는지 아시는 분이 계시다면 매우 감사하겠습니다.

답변3

문자 그대로의 질문보다는 의도에 답하기:

스크립트 사용을 살펴보세요. 그러면 명령과 출력이 제공됩니다. 커서 위치 지정을 사용하는 명령은 나중에 해독하기 어렵기 때문에 이것이 만병통치약은 아닙니다.

이름 스크립트 - 터미널 세션의 타이프스크립트 만들기

개요 스크립트 [-a] [-c 명령] [-f] [-q] [-t] [파일]

설명 스크립트는 터미널에 인쇄된 모든 내용을 타이프스크립트로 만듭니다. 나중에 lpr(1)을 사용하여 타이프스크립트 파일을 인쇄할 수 있으므로 과제의 증거로 대화형 세션의 하드카피 기록이 필요한 학생에게 유용합니다.

인수 파일이 주어지면 스크립트는 모든 대화를 파일에 저장합니다. 파일 이름이 지정되지 않으면 TypeScript가 파일 TypeScript에 저장됩니다.

옵션:

  -a'        Append the output to file or typescript, retaining the priorcontents.

-c COMMAND 대화형 쉘이 아닌 COMMAND를 실행합니다. 이렇게 하면 stdout이 tty가 아닐 때 다르게 동작하는 프로그램의 출력을 스크립트에서 쉽게 캡처할 수 있습니다. -f' 각 쓰기 후에 출력을 플러시합니다. 이는 원격협력에 좋습니다. 한 사람이 'mkfifo foo; script -f foo' 그리고 다른 하나는 'cat foo'를 사용하여 수행되는 작업을 실시간으로 감독할 수 있습니다.

-q' 조용히 하세요.

-t' 타이밍 데이터를 표준 오류로 출력합니다. 이 데이터에는 공백으로 구분된 두 개의 필드가 포함되어 있습니다. 첫 번째 필드는 이전 출력 이후 경과된 시간을 나타냅니다. 두 번째 필드는 이번에 출력된 문자 수를 나타냅니다. 이 정보는 사실적인 타이핑 및 출력 지연으로 타이프스크립트를 재생하는 데 사용될 수 있습니다.

스크립트는 분기된 쉘이 종료될 때 종료됩니다(Bourne 쉘(sh(1))을 종료하기 위한 control-D) 및 C 쉘, csh(1)에 대한 종료, 로그아웃 또는 control-d(ignoreof가 설정되지 않은 경우) ).

vi(1)과 같은 특정 대화형 명령은 typescript 파일에 가비지를 만듭니다. 스크립트는 화면을 조작하지 않는 명령에서 가장 잘 작동하며 결과는 하드카피 터미널을 에뮬레이트하기 위한 것입니다. ...

구글에서 "man script"를 검색해 보세요. 특정 OS가 있는 경우 해당 OS를 포함하세요. 이것은 Linux 버전이지만 *BSD, Mac에는 거의 동일한 버전이 존재합니다. 아마도 Windows 포트도 있을 것입니다.

관련 정보