bash here-stringが末尾の改行を追加するのはなぜですか?

bash here-stringが末尾の改行を追加するのはなぜですか?

次の例は、改行が追加されていることを示しています。ここにある文字列
なぜこのようなことをするのですか?

xxd -p <<<'a'  
# output: 610a

xxd -p <<<'a
'
# output: 610a0a

答え1

簡単な答えは、それがkshが書かれる方法だからです(そしてbashは互換性があります)。しかし、このようにデザインを選択するには理由があります。

ほとんどのコマンドにはテキスト入力が必要です。 Unixの世界ではテキストファイルは一連の行で構成され、各行は改行文字で終わります。。したがって、ほとんどの場合、最後の改行が必要です。特に一般的なケースは、コマンドの出力を取得して何らかの方法で処理し、コマンドの置き換えを介して他のコマンドに渡すことです。コマンド置換は最後の改行文字を削除して<<<再挿入します。

tmp=$(foo)
tmp=${tmp//hello/world}
tmp=${tmp#prefix}
bar <<<$tmp

Bashとkshはとにかくバイナリデータを扱うことができないので(ヌル文字を処理できません)、彼らの機能がテキストデータに合わせられていることは驚くべきことではありません。

とにかく、here-string構文はhere-documentsと<<<同様に、主に便宜のためのものです。<<最後の改行を追加する必要がない場合はecho -n(bashで)またはprintfパイプを使用してください。

答え2

ここで文字列に改行文字を追加する実際のケースは、モードがアクティブな間にreadコマンドを使用することです。スクリプトがゼロ以外のステータスコードを生成するステートメントを見つけた場合は、スクリプトが終了することに注意してくださいset -e。改行文字のない文字列が見つかった場合は、ゼロ以外の状態コードの生成をset -e検討してください。read

#!/bin/bash
set -e

# The following statement succeeds because here-strings append a newline:
IFS='' read -r <<< 'newline appended'
echo 'Made it here'

# The following statement fails because 'read' returns a non-zero status
# code when no newlines are encountered.
printf 'no newline' | IFS='' read -r
echo 'Did not make it here'

答え3

私はこれがここで文字列の末尾に改行文字を取得する唯一の方法だと思います。証明:

xxd <<<`echo -ne "a\n"`

here-string演算子は、あなたが提出した文法に明記されていない限り、改行文字を削除するようです。

関連情報