対話型シェルでIFSをデフォルト以外の値に設定するのはなぜですか?

対話型シェルでIFSをデフォルト以外の値に設定するのはなぜですか?

場合によっては、スクリプトの作成時に拡張方法をIFS変更するなど(内部フィールド区切り文字)をデフォルト以外の値に設定する必要があります。$*

IFSこれは完全に合理的ですが、これをインタラクティブシェル(私の記憶が正しい場合は空白、タブ、改行)でデフォルトに設定する理由はまったくありません。それにもかかわらず、インタラクティブシェルではIFSこれをデフォルトに設定できないことをよく聞きます。

これは本当ですか?誰でも実用的な例を挙げることができますか?

答え1

インタラクティブシェルでは、シェル起動スクリプト(for など)、またはシェル起動後に実行された他のスクリプトまたはシェル関数$IFSの内容を変更しない限り、デフォルト値になります(通常はシェル起動スクリプトで変更されないか再変更されます)。正しく作成された場合はデフォルト値です。~/.bashrcbash

これらの関数が定義されている場合RC書類その他源泉ファイルは正しく作成され、トークン化が必要です。 IFSの現在の値については何も仮定しないので、別の値に設定してもかまいません。

ただし、一度変更すると、後で実行するときにコマンドラインがどのように解釈されるかに影響を与える可能性があるため、行ったことを覚えておく必要があります。

たとえば、次のような場合:

IFS=:; ls -- $PATH

のディレクトリを一覧表示するには、$PATH後で次のことが発生する理由が疑問に思うかもしれません。

rm -f -- $(cat ~/my.file.list)

やめなさい。したがって、次のように書くこともできます。

(IFS=:; ls -- $PATH)

または:

IFS=:; ls -- $PATH; unset IFS

(ところで、unset IFSトークン化をデフォルトの動作に戻しますが、いいえ、$IFS復元などの操作を実行する(不適切に作成された)機能を停止します。)oldIFS=$IFS; IFS=xxx; ...; IFS=$oldIFS$IFS

答え2

もちろん、IFSさまざまなコマンドがこのオプションなしでは完全に機能しないため、これをデフォルトに設定して期待できます。

必要に応じて(まれに)bashスクリプトでIFSを変更するのと同じ理由で、シェルでIFSを(一時的に)変更できます。特定のコマンドを一度だけ使用したい場合は、それをシェルスクリプトに書き込む理由はありません。それ以外は、シェルスクリプトとシェルを直接使用することに違いはありません。

関連情報