read
위로 / 아래로 키를 눌러 내장 명령 지원 기록을 작성하려면 어떻게 해야합니까?
up 키를 누를 때 잡으려고 시도했지만 작동하지 않는 것 같습니다 read
.
read -p '> ' -n 3 foo
echo
echo -n "$foo" | hexdump
화살표 키를 누르면 작동하는 것으로 보이며 이것을 사용하여 감지 할 수 있지만을 누르면 aa↑위쪽 화살표 식별자의 첫 번째 문자 만 읽으므로 세 번째는 다른 화살표를 구별해야하므로 실패합니다 열쇠.
답변
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