プロンプトで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つの拡張)と組み合わせてのみ便利です。場合によっては(-p
on sなど)、再描画プロンプトが必要になる場合があります。ただし、複数行がある場合は、プロンプトを再描画する必要がない場合や不要な場合があります。-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つではなく、すべてバグ/バグ機能と見なすことができます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")
1たとえば、ファイル名の末尾から改行文字を削除できるため、エラーが発生します。basename