[unix] 역사를 읽다

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


답변