사용자 삽입 프롬프트 오른쪽에 문자열을 표시하는 방법

사용자 삽입 프롬프트 오른쪽에 문자열을 표시하는 방법

간단한 스크립트가 있습니다

#!/bin/bash
SENTENCE=""
while read word
do
    SENTENCE="$SENTENCE $word"
done

사용자와의 상호 작용으로 인해 다음이 발생할 수 있습니다.

a
a
b
a b
c
a b c
d
a b c d

사용자와 같은 줄 오른쪽에 문자열을 표시하여 출력을 얻는 방법

a                                 a
b                                 a b
c                                 a b c
d                                 a b c d

답변1

가장 간단한 경우(짧은 단어 하나, 줄 바꿈 없음, 화면 끝까지 스크롤할 걱정 없음)를 가정하면 다음을 수행할 수 있습니다.

#!/bin/bash
SENTENCE=""
tput sc
while read word
do
    SENTENCE="$SENTENCE $word"
    tput rc
    tput hpa 20
    printf '%s\n' "$SENTENCE"
    tput sc
done

이는 사용하게 될 대부분의 터미널 설명에 있는 두 가지 터미널 기능을 사용합니다.

  • 커서 위치 저장/복원(sc그리고rc매개변수) 및
  • 수직적 지위(hpa범위).

해당 이스케이프 시퀀스를 하드코딩할 수 있지만 그렇게 하면 가독성이 저하됩니다...

그런데 일부에서는 위쪽 화살표 이스케이프를 사용하도록 제안할 수도 있지만 이는 화면 끝에서 스크롤하는 것과 동일한 문제가 있으며 이 문제도 발생합니다 \e[F( CPL, 터미널 설명에 없음).

수평으로 이동하려면 매개변수와 함께 오른쪽 커서를 사용할 수 있습니다. 예를 들면 다음과 같습니다.

tput cuf 20

이것은 ~이 될 것이다 \e[20C.

질문 끝에 댓글이 있습니다\e[1a, 그러나 ANSI 이스케이프 시퀀스는 대소문자에 따라 다르며 이는 다음과 일치합니다.\e[1A(커서를 한 줄 위로 이동) 아마도 당신은 이렇게 생각하고 있을 것입니다.

#!/bin/bash
SENTENCE=""
while read word
do
    SENTENCE="$SENTENCE $word"
    tput cuu1
    tput hpa 20
    printf '%s\n' "$SENTENCE"
done

이 것보다 읽기가 더 쉽습니다.

#!/bin/bash
SENTENCE=""
while read word
do
    SENTENCE="$SENTENCE $word"
    echo -en '\e[A'
    echo -en '\e[20C'
    echo "$SENTENCE"
done

관련 정보