프롬프트 문자열에서 변수를 사용할 때 read -p 명령에서 개행 문자를 사용하는 방법

프롬프트 문자열에서 변수를 사용할 때 read -p 명령에서 개행 문자를 사용하는 방법

프롬프트에서 cowsay 함수를 사용할 때 프롬프트 뒤에 개행 문자를 사용하고 싶습니다.

read -p "$(cowsay "do you know this word?") \n" answer

이 질문에 대한 답변은 여러 가지가 있습니다.

1)https://stackoverflow.com/questions/4296108/how-do-i-add-a-line-break-for-read-command/4296147

2)https://stackoverflow.com/questions/12741529/how-to-break-a-line-add-a-newline-in-read-p-in-bash

그러나 대답은 명령을 구문 ''분석하지 않는 기호를 사용합니다.cowsay

답변1

-p쉘이 필요한 옵션을 사용하는 이유는 무엇입니까 bash?

그냥 해:

cowsay "do you know this word?"
read answer

에서 bash이 옵션은 (s를 s처럼 동작하게 만드는 또 다른 확장)과 조합해서만 유용하며 -p, 일부 경우(예: on s) 다시 그리기 프롬프트가 필요할 수 있습니다. 그러나 여러 줄이 있는 경우 프롬프트를 다시 그릴 필요가 없거나 원하지 않을 수도 있습니다.-ebashbashreadzshvaredbashCtrl+L

원한다면 언제든지 다음과 같이 할 수 있습니다.

read -ep "$(cowsay "do you know this word?")"$'\n' answer

$'...'(여기서는 C와 유사한 이스케이프 시퀀스를 이해하기 위해 ksh93의 인용 형식이 사용되었습니다 .)

또는

read -ep "$(cowsay "do you know this word?")
" answer

보다 일반적으로 문제는 명령 대체가 명령 출력 끝에서 개행 문자를 제거한다는 것입니다(단지 하나가 아니라 모두 버그/버그 기능으로 간주될 수 있음 1).

이 문제를 해결하기 위한 일반적인 기술은 다음과 같습니다.

output=$(cowsay "do you know this word?"; echo .)
output=${output%.}
read -p "$output" answer

즉, .\n출력에 추가됩니다. 명령 대체는 제거 \n하고 를 제거하여 전체 명령의 출력을 .남겨둡니다 ${output%.}(해당 셸에 NUL 문자가 포함되어 있지 않고 zsh현재 로케일에서 유효한 텍스트인 경우 yash).

참고로 다른 Korn과 유사한 쉘에서 read직접 프롬프트를 발행하는 구문은 다음과 같습니다.

read 'answer?prompt: '

Korn 쉘은 또한 터미널에서 읽을 때 프롬프트를 다시 그리며 편집기 옵션이 활성화됩니다(예: set -o emacs또는 사용). 이 구문은 호환성을 위해 지원되지만 줄 편집기에만 사용되며 여기서는 사용되지 않습니다 .set -o vizshvaredread


basename=$(basename -- "$file")1 예를 들어, 파일 이름 끝에서 개행 문자를 제거할 수 있기 때문에 오류가 발생합니다 .basename

관련 정보