프롬프트 문자열에서 변수를 사용하는 동안 read -p 명령에서 linebreak를 사용하는 방법

프롬프트 문자열에서 변수를 사용하는 동안 read -p 명령에서 linebreak를 사용하는 방법

프롬프트에서 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과 함께 사용할 때만 유용합니다 (예: upon ). 그러나 여러 줄인 경우 해당 프롬프트를 다시 그릴 필요도 없고 원하지도 않을 것입니다.-ebashbashreadzshvaredbashCtrl+L

원한다면 언제든지 다음을 수행할 수 있습니다.

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

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

또는

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

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

이 문제를 해결하려면 일반적인 방법은 다음과 같습니다.

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

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

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

read 'answer?prompt: '

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


¹ 예를 들어, basename=$(basename -- "$file")다음에 의해 추가된 것뿐만 아니라 파일 이름 끝에서 개행 문자를 제거할 수 있기 때문에 잘못된 것과 같은 일이 발생합니다.basename

관련 정보