プロンプトで 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
と組み合わせた場合にのみ役立ちます。この場合、 では、場合によっては( の場合など)プロンプトを再描画する必要があります。ただし、プロンプトが複数行にわたる場合は、再描画する必要も希望もないでしょう。-e
bash
bash
read
zsh
vared
bash
Ctrl+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