コマンド拡張に関するBashマニュアルの結果
埋め込まれた改行文字は削除されませんが、単語の分離中に削除される可能性があります。
例えば
$ cat myfile
1
2
3
$ echo $(cat myfile)
1 2 3
なぜ含まれている改行文字が空白に変わるのだろうか。マニュアルにはそう書かれていませんか?
答え1
Bash(および他の多くのシェル)から$()
コマンドの出力を取得し、他のコマンドの引数として使用するために使用されます。
ここで実行される作業は次のとおりです。
まず実行してくださいcat
。
1
2
3
次に、対応する$()
ブロックを次に置き換えます。
echo 1
2
3
シェルはこの入力を解釈し、正しいパラメータを送信する必要がありますecho
。これを行うには分割する必要があります。1
つまり2
、3
ここから改行文字が削除されます。
最後に、シェルは以下を送信します。
プログラム:echo
議論:1
2
3
これにより、次の内容が表示されます。
1 2 3
echo
複数のパラメータがある場合は、すべてのパラメータをスペースで区切って表示するためです。
答え2
bew78はすでにこの質問に答えていますが、もっと明確に言えば -
から始まるコマンドの置き換えソースコードでは、次を呼び出します。単語リスト_分割()、それ自体が呼び出されます。単語分割()、どちらそれから着信電話リスト文字列()、どちら具体的にIFS区切り記号をスキップします。これは個々の「単語」を生成し、list_string()関数によってスタックに返されます。これが1、2、3がコマンドの別の引数で終わる理由ですecho
。