コマンド拡張に含まれる改行が空白に変わるのはなぜですか?

コマンド拡張に含まれる改行が空白に変わるのはなぜですか?

コマンド拡張に関するBashマニュアルの結果

埋め込まれた改行文字は削除されませんが、単語の分離中に削除される可能性があります。

例えば

$ cat myfile
1
2
3

$ echo $(cat myfile)
1 2 3

なぜ含まれている改行文字が空白に変わるのだろうか。マニュアルにはそう書かれていませんか?

答え1

Bash(および他の多くのシェル)から$()コマンドの出力を取得し、他のコマンドの引数として使用するために使用されます。

ここで実行される作業は次のとおりです。

まず実行してくださいcat

1
2
3

次に、対応する$()ブロックを次に置き換えます。

echo 1
2
3

シェルはこの入力を解釈し、正しいパラメータを送信する必要がありますecho。これを行うには分割する必要があります。1つまり23ここから改行文字が削除されます。

最後に、シェルは以下を送信します。

プログラム:echo

議論:1 2 3

これにより、次の内容が表示されます。

1 2 3

echo複数のパラメータがある場合は、すべてのパラメータをスペースで区切って表示するためです。

答え2

bew78はすでにこの質問に答えていますが、もっと明確に言えば -

から始まるコマンドの置き換えソースコードでは、次を呼び出します。単語リスト_分割()、それ自体が呼び出されます。単語分割()、どちらそれから着信電話リスト文字列()、どちら具体的にIFS区切り記号をスキップします。これは個々の「単語」を生成し、list_string()関数によってスタックに返されます。これが1、2、3がコマンドの別の引数で終わる理由ですecho

関連情報