세션 간 ksh 명령 기록을 활성화하는 방법

세션 간 ksh 명령 기록을 활성화하는 방법

ksh또는 을 실행하면 mksh위쪽 화살표는 아무 작업도 수행하지 않습니다.

$ ksh
$ ^[[A^[[A^[[A^[[A^[[A

bash하지만 시작 bash하고 위쪽 화살표를 누르면 작동합니다.

$ bash
developer@1604:~$ ssh [email protected] -p 2223

ksh 또는 mksh를 시작하면 기록이 없습니다. $HISTFILE 변수도 설정했는데 새 쉘을 시작해도 여전히 기록이 없습니다.

어떡해? Korn 쉘은 세션 간의 기록을 기억할 수 없지만 bash 쉘은 기억할 수 있다는 것이 사실입니까?

Korn 쉘이 마음에 들고 더 좋고 더 광범위한 기록을 원한다면 ksh를 통해 이 기능을 사용할 수 있습니까?

답변1

아니요, 이는 사실이 아닙니다.

파일 이름인 경우 $HISTFILE해당 파일에 세션 기록이 저장됩니다. 이것은 매뉴얼에 설명되어 있습니다. 쉘 히스토리에 기억되는 명령 수는 값에 의해 제한됩니다 $HISTSIZE.

bash나는 쉘 세션이 끝날 때가 아니라 각 명령 후에 기록이 파일로 플러시된다고 생각합니다 . 이는 ksh사용하는 구현 에 따라 달라질 수 있습니다 .

HISTFILE파일의 파일 이름 ~/.profile(로그인 셸에서 읽음) 또는 지정 파일 $ENV(대화형 셸에서 읽음, 기본값은 $HOME/.kshrc) ksh93의 파일 이름으로 설정합니다 . 기본값은 $HISTSIZE사용 중인 구현에 따라 500, 512 또는 이와 유사한 것입니다. ksh이러한 변수는 내보낼 필요가 없습니다. 이 작업을 수행하기 전에 기록 파일이 존재할 필요는 없습니다.


의견에서 특정 Emacs 이동 및 명령줄 편집 키가 작동하지 않는다고 언급하셨습니다. 이는 쉘이 Emacs 편집 모드에 있지 않기 때문입니다. 변수 EDITOR(또는 VISUAL)를 로 설정하거나 Emacs 명령줄 편집 모드를 활성화하는 데 emacs사용합니다 . set -o emacs이는 매뉴얼에도 설명되어 있습니다. 이러한 변수는 쉘 이외의 프로그램에서 사용하려는 경우가 아니면 내보낼 필요도 없습니다.


요약:

파일 에서 $HOME/.profile:

export ENV="$HOME/.kshrc"

파일 에서 $HOME/.kshrc:

HISTFILE="$HOME/.ksh_history"
HISTSIZE=5000

export VISUAL="emacs"
export EDITOR="$VISUAL"
set -o emacs

이는 OpenBSD에서 ksh93pdksh( OpenBSD에서)을 사용하여 ksh철저하게 테스트되었습니다 . 나는 그것을 사용하지 않지만 파생물 mksh이기 때문에 pdksh이것이 해당 쉘에서도 작동할 것이라고 믿습니다.

노트저것 pdkshksh93(그리고 bash)기록 파일을 공유할 수 없습니다.역사적 형식이 다르기 때문입니다.

bashfor 및 for ( with in ) ksh와 같이 및 에 대한 초기화 파일을 분리한 경우 일반적으로 문제가 되지 않습니다. (일반적으로) 를 살펴보면 다양한 구현을 더욱 차별화 할 수 있습니다..bash_profile.bashrcbash.profile.kshrckshexport ENV="$HOME/.kshrc".profileksh$KSH_VERSION

답변2

잠시. 기본적으로 KSH는 명령 기록을 반복하는 화살표 키를 허용하지 않습니다.

이 질문을 보세요:

https://stackoverflow.com/questions/1623256/make-arrow-and-delete-keys-work-in-kornshell-command-line

팀의 답변:

화살표 키의 경우 이를 pdksh홈 디렉터리의 .kshrc 파일[(둘 다, 아님)]에 넣을 수 있습니다.mksh.mkshrc.kshrc

set -o emacs
alias __A=`echo "\020"`     # up arrow = ^p = back a command
alias __B=`echo "\016"`     # down arrow = ^n = down a command
alias __C=`echo "\006"`     # right arrow = ^f = forward a character
alias __D=`echo "\002"`     # left arrow = ^b = back a character
alias __H=`echo "\001"`     # home = ^a = start of line
alias __Y=`echo "\005"`     # end = ^e = end of line

등호 왼쪽의 문자 앞에는 두 개의 밑줄 문자가 있습니다. 등호 오른쪽의 목표는 별칭에 할당된 올바른 제어 문자를 얻는 것입니다. 스크립트가 이를 수행하는 방식은 명령을 실행하는 것입니다(back-tics를 통해).

echo "\020"

__B에 할당된 control-n 문자를 가져옵니다.

편집(mirabilos 덕분에): 소싱할 때 백틱에 있는 항목을 제거했습니다. 나는 이것 때문에 오해를 받았습니다:

바라보다https://stackoverflow.com/questions/9449778/what-is-the-benefit-of-using-instead-of-backticks-in-shell-scripts

$HISTFILE환경 변수가 파일을 가리키는지 확인하면 됩니다 .

나는 pdksh을 가지고 있습니다.매뉴얼 페이지:

참고: HISTFILE을 설정하지 않으면 기록 파일이 사용되지 않습니다. 이는 앞으로 $HOME/.sh_history를 사용하는 원래 Korn 쉘과 다릅니다. pdksh는 기본 기록 파일도 사용할 수 있습니다.

mksh이 때문에동일한:

참고: HISTFILE을 설정하지 않으면 기록 파일이 사용되지 않습니다. 이는 AT&T UNIX ksh와 다릅니다.

my pdksh와 my 둘 다 파일 mksh로 사용된다는 점에 유의하세요 . 또한 RTFM() 과 관련하여 구현에서 다른 것을 사용할 수 있습니다. (힌트를 주신 Kusalananda에게 감사드립니다)$HOME/.mkshrc.kshrcman ksh

그런데, 명령을 사용하여 ksh 기록을 bash_history로 쉽게 변환 strings하고 다음과 같이 sed를 사용하여 구성할 수 있습니다.

strings <history_file> | sed 's/^[ \t]*//' >> $HOME/bash_history

답변3

내 생각에 무슨 일이 일어나고 있는지는 bash부터 시작하여 화살표를 사용하여 명령 기록에 액세스하는 데 익숙하다는 것입니다. 내가 아는 한, 이것은 KSH에서 활성화되지 않습니다(루프를 통해 수행하지 않는 한). "set -o vi"를 사용하지 않는 한 vi의 커서 이동 및 텍스트 편집 키를 사용할 수 있습니다. 예: < h > 왼쪽, <j> 위, <k> 아래, <l> 오른쪽, <i> 삽입, <x> 문자 삭제, <d> <w> 단어 삭제 등, 자세한 내용여기 하지만 "history" 명령을 실행할 때 명령 기록을 볼 수 있다면 위의 팁을 사용하여 기록을 찾아볼 수 있어야 합니다. 그러나 "history" 명령이 아무것도 출력하지 않는다면 다른 문제가 될 것이라고 생각합니다(일반적인 문제는 ".sh_history" 파일 소유권 및 권한입니다). ^_^

관련 정보