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에서 ksh93
및 pdksh
( OpenBSD에서)을 사용하여 ksh
철저하게 테스트되었습니다 . 나는 그것을 사용하지 않지만 파생물 mksh
이기 때문에 pdksh
이것이 해당 쉘에서도 작동할 것이라고 믿습니다.
노트저것 pdksh
과 ksh93
(그리고 bash
)기록 파일을 공유할 수 없습니다.역사적 형식이 다르기 때문입니다.
bash
for 및 for ( with in ) ksh
와 같이 및 에 대한 초기화 파일을 분리한 경우 일반적으로 문제가 되지 않습니다. (일반적으로) 를 살펴보면 다양한 구현을 더욱 차별화 할 수 있습니다..bash_profile
.bashrc
bash
.profile
.kshrc
ksh
export ENV="$HOME/.kshrc"
.profile
ksh
$KSH_VERSION
답변2
잠시. 기본적으로 KSH는 명령 기록을 반복하는 화살표 키를 허용하지 않습니다.
이 질문을 보세요:
팀의 답변:
화살표 키의 경우 이를
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 덕분에): 소싱할 때 백틱에 있는 항목을 제거했습니다. 나는 이것 때문에 오해를 받았습니다:
$HISTFILE
환경 변수가 파일을 가리키는지 확인하면 됩니다 .
나는 pdksh
을 가지고 있습니다.매뉴얼 페이지:
참고: HISTFILE을 설정하지 않으면 기록 파일이 사용되지 않습니다. 이는 앞으로 $HOME/.sh_history를 사용하는 원래 Korn 쉘과 다릅니다. pdksh는 기본 기록 파일도 사용할 수 있습니다.
mksh
이 때문에동일한:
참고: HISTFILE을 설정하지 않으면 기록 파일이 사용되지 않습니다. 이는 AT&T UNIX ksh와 다릅니다.
my pdksh
와 my 둘 다 파일 mksh
로 사용된다는 점에 유의하세요 . 또한 RTFM() 과 관련하여 구현에서 다른 것을 사용할 수 있습니다. (힌트를 주신 Kusalananda에게 감사드립니다)$HOME/.mkshrc
.kshrc
man 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" 파일 소유권 및 권한입니다). ^_^