x86의 RHEL 2.6에서 KSH를 실행하고 있습니다. KSH 버전은 다음과 같습니다.
sh (AT&T리서치) 93u+ 2012-08-01
Bash로 전환하거나 Tcsh(이전 직장에서 즐겨 사용했던)로 다시 전환하는 것은 불가능합니다.
KSH에 대해 제가 발견한 첫 번째 짜증나는 점은 때때로 위쪽 키를 사용하여 기록을 스크롤할 때 다른 터미널(한 번에 여러 터미널이 열려 있음)의 기록이 함께 혼합된다는 것입니다. 그런 다음 모든 터미널이 HISTFILE을 공유한다는 것을 알게 되었습니다. 좋은데, 항상 함께 섞이지 않는다는 게 여전히 이상해요. 또한 HISTFILE이 항상 즉시 업데이트되지는 않는다는 사실도 확인했습니다. 결국 나는 KSH가 아마도 일부 명령 기록을 버퍼링하고 주기적으로 내용을 HISTFILE로 플러시하고 있음을 확인했습니다. 이 동작에 대한 문서는 어디에서도 찾을 수 없지만 합리적인 설명인 것 같습니다.
저는 각 세션이 서로 다른 기록을 가지길 원했기 때문에 이것을 .kshrc 파일에 추가했습니다:
HISTFILE=~/.hist.$(tty | sed 's;.*/;;')
각 터미널마다 고유한 HISTFILE을 제공해야 합니다. 그것은 훌륭합니다. 그런데...이러한 기록 파일은 정기적으로 삭제되는 것 같습니다. 현재 대부분의 파일 크기는 0바이트입니다.
고쳐 쓰다: 열려 있는 모든 터미널의 다양한 기록 파일은 10분마다 삭제됩니다. 정기적인.
전에 이것을 본 사람이 있나요? ? ?
고쳐 쓰다:2년이 지난 지금도 답은 아직 멀었습니다. 최근에 많이 짜증났어요. ksh 소스 코드를 조사하기 시작했지만 저는 하드웨어 디자이너이고 코멘트가 많지 않아 매우 어렵습니다.
글쎄요, 그게 단서일지도 모르겠네요. 내 기록 파일의 모든 줄은 ^@ 문자(emacs로 렌더링됨)로 시작됩니다. 이는 0x40(@ 문자) + 0x80(제어 비트) = 0xc0 = 8진수 300을 의미한다고 생각합니다. 내가 아는 한,history.c에 언급된 유일한 특수 문자는 0201과 0202입니다. 내 기록 파일은 \201로 시작합니다(다시 말하지만, emacs로 렌더링하면 8진수인 것 같습니다).
다음은 일반적인 기록 파일의 예입니다. 정상적으로 보이나요?
�ls
pwd
clear
ls
ls
tty
글쎄, 이러한 제어 문자는 올바르게 표시되지 않습니다. 다음과 같이 일반 문자로 변환됩니다.
\201^Als
^@pwd
^@^@clear
^@^@ls
^@ls
^@tty
^@^@
때로는 두 개의 ^@ 문자가 표시되고 때로는 하나가 표시되지만 이유를 이해할 수 없습니다. 이것은 단서가 아닐 수도 있지만 지금은 다른 단서가 없습니다.
고쳐 쓰다: 해결되었습니다! 좋아요, 거의 다 됐어요. 이 글을 올리자마자 나는 역사에서 다른 것들을 검색하기 시작했습니다.c. 나는 이것을 보았다:
/*
* clean out history file OK if not modified in HIST_RECENT seconds
*/
static int hist_clean(int fd)
{
struct stat statb;
return(fstat(fd,&statb)>=0 && (time((time_t*)0)-statb.st_mtime) >= HIST_RECENT);
}
당연히 HIST_RECENT는 600으로 설정되어 있는데, 이는 제가 찾고 있는 간격인 정확히 10분입니다. 비활성화하는 방법을 잘 찾지 못했지만 아무리 싫어하더라도 의도적인 동작처럼 보입니다.
답변1
예, 쉘이 종료될 때에도 ksh93
명령줄 기록을 파일에 기록합니다 . bash
그래도 파헤쳐봐일부 소스 코드, 메모리 내 히스토리 버퍼가 4k( HIST_BSIZE
코드에서)인 것 같지만 가득 찼을 때 또는 특정 수의 명령 후에 플러시하는지 알 수 없습니다(누가 HIST_MARKSZ
이 코드에서 무엇이든 할 수 있습니까?) .
예, 많은 대화형 세션이 HISTFILE
동일한 설정을 사용하는 경우 기록을 공유합니다. 이것은 문서화되어 있습니다 (필자의 강조):
명령을 다시 입력하십시오.
단말 장치에서 입력한 마지막(기본값 512) 명령의 텍스트가
HISTSIZE
히스토리 파일에 저장됩니다. 변수가 설정되지 않았거나 이름이 지정된 파일이 쓰기 가능하지 않은 경우$HOME/.sh_history
해당 파일이 사용됩니다.HISTFILE
쉘은 동일한 이름을 사용하는 모든 대화형 쉘의 명령에 액세스할 수 있습니다HISTFILE
.
기록 파일은 지정된 크기로 유지되지만 HISTSIZE
발생한 대로 주기적으로 잘리지는 않습니다. 너에게 무슨 일이 일어나고 있는지, 내가생각하다, 각 대화형 셸 세션마다 tty
고유한 파일을 설정하므로 HISTFILE
대화형 세션을 종료하고 다시 시작하면 셸이 연결된 TTY에 따라 "올바른" 기록 파일이 선택되거나 선택되지 않을 수 있습니다.
쉘 세션에 새 TTY(이전 세션에서 사용된 적이 없는 TTY)가 할당되면 해당 기록 파일은 자연스럽게 비어 있게 됩니다.