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, 히스토리 기능이 너무 제한적(즉, 거의 존재하지 않음)을 발견할 수 있습니다.

관련 정보