역사를 읽다


11

read위로 / 아래로 키를 눌러 내장 명령 지원 기록을 작성하려면 어떻게 해야합니까?

up 키를 누를 때 잡으려고 시도했지만 작동하지 않는 것 같습니다 read.

read -p '> ' -n 3 foo
echo
echo -n "$foo" | hexdump

화살표 키를 누르면 작동하는 것으로 보이며 이것을 사용하여 감지 할 수 있지만을 누르면 aa위쪽 화살표 식별자의 첫 번째 문자 만 읽으므로 세 번째는 다른 화살표를 구별해야하므로 실패합니다 열쇠.

답변:


9

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을 사용할 수 있지만 히스토리 기능이 너무 제한적일 수 있습니다 (예 : 거의 존재하지 않음).


10

오래된 메일 링리스트 게시물 에서 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다시 온전한 상태로 돌아 명령) .
zpon

추가 라이브러리를 설치하지 않으려는 경우 별도의 파일을 사용하여 입력을 관리하는 것이 행복하다면 정말 효과적입니다.
Luke Exton
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.