bashが$(catファイル)の\ nを削除するのはなぜですか?


24

次をinput.txt含むファイルがある場合:

hello
world
!

次に、bashコマンドecho $(cat input.txt)を実行すると、これが出力されます。

hello world !

なぜ、どのようにファイル内にあるものを正確に出力するように修正できますか?

回答:


32

使用する場合

echo "$(cat input.txt)"

正しく動作します。

おそらくエコーの入力は改行で区切られており、個別のコマンドとして処理されるため、結果は改行なしになります。


いいね!それでは、$()とバックティックの違い(ある場合)は何ですか?(これがあまりにも接線である場合はごめんなさい)
チャンホーSuh

$(...)がネストしやすいという事実を除いて、これらは同等です。どちらの場合も、結果を引用しないと、空白の複数の引数にトークン化されます。
ジェームズ・ヘンストリッジ

3
ただし、二重引用符であっても、最後の改行文字は省略されます。対照的に、Perlのバックティック演算子は、すべての改行を含むコマンドの出力全体に展開されます。
キーストンプソン

6
@KeithThompsonはい、コマンド置換により、出力からすべての末尾の改行が削除されます。これには、たとえばecho "$(date) something"、日付の出力から末尾の改行を削除し、そのエコー出力に日付と同じ行の「何か」を出力するという利点があります。ファイルまたはコマンド出力を「そのまま」保存する必要がある場合は、mapfile(help mapfileread -rd ''またはwhile読み取りループを使用します。
ガイラ

みんなありがとう:-)ここでのすべてのコメントから何かを学びました!
チャンホーSuh

2

bashのマニュアルページのセクションから引用Command Substitution

埋め込まれた改行は削除されませんが、単語分割中に削除される場合があります。

さらに少し、同じセクション:

置換が二重引用符で囲まれている場合、結果に対して単語分割とパス名展開は実行されません。

それがecho "$(cat /etc/passwd)" 動作する理由です。

さらに、POSIX仕様によるコマンド置換により末尾の改行が削除れることに注意してください。

$ echo "$(printf "one\ntwo\n\n\n")"
one
two

したがって、ファイルを介して出力すると、$(cat file.txt)後続の改行が失われる可能性があり、ファイル全体の整合性が優先される場合は問題になります。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.