入力フィールドの区切り文字 - 百科事典

Unixオペレーティングシステムの多くのコマンドラインインタープリタ(「シェル」)では、入力フィールド区切りや内部フィールド区切り、または$IFSシェル変数が、テキストをトークンに分けるために使用される文字を保持しています。
IFSの値は(bashシェルでは)デフォルトでスペース、タブ、および改行文字を含んでいます。これらの空白文字は、bashシェルで"declare"コマンドを実行することで視覚化できます。または、printf %s "$IFS" | od -c、printf "%q\n" "$IFS"、またはprintf %s "$IFS" | cat -A(後者の2つのコマンドは一部のシェルやシステムでのみ利用可能)などのコマンドでIFSを印刷します。

Bashのバージョン4のmanページから:

シェルは$IFSの各文字を区切り文字として扱い、他の展開の結果をこれらの文字で単語に分割します。
IFSが設定されていない場合、または値がデフォルトの<space><tab><newline>の場合、前回の展開の結果の先頭と末尾に連続する<space>、<tab>、および<newline>は無視されます。また、先頭や末尾に位置しないIFS文字の連続は単語の区切りとして機能します。
IFSがデフォルト以外の値を持っている場合、単語の先頭や末尾に連続する空白文字(スペースやタブ)は無視されますが、これらの空白文字がIFSの値に含まれている限りです。
IFSにはIFSの空白文字でない文字が含まれており、それに隣接するIFSの空白文字も、フィールドを区切ります。IFSの空白文字の連続も区切り文字として扱われます。IFSの値がnullの場合、単語分割は行われません。

IFSの略称
Open Group Base Specificationsによると、IFSは「input field separators」の略称です。この規格の新しいバージョンでは、「この名前は誤解を招くものとして、実際にはIFS文字はフィールド終端として使用されている」と述べています。しかし、IFSはしばしば「internal field separators」と呼ばれます。

漏洩
IFSはUnixの一部のバージョンで漏洩として使用可能でした。ルート権限を持つプログラムが(例えば)system("/bin/mail")を実行し、$IFSが"/"に設定されている場合、ユーザーが提供したコードを実行するように騙されることがありました。この場合、現在のディレクトリ内の"bin"プログラム(ユーザーによって書き込めるため)がルート権限で実行されます。これはシェルがIFS変数を継承しないように修正することで解決されました。

参考文献