プロンプト文字列で変数を使用しながら 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、オプションは、 (を のように動作させる別の拡張機能)-pと組み合わせた場合にのみ役立ちます。この場合、 では、場合によっては( の場合など)プロンプトを再描画する必要があります。ただし、プロンプトが複数行にわたる場合は、再描画する必要も希望もないでしょう。-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 vi) にもそのプロンプトを再描画します。zshも互換性のためにその構文をサポートしていますが、行エディタは でのみ使用されvared、 では使用されませんread


¹ 例えば、basename=$(basename -- "$file")ファイル名の末尾から改行文字を削除する可能性があるため、次のようなことが間違っています。basename

関連情報