여러 터미널 창에서 bash 기록 유지

여러 터미널 창에서 bash 기록 유지

항상 여러 개의 터미널이 열려 있습니다. 2시부터 10시까지 온갖 종류의 일을 해보세요. 이제 재부팅하고 다른 터미널 세트를 연다고 가정해 보겠습니다. 어떤 사람은 특정한 것을 기억하고 어떤 사람은 잊어버립니다.

나는 다음과 같은 역사를 원합니다 :

  • 각 터미널의 모든 것을 기억하세요
  • 모든 터미널에서 즉시 액세스할 수 있습니다(예: ls한 터미널에 있는 경우 이미 실행 중인 다른 터미널로 전환하고 위쪽 키를 누르면 ls표시됩니다).
  • 명령 앞에 공백이 있으면 명령을 잊지 마십시오.

bash가 더 그렇게 작동하도록 할 수 있는 방법이 있나요?

답변1

다음을 다음 항목에 추가하세요 ~/.bashrc.

# Avoid duplicates
HISTCONTROL=ignoredups:erasedups
# When the shell exits, append to the history file instead of overwriting it
shopt -s histappend

# After each command, append to the history file and reread it
PROMPT_COMMAND="${PROMPT_COMMAND:+$PROMPT_COMMAND$'\n'}history -a; history -c; history -r"

답변2

내 역사와 관련된 모든 내용은 다음과 같습니다 .bashrc.

export HISTCONTROL=ignoredups:erasedups  # no duplicate entries
export HISTSIZE=100000                   # big big history
export HISTFILESIZE=100000               # big big history
shopt -s histappend                      # append to history, don't overwrite it

# Save and reload the history after each command finishes
export PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND"

bash 3.2.17을 사용하여 Mac OS X 10.5에서, bash 4.1.7을 사용하여 10.6에서 테스트되었습니다.

답변3

이것은 Bash 세션 기록 공유에 대한 나의 시도입니다. 이렇게 하면 bash 세션 간의 기록 공유가 가능해지고, 기록 카운터가 혼동되지 않으며, 기록 확장이 작동합니다 !number(일부 제한 있음).

Ubuntu 10.04 LTS(Lucid Lynx)에서 Bash 버전 4.1.5를 사용합니다.

HISTSIZE=9000
HISTFILESIZE=$HISTSIZE
HISTCONTROL=ignorespace:ignoredups

_bash_history_sync() {
    builtin history -a         #1
    HISTFILESIZE=$HISTSIZE     #2
    builtin history -c         #3
    builtin history -r         #4
}

history() {                  #5
    _bash_history_sync
    builtin history "$@"
}

PROMPT_COMMAND=_bash_history_sync

설명하다:

  1. 방금 입력한 줄을 추가합니다 $HISTFILE(기본값은 .bash_history). 그러면 $HISTFILE한 행이 늘어납니다.

  2. 특수 변수를 $HISTFILESIZE특정 값으로 설정하면 Bash는 가장 오래된 항목을 제거하여 줄의 길이만 자르게 됩니다 $HISTFILE.$HISTFILESIZE

  3. 실행 중인 세션의 기록을 지웁니다. 이렇게 하면 기록 카운터 수가 줄어듭니다 $HISTSIZE.

  4. 콘텐츠를 읽어 $HISTFILE현재 실행 중인 세션 기록에 삽입합니다. 그러면 기록 카운터가 행 수만큼 증가합니다 $HISTFILE. 행 수가 $HISTFILE반드시 필요한 것은 아닙니다 $HISTFILESIZE.

  5. history()기능은 내장된 기록을 재정의하여 표시하기 전에 기록이 동기화되도록 합니다. 이는 볼륨에 따른 역사적 확장에 필요합니다(나중에 자세히 설명).

추가 설명:

  • 1단계 현재 실행 중인 세션의 명령이 전역 기록 파일에 기록되었는지 확인합니다.

  • 4단계 다른 세션의 명령을 현재 세션 기록으로 읽어들이는지 확인하세요.

  • 4단계에서는 기록 카운터가 증가하므로 어떻게든 카운터를 감소시켜야 합니다. 이 작업은 3단계에서 수행됩니다.

  • 3단계에서는 기록 카운터가 감소합니다 $HISTSIZE. 4단계에서는 기록 카운터가 행 수만큼 증가됩니다 $HISTFILE. 2단계에서는 행 수가 $HISTFILE올바른지 확인합니다 $HISTSIZE(즉, $HISTFILESIZE와 동일해야 함 $HISTSIZE).

역사적 확장의 한계에 관하여:

숫자로 확장된 기록을 사용하는 경우 다음을 수행해야 합니다.언제나번호를 찾아보세요사용하기 전에. 이는 번호 조회와 사용 사이에 bash 프롬프트가 나타나지 않음을 의미합니다. 이는 일반적으로 Enter가 없고 Ctrl+C가 없음을 의미합니다.

일반적으로 여러 Bash 세션이 있으면 숫자 기록 확장이 Bash 프롬프트 표시 간에 해당 값을 유지한다는 보장이 없습니다. 실행 되면 PROMPT_COMMAND다른 모든 Bash 세션의 기록이 현재 세션의 기록에 통합되기 때문입니다. 다른 bash 세션에 새 명령이 있으면 현재 세션의 기록 번호가 달라집니다.

나는 이러한 제한이 타당하다고 생각한다. 그럼에도 불구하고 임의의 역사적 숫자가 기억나지 않기 때문에 매번 그 숫자를 찾아보아야 합니다.

일반적으로 나는 이와 같은 디지털 기록 확장 프로그램을 사용합니다.

$ history | grep something #note number
$ !number

다음 Bash 옵션을 사용하는 것이 좋습니다.

## reedit a history substitution line if it failed
shopt -s histreedit
## edit a recalled history line before executing
shopt -s histverify

이상한 오류:

파이프로 연결된 기록 명령을 실행하면 해당 명령이 기록에 두 번 나열됩니다. 예를 들어:

$ history | head
$ history | tail
$ history | grep foo
$ history | true
$ history | false

모든 것은 역사에 두 번 기록될 것입니다. 이유는 모르겠습니다.

개선 아이디어:

  • _bash_history_sync()더 이상 매번 실행되지 않도록 함수를 수정합니다 . 예를 들어 CTRL+C프롬프트 후에 실행하면 안 됩니다. CTRL+C긴 명령줄을 실행하지 않기로 결정하면 해당 줄을 포기하는 경우가 많습니다. 때로는 CTRL+CBash가 스크립트를 완성하는 것을 막아야 할 때도 있습니다 .

  • 현재 세션의 명령은 항상 현재 세션 기록의 최신 명령이어야 합니다. 이는 또한 주어진 기록 번호가 해당 세션의 기록 항목 값을 유지한다는 부작용도 있습니다.

답변4

이렇게 하려면 다음 두 줄을 추가해야 합니다 ~/.bashrc.

shopt -s histappend
PROMPT_COMMAND="history -a;history -c;history -r;$PROMPT_COMMAND"

에서 man bash:

histappend 셸 옵션이 활성화된 경우(아래 SHELL BUILTIN COMMANDS 아래의 shopt 설명 참조), 이 줄은 기록 파일에 추가되고, 그렇지 않으면 기록 파일을 덮어쓰게 됩니다.

관련 정보