답변:
rlwrap
소프트웨어 설치가 마음에 들지 않으면이 를 사용할 수 있습니다 .
스크립트에서 특정 프롬프트에 대한 기록 만 유지하는 별도의 기록 파일을 유지하려고 할 것입니다 (예 : 사용자의 쉘 명령 기록과 혼합하지 마십시오).
다음은 귀하에게 적합한 예입니다.
#!/bin/sh
# Save in rlwrap_example.sh
HISTORY=$HOME/.myscript_history
USERINPUT=$(rlwrap -H $HISTORY sh -c 'read REPLY && echo $REPLY')
echo "User said $USERINPUT"
$ ./rlwrap_example.sh
hello
User said hello
위의 스크립트에서 사용자는 모든 GNU readline 기능을 사용하여 기록을 제공하고 —에 저장했습니다 ~/.myscript_history
. 필요에 따라 조정하십시오.
또는 bash 's read -e
를 사용하여 read
호출에 대한 readline을 사용할 수 있지만 히스토리 기능이 너무 제한적일 수 있습니다 (예 : 거의 존재하지 않음).
이 오래된 메일 링리스트 게시물 에서 Mike Stroyan의 훌륭한 답변을 복사하려면 :
"history -r"을 사용하여 파일을 쉘 히스토리로 읽고 "history -s"를 사용하여 히스토리에 읽은 각 행을 추가 할 수 있습니다. 그런 다음 history -w를 사용하여 기록을 파일에 다시 저장하십시오. 다음은 vi 스타일 리드 라인 편집의 예입니다.
#!/bin/bash
history -r script_history
set -o vi
CMD=""
while true
do
echo "Type something"
read -e CMD
history -s "$CMD"
echo "You typed $CMD"
case "$CMD" in
stop)
break
;;
history)
history
;;
esac
done
history -w script_history
echo stopping
rlwrap
같은 (내 컴퓨터에 적어도)rlwrap
예를 실행 해, 정상적으로 CTRL-C를 처리 할 수 없습니다USERINPUT=$(rlwrap -o cat)
와 CTRL-C를 눌러 터미널 동작합니다 나중에 (실행 방법을 볼reset
다시 온전한 상태로 돌아 명령) .