シェルコマンドの置き換えが末尾の改行を食べるのはなぜですか?

シェルコマンドの置き換えが末尾の改行を食べるのはなぜですか?

以下の例に従い、私の最近の質問 末尾の改行文字はbashからどこに移動しますか?、「なぜ」これが起こるのか知りたいです。

  x="$(echo -ne "a\nb\n")" ; echo -n "$x" | xxd -p 
# Output is: 610a62 
# The trailing newline from the 'echo' command
#   has been "deleted" by Command Substitution

私の考えには確かに少しあると思います。非常にシェル操作(コマンドの置換など)の重要な理由は、実際に代替コマンドの出力から一部のデータを削除することです。
しかし、この質問はその逆のようで、理解できません。しなければならないしないでください。コマンドの出力をスクリプトプロセスに戻す...文字を予約するのは奇妙に見えますが、ここには妥当な理由があると思います...その理由は何か知りたいです...

答え1

シェルはもともと完全なプログラミング言語では意図されていなかったからです。

\nいくつかのコマンド出力から末尾を削除することは非常に困難です。ただし、表示の目的でほとんどすべてのコマンドは出力で終わるため、\n他のコマンドで使用したい場合は簡単に削除する方法が必要です。建設とともに自動解体が$()選択されたソリューションでした。

もしそうなら、おそらくあなたはこの質問を答えとして受け入れるでしょう。

\n次のコマンドでこれが自動的に実行されない場合は、末尾を削除する簡単な方法を見つけることができますか?

> echo The current date is "$(date)", have a good day!

二重スペースがフォーマットされた日付を破るのを防ぐには、引用符が必要です。

答え2

それの一部です基準:

シェルは次のコマンドを実行してコマンド置換を拡張する必要があります。注文するサブシェル環境(参照:シェル実行環境)とコマンドの置換(テキスト)を置き換えます。注文するここに含まれる「$()」または逆引用符)とコマンドの標準出力を追加して、交換が完了したら1つ以上の<newline>シーケンスを削除します。

もちろん、標準がそのように書かれているkshので、そのように書かれたかもしれません。しかし、それは標準で文書化された動作です。気に入らない場合は、Perlまたは末尾の改行文字を保存できる他のものを使用してください。

答え3

まあ、それは私にとって理解されています。改行文字は通常のコマンド出力の最初の位置にのみ表示されるため、コマンドの完了後にプロンプ​​トが新しい行に表示されます。ほとんどの場合、改行文字は生出力の一部ではなく、画面を整理するために使用されます。コマンドの出力を解析するときに末尾の改行はしばしば問題になります。wcコマンドが2行のテキストを出力するのはなぜですか?いいえ、改行文字が続くものを出力します。解析するときにwc2行の出力があることを心配したくありません。出力ラインは1つだけです。

答え4

echo "hello "(引用符なしで)このスペースを占めるのはなぜですか? IFS文字の値はシェル内の区切り文字として扱われるため、末尾の文字(何も区別しない)は削除されます。推奨事項の置き換えは単にサブシェルで推奨事項を実行するため、同じロジックに従います。

関連情報