次をinput.txt
含むファイルがある場合:
hello
world
!
次に、bashコマンドecho $(cat input.txt)
を実行すると、これが出力されます。
hello world !
なぜ、どのようにファイル内にあるものを正確に出力するように修正できますか?
次をinput.txt
含むファイルがある場合:
hello
world
!
次に、bashコマンドecho $(cat input.txt)
を実行すると、これが出力されます。
hello world !
なぜ、どのようにファイル内にあるものを正確に出力するように修正できますか?
回答:
使用する場合
echo "$(cat input.txt)"
正しく動作します。
おそらくエコーの入力は改行で区切られており、個別のコマンドとして処理されるため、結果は改行なしになります。
echo "$(date) something"
、日付の出力から末尾の改行を削除し、そのエコー出力に日付と同じ行の「何か」を出力するという利点があります。ファイルまたはコマンド出力を「そのまま」保存する必要がある場合は、mapfile(help mapfile
)read -rd ''
またはwhile読み取りループを使用します。
bashのマニュアルページのセクションから引用Command Substitution
:
埋め込まれた改行は削除されませんが、単語分割中に削除される場合があります。
さらに少し、同じセクション:
置換が二重引用符で囲まれている場合、結果に対して単語分割とパス名展開は実行されません。
それがecho "$(cat /etc/passwd)"
動作する理由です。
さらに、POSIX仕様によるコマンド置換により末尾の改行が削除されることに注意してください。
$ echo "$(printf "one\ntwo\n\n\n")"
one
two
したがって、ファイルを介して出力すると、$(cat file.txt)
後続の改行が失われる可能性があり、ファイル全体の整合性が優先される場合は問題になります。
たとえば、IFSを空に設定することにより、改行を保持できます。
$ IFS=
$ a=$(cat links.txt)
$ echo "$a"
link1
link2
link3