read
내장 명령을 순환하기 위해 위/아래 키를 눌러 기록을 지원하는 방법은 무엇입니까 ?
위쪽 키를 눌렀을 때 잡기를 시도했지만 작동하지 않는 것 같습니다 read
.
read -p '> ' -n 3 foo
echo
echo -n "$foo" | hexdump
화살표 키를 누르면 작동하는 것 같고 이를 사용하여 감지할 수 있지만 누르면 aa↑위쪽 화살표 식별자의 첫 번째 문자만 읽고 다른 화살표 키를 구별하려면 세 번째 문자가 필요하기 때문에 실패합니다.
답변1
Mike Stroyan의 훌륭한 답변 복사오래된 메일링 리스트 게시물:
"history -r"을 사용하여 쉘의 기록으로 파일을 읽을 수 있고, "history -s"를 사용하여 읽은 각 줄을 기록에 추가할 수 있습니다. 그런 다음 기록 -w를 사용하여 기록을 다시 파일에 저장합니다. 이것은 vi 스타일 readline 편집의 예입니다.
#!/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
답변2
당신은 그것을 사용할 수 있습니다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 읽기 라인기능, 이력은 - 에 의해 제공되고 저장됩니다 ~/.myscript_history
. 필요에 따라 조정하십시오.
read -e
대안으로, readline 호출을 지원하는 bash를 사용할 수 있지만 read
, 히스토리 기능이 너무 제한적(즉, 거의 존재하지 않음)을 발견할 수 있습니다.