readline에 대한 입력이 프롬프트보다 우선합니다.

readline에 대한 입력이 프롬프트보다 우선합니다.

1-n에서 주어진 옵션을 호출하거나 명령처럼 호출할 수 있는 대화형 bash 스크립트를 만들려고 합니다.

결국 시뮬레이션 프롬프트와 함께 나타나고 "읽기"를 사용하여 입력을 얻습니다.

하지만 너무 큰 텍스트를 입력하면 줄의 처음으로 돌아가서 입력한 프롬프트를 덮어쓰게 됩니다.

프롬프트는 색상으로 구분되어 있으며 이스케이프 색상을 제거하면 작동합니다. 하지만 색상은 마음에 드네요 :)

스크립트 프롬프트는 다음과 같습니다:

NOC=$(echo -en '\033[0m')               # Default
RED=$(echo -en '\033[00;31m')
YELLOW=$(echo -en '\033[00;33m')
CYAN=$(echo -en '\033[00;36m')

OPROMPT="${RED}[Admin${CYAN}@${RED}bulletproof]#${NOC}"

until [ ! -z "$MCHOICE" ]; do
        read -p "${OPROMPT} " -e MCHOICE
done

이 행동을 멈추려면 어떻게 해야 합니까? 그것을 알아낼 수없는 것 같습니다. 프롬프트를 표시하기 위해 echo나 printf를 사용하는 경우, 무언가를 입력한 다음 백스페이스를 눌러 수정하면 삭제됩니다.

확실하지 않은 경우 예를 들면 다음과 같습니다. 팁은 다음과 같습니다(색칠만 하세요 :P).

"[Admin@bulletproof]# "

...이제 다음 명령을 입력해 보세요.

"[Admin@bulletproof]# vpn start my"

...이제 계속해서 입력합니다

"domain.lanletproof]# vpn start my"

언제여야 하는가:

"[Admin@bulletproof]# vpn start mydomain.lan"

또한 터미널 창 크기에 따라 버퍼가 다르다는 점도 확인했습니다. 터미널을 최대화하면 동일한 지점에서 절단이 시작되지 않지만 "공차"가 더 길어집니다.

편집: 이 문제의 "버퍼링"을 대폭 개선하는 방법을 알아냈습니다.

코드를 다음과 같이 설정하면:

until [ ! -z "$MCHOICE" ]; do
        printf "$OPROMPT"
        read -p " " -e MCHOICE
done

더 긴 텍스트를 입력할 수 있게 됩니다. 이유는 잘 모르겠습니다..

답변1

Bash는 터미널에서 읽을 때 내장 함수를 readline실행할 때 read이 라이브러리를 사용합니다 . readline은 명령줄을 입력할 때도 사용됩니다. 줄 바꿈을 올바르게 처리하려면 readline은 프롬프트 문자열의 문자가 화면의 공간을 차지하지 않는지 알아야 합니다.

Ctrl+AC에서 readline을 호출하는 경우 화면 색상을 변경하는 데 사용되는 이스케이프 시퀀스를 ( \001) 및 Ctrl+B( )로 묶어야 합니다.\002

Bash를 사용하면 명령 프롬프트 변수( , 등)에 할당할 때 해당 제어 문자 대신 및 를 사용할 수 있습니다 \[. 최신 버전의 gdb도 이를 지원합니다.\]PS1PS2

분명히 bash는 이러한 편리함을 허용하지 않습니다 read -p. 따라서 이러한 제어 문자를 사용해야 합니다.

NOC=$'\001\e[0m\002'               # Default
RED=$'\001\e[00;31m\002'
YELLOW=$'\001\e[00;33m\002'
CYAN=$'\001\e[00;36m\002'

OPROMPT="${RED}[Admin${CYAN}@${RED}bulletproof]#${NOC}"

until [ ! -z "$MCHOICE" ]; do
        read -p "${OPROMPT} " -e MCHOICE
done

bash 4.4.23을 사용하여 테스트되었습니다.

관련 정보