プロンプト文字列で変数を使用するときに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のように振る舞うもう1つの拡張)と組み合わせてのみ便利です。場合によっては(-pon 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つではなく、すべてバグ/バグ機能と見なすことができます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

関連情報