Bash 명령 기록의 교차 세션 중복 제거

Bash 명령 기록의 교차 세션 중복 제거

문제 배경:

  • 항상 활발 ignoreboth하고erasedups
  • HIST_SIZEFILESIZE예상된/실제 제한 사항이 있음다른사용자의 역사
  • 거의 항상 여러 개의 병렬 세션과 (보통) 중첩 세션이 있습니다.

예상되는 동작:

  • 세션을 닫고 다른 세션을 다시 연 후에는 세션 기록에 중복된 콘텐츠가 없어야 합니다.

  • 다른 세션을 열기 전에 모든 세션을 닫을 필요는 없습니다.

  • 활성 세션의 기록은 다른 실행 중/닫힌 세션의 영향을 받아서는 안 됩니다(따라서 모든 세션에 대해 단일 기록을 선택하는 것은 해결책이 아닙니다).

  • 반면에 새 세션은 열기 전에 기록 라인의 모든 부분을 (자연스럽게) 닫아야 합니다(물론 중복 없이).

행동:

  1. 일부 시스템에서 다른 병렬 세션 없이 세션 시작

  2. 가정하다저장됨History² 마지막 3줄:

    ./reference-point  # anything, just to use as a reference
    ls
    la
    ll
    
  3. 중첩된 세션을 시작합니다(ssh 및 bash 명령도 기록에 유지됩니다). 나는 간단하게 만들 것이다:

    ssh machine
    
  4. 3개의 명령을 각각 적어도 한 번씩, 다른 순서로 실행하십시오. 예를 들어:

    ll
    ls
    la
    ll
    
  5. 마지막 4줄은 다음과 같아야 합니다.

    ./reference-point  # anything, just so we know
    ls
    la
    ll
    
  6. 이제 이 세션을 닫습니다(CTRL+D 또는 기록에 유지되지 않는 모든 항목을 사용). 이제 첫 번째 세션에서 마지막 5줄은 다음과 같아야 합니다.

    ./reference-point  # anything, just so we know
    ls
    la
    ll
    ssh machine
    
  7. 이 세션을 닫습니다(현재 유일한 활성 세션입니다).

  8. 다른 세션을 시작하고 지난 10개의 기록 기록을 확인하세요.

    ./reference-point  # anything, just so we know
    ls
    la
    ll
    ls
    la
    ll
    ssh machine
    

이 예는 역사적 반복이 서로 달라붙게 만듭니다. 그러나 물론 실용적인 목적은 아닙니다. 나쁜 부작용은 우리가 사용할 수 있는 구성에서 기록 크기를 추측할 수 없다는 것입니다. 게다가 이런 행동은 명백히 잘못된 것입니다.

내가 원하는 것 이상으로 "HIST*SIZE" 구성을 늘리는 것 외에 문제를 해결하거나 (적어도) 더 잘 처리할 수 있는 다른 방법이 있습니까?


몇 가지 메모를 하고 싶습니다.

이 버그는 꽤 오래되었으며 실제 해결책을 생각해낸 사람이 아무도 없습니다. 그리고 내 특정 상황에서는 웹에서 제공되는 솔루션 중 일부에 문제나 작은 "문제"가 있을 수 있습니다.

이 문제는2014년 사바나에 대한 보고. 그러나 지금까지 아무도 그 책을 읽지 않은 것 같습니다. 확인해 볼 수 있습니다(그리고 Bash의 공식 장소이므로 거기에 유용한 의견을 게시할 수도 있습니다).

--

중첩된 세션은 나에게 필요하며 일반적이어야 합니다. 예: 폐쇄된 네트워크 액세스 컴퓨터에 SSH로 접속한 다음 하나 이상의 컴퓨터에 다시 로그인합니다(병렬 세션에서도 일반적임).

² 유지된 명령에 영향을 주지 않고 기록 줄을 확인하려면 "ignoreboth" Bash 구성을 사용하고 "history 10"(명령 앞의 공백에 주의하세요!) 또는 이와 유사한 작업을 수행하면 됩니다. 이 질문을 작성하는 동안 테스트용으로 이것을 사용했습니다.

관련 정보