単一変数を「読む」とき、なぜ「$IFS」に興味を持たなければならないのですか?

単一変数を「読む」とき、なぜ「$IFS」に興味を持たなければならないのですか?

同様の構造は、BashがIFS= read -r var変数への入力行を読み取る「標準」方式と見なされることがよくあります(例:unix.SEで)。

$IFSnullを設定することがしばしば有益な理由、つまり単語の分離を制御(防止)する理由は明らかです。しかし、読んでいるとき、これが特に必要な理由を理解するのが困難です。一つ変える? Bashのマニュアルは次のように言います:

名前よりも多くの単語がある場合、残りの単語と中間区切り文字は姓に割り当てられます。

したがって、IFSを変更しなくてもread単一の変数を渡す場合は、必要に応じて行全体をその変数に保存する必要はありませんか?$IFSこの場合、nullを設定するのはなぜですか?

答え1

次の例を検討してください($IFSデフォルトを有効にするには設定しません)。

$ unset IFS
$ IFS= read -r foo <<<" a "
$ printf "%q\n" "$foo"
\ a\
$ read -r foo <<<" a "
$ printf "%q\n" "$foo"
a

または他の値が含まれている場合(bashまたはzshを除く他のPOSIX様シェルから):

$ IFS=:
$ IFS= read -r foo <<< "a:"
$ printf "%q\n" "$foo"
a:
$ read -r foo <<< "a:"
$ printf '%q\n' "$foo"
a

このイベントは次のとおりです。質問に記載されている投稿(強調する):

1つのパラメータだけを渡してもread lineStillにはなりませんread remaining_words。バックスラッシュ処理はまだ完了しています。IFS空白文字²はまだ開始と終了から削除されます。

関連情報