지난 1~2년 동안 저는 웹 개발 프로젝트에 sqlite3을 자주 사용했습니다. 저는 항상 갑자기 명령 기록이 더 이상 작동하지 않는 문제를 발견했습니다. (위쪽 화살표를 누르면 bash에서와 같이 명령 기록이 표시됩니다.)
참고로
Ubuntu 22.04.3 LTS(6.5.0-21-generic) 및 .NET Core 8.0.200을 실행하고 있습니다.
내가 시도한 것
나는 이것을 이해할 수 없다.
- 파일을 확인해
~/.sqlite_history
보니 정상적으로 보입니다. - env 변수를 확인했지만
$SQLITE_HISTORY
이것이 없고 여전히 작동합니다(자세한 내용은 아래 참조). - sqlite3 최신 버전으로 업데이트 (3.45.1 2024-01-30)
- 이와 관련된 많은 질문을 조사했지만 역사가 갑자기 작동하지 않는 이유를 여전히 알 수 없습니다.
편집 - 콘솔 응용 프로그램을 사용해 보았지만 문제가 발생했습니다.
- 새 터미널 열기
- sqlite3 데이터베이스를 열고 기록 명령을 테스트하십시오. 작동합니다.
- sqlite3을 종료하고 명령줄(동일 터미널)로 돌아갑니다.
- 콘솔에 "Hello, World"를 인쇄하고 종료하는 .NET Core 콘솔 애플리케이션을 실행합니다. (dotnet run으로 시작)
- 2단계와 동일한 sqlite3 데이터베이스를 엽니다. 역사를 시도해 보세요. 이 터미널 창에서는 기록이 더 이상 유효하지 않습니다.
드디어 문제의 원인을 찾았습니다
마침내 sqlite3 기록이 작동하지 않는 이유를 알아냈습니다.
그러나 이것이 왜 문제를 일으키는지 이해할 수 없습니다.
문제를 재현하려면 다음을 수행해야 합니다.
- dotnet 핵심 웹 애플리케이션 시작의 예: (
$ dotnet run --project myWebApi
) - webapi 중지(CTRL-C)
- 내 데이터베이스를 확인하기 위해 sqlite3을 시작했습니다. 현재 시점에는 기록이 없습니다. (화살표를 위로 밀면 결과가 없습니다.)
문제에 대한 단서
새 터미널을 열고 sqlite3을 실행하면 기록이 다시 표시됩니다.
dotnet 핵심 애플리케이션이 저처럼 실행되고 있는데 거기에서 이상한 일이 벌어지고 있다고 생각하지 않지만 잘 모르겠습니다.
왜 이런 일이 일어나는지 아십니까?
답변1
터미널에는 여러 가지 화살표 키 시퀀스 세트가 있습니다. 일반적으로 Up시퀀스를 입력하는데 ESC [ A
, 동일한 키를 입력하는 "Apply Key" 모드가 있습니다 ESC O A
.
어떤 이유로 Wine과 dotnet은 모두 "콘솔" 추상화 계층의 예상치 못한 부분으로 이 모드를 활성화한 다음 종료 시 비활성화하는 것을 잊어버리는 경향이 있습니다.
(일반적으로 이 모드는 (비)활성화되어야 tput smkx
합니다 tput rmkx
.)
내가 올바르게 기억한다면 후자의 키 시퀀스는 "애플리케이션 모드에서 위쪽 화살표"가 아닙니다. "Ctrl-Arrow Up" 또는 이와 유사한 시퀀스를 사용하는 다른 터미널이 있습니다. 그러니 어떤 이유에서든,독서선Bash 및 다양한 기타 프로그램(sqlite 포함)에서 사용하는 입력 라이브러리는 이 시퀀스를 일반적인 "기록의 위쪽 화살표/이전 페이지"와 다른 작업에 바인딩합니다.