IFS nullはunset IFSと同じではありませんか?


13

ここで、IFSと呼ばれる素晴らしい質問を読みました。回答とコメントがIFS =がIFSの設定を解除することと同じではないことを述べているPOSIXを引用しているので、私は驚きました。IFSの設定を解除すると、明らかにデフォルト値が使用されます。代わりにIFSをnullにすると、スプリッターはありません。私はそれについて別の見方をしたことを知っていて、これを私のブックマークで見つけました:

ボーンシェルプログラミング

$ IFS

スクリプトの最初のステートメントは

IFS =

これにより、入力フィールドのセパレーターがデフォルト値にリセットされます。それ以外の場合は、ユーザーから$ IFSを継承します。ユーザーは、$ IFSを奇妙な値に設定して、shが期待どおりに文字列を解析しないようにし、奇妙な動作を引き起こす可能性があります。

それでそれは少し前に本当でしたか、それとも著者は間違っていますか?

回答:


20

Stack Exchangeで見つけた答えは正しく、このチュートリアルは間違っています。自分で実験したり、標準で調べたりすることができます。unset IFSは、デフォルト値のspace-tab-newlineに設定することと同じですが、空の場合、IFSフィールド分割は事実上オフになります。

あなたは相談することができIFS上スヴェンMascheckのページを歴史的な実装について。いくつかの歴史的なシェルはを好まなかったunset IFS、そして非常に古いバージョンのkshはそれを空のように扱ったIFSが、すべての最近のシェルとほとんどの古いシェルはunsetをIFSデフォルト値のように扱った。

IFS=フィールド分割をオフにしたくない場合を除いて、スクリプトを開始しないでください(これは合理的な決定です。ただし、グロブを回避するために、二重引用符を配置する必要があることに注意してくださいset -f)。デフォルト値をリセットするには、を使用しますunset IFS。これがスクリプトの最初に役立つかどうかは議論の余地があります。PATHスクリプトを誤らせるために呼び出し元が実行できる危険なことなど、他にも多くの悪い点があります。

このチュートリアルでは、リセットすることもお勧めしPATHます。これは通常悪いアドバイスです。ほとんどの場合、正しい検索パスを予測することはできませんが、ユーザーは知っています。どのようにするかどうかを知っています/usr/local/bin/home/bob/bin内のものはどこ古代のUNIX上でのユーティリティのバグ固定のバージョンが含まれている/usr/binバグがありますか?本当に/usr/xpg6/bin先に行くかどうかを判断するためのすべてのロジックを埋め込んで/binよろしいですか?あなたはどの位置にいます/usr/gnu/binか?スクリプトが特定のシステムを対象としない限り、PATHをリセットしないでください。

私はこのチュートリアルを読んだことはありませんが、1つのことを確認しました。最初から常に、変数置換とコマンド置換を二重引用符で囲むことはわかりません。ですから、このチュートリアルは良いものではないと思います。


unset IFSフィールド分割はリセットされますが、IFSはbashのデフォルト値にリセットされません。
Melab

@Melab unset IFSIFSデフォルト値にリセットされず、設定が解除されます。ただし、unset IFSIFSデフォルト値に設定した場合と同じ効果があります。
Gilles「SO-邪悪なことをやめよう」
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.