편집 3

편집 3

Press는 Enter여전히 구분 기호 작업을 수행하지만 read콘솔 스크롤을 방해하지 않고 명령이 조용히 종료됩니다. 기본적으로 A는 read -s엔드라인에만 영향을 미칩니다.

답변1

n1읽기 문자가 입력되면 읽기가 읽기 변수(옵션 포함)를 null로 설정한다는 것을 알고 다음을 수행할 수 있습니다.

#!/bin/bash

while IFS= read -srn1 a ;do
    [[ "${a+x$a}" = "x" ]] && break
    var=$var$(printf '%s' "$a")
    printf '%s' "$a"
done
printf '\n%s\n' "$var"

stty 또는 다른 문자로 캡처된 문자는 바이트 값으로 변환되지 않습니다.

다음을 제외한 모든 제어 문자:

  1. ^C(ASCII 03 ETX)
  2. ^J(ASCII 0A LF)
  3. ^M(ASCII 0D CR)
  4. ^Z(ASCII 1A 하위)
  5. ^\(ASCII 1C FS)

이전 문자의 백스페이스 문자를 실제로 "확인"하려면 다음 루프를 추가하여 var를 인쇄합니다(위 코드 바로 뒤에).

echo
while IFS= read -srn1 a; do
    printf '%s' "$a"
    sleep 0.5
done <<<"$var"

편집 3

백스페이스 키를 사용하여 문자를 캡처하고 수정된 문자열을 인쇄하지 않고 문자를 삭제하려면 다음을 시도하십시오.

#!/bin/bash

while IFS= read -srn1 a ;do
    [[ "${a+x$a}" = "x" ]] && break

    if [[ $a = $'\x7f' || $a = $'\x08' ]]; then
        var=${var%?}
        [[ $a = $'\x7f' ]] && printf '\x0d%s \x08' "$var"
        [[ $a = $'\x08' ]] && printf '\x0d%s ' "$var"
    else
        var=$var$(printf '%s' "$a")
    fi

    printf '%s' "$a"
done
printf '\n%s\n' "$var"
printf '%s' "$var" | od -An -tx1

while IFS= read -srn1 a; do
    printf '%s' "$a"
    sleep 0.5
done <<<"$var"

답변2

zsh의 라인 편집기를 호출할 수 있습니다(완전히 구성 가능하며 종종 더 많은 기능이 있음).고급의readline보다 (bash로 호출 가능 read -e) 예를 들면 다음과 같습니다.

var=$(
  saved_tty=$(stty -g)
  var=default-value zsh -c '
    zle-line-finish() { # hook run upon leaving the line editor (zle)
      CURSOR=$#BUFFER # move the cursor to the end
      zle -R          # force a redraw of the editor
      printf %s $BUFFER # output value on stdout
      kill $$ # kill ourself to prevent zle cleanup
    }
    zle -N zle-line-finish
    vared -p "Text before [" var'
  # we need to restore the tty settings by ourselves, as we prevented zsh
  # from doing so when killing it:
  stty "$saved_tty"
)
printf '] Text after\n'

printf 'var = "%s"\n' "$var"

실행 후 다음을 제공합니다.

Text before [value edited] Text after
var = "value edited"

이제 키를 셸 코드 위젯에 바인딩할 수 있지만 bash위젯을 실행하기 전에 현재 줄의 내용이 지워지므로 핸들러에서 프롬프트와 값을 다시 그려야 합니다 Return.

var=$(prompt="Text before [" var=default-value bash -c '
  bind -x '\''"\r":printf >&2 %s "$prompt$READLINE_LINE";  printf %s "$READLINE_LINE"; exit'\'' 2> /dev/null
  IFS= read -rep "$prompt" -i default-value')

printf '] Text after\n'
printf 'var = "%s"\n' "$var"

관련 정보