BashのIFS =とIFS = $ '\ n'の違いは何ですか?

BashのIFS =とIFS = $ '\ n'の違いは何ですか?

Bashでこれら3つのコードブロックの間に違いはありますか?

使用IFS= :

#!/usr/bin/env bash
while IFS= read -r item; do
    echo "[$item]"
done </dev/stdin

使用IFS=$'\n':

#!/usr/bin/env bash
while IFS=$'\n' read -r item; do
    echo "[$item]"
done </dev/stdin

使用-d $'\n':

#!/usr/bin/env bash
while read -rd $'\n' item; do
    echo "[$item]"
done </dev/stdin

IFS2つの値と区切り文字オ​​プションに違いがある場合、-dどのような状況で違いが発生しますか?

私のテストによると、すべて同じように見えます。

echo $'one two\nthree\tfour' | test-stdin 
# outputs:
# [one two]
# [three    four]

ベストアンサー1

IFS=IFS=$'\n'同じですreadread区切り文字がデフォルトから変更されていないと仮定)。唯一の違いは、行内の改行が単語を区別するかどうか、改行が行の中に表示されないかどうかです。

read(newline)がデフォルトの区切り文字であるread -d $'\n'ため、同じです。$'\n'

IFS=そしてIFS=$'\n'フィールド分割に影響を与えます。IFS=フィールド分割は完全にオフになり、IFS=$'\n'代わりに改行文字に分割されます。

IFS=$'\n'
echo $(echo a; echo b)
# prints "a b" on a single line since $'a\nb' is split at 
# the newline and therefore echo receives two arguments "a" and "b"
IFS=
echo $(echo a; echo b)
# prints "a" and "b" on separate lines $'a\nb' is passed 
# as a single argument to echo

おすすめ記事