私はここで次の素晴らしい質問を読んだ。IFSについて学ぶ。答えとコメントはIFS =がIFS設定解除と同じではないというPOSIXを参照しているので驚きました。 IFS が設定されていない場合、当然デフォルト値が使用されます。 IFSが空の場合、分割子はありません。私はこれについて他の意見があることを知っています。私のブックマークで以下を見つけました。
$IFS
スクリプトの最初の文は次のようにする必要があります。
IFS=
入力フィールド区切り文字をデフォルト値にリセットします。それ以外の場合は、ユーザーから$ IFSを継承します。ユーザーはこれを奇妙な値に設定して、shが予想通りの文字列を解析するようにすることで、奇妙な動作を引き起こす可能性があります。
それではこれは本当ですか?それとも著者が単に間違っていますか?
答え1
Stack Exchangeで見つかった回答は正確で、このチュートリアルは間違っています。自分で試してみたり、オンラインで閲覧することもできます。基準。設定を解除することは、デフォルトのIFS
space-tab-newlineに設定するのと同じです。空の場合、IFS
フィールド分割は効果的にオフになります。
相談できますIFSのSven Mascheckページ歴史的実現について。いくつかの歴史的シェルはこれを気に入らず、unset IFS
非常に古いkshバージョンはこれをnullとして扱いますIFS
が、すべての最新シェルとほとんどの古いシェルはunsetをIFS
デフォルトとして扱います。
IFS=
フィールド分割をオフにしたくない場合(おそらく合理的な決定かもしれませんが、ワイルドカードを避けるために代替項目の周りに二重引用符を入れる必要があることに注意してください。この機能もオフでない限りset -f
)スクリプトを開始しないでください。デフォルト値をリセットするには、を使用しますunset IFS
。これがスクリプトの始めに役に立つかどうかは議論の余地があります。PATH
呼び出し側がスクリプトエラーを作成するために奇妙なことをすることができるように、他の悪いこともたくさんあります。
このチュートリアルではリセットもお勧めしますPATH
。これは一般的に悪いアドバイスです。ほとんどの場合、正しい検索パスが何であるかを予測することはできませんが、ユーザーは予測します。バグのある古代のUNIXにバグ修正バージョンのユーティリティが/usr/local/bin
含まれているかどうかはどうすればわかりますか?前進するかどうかを決定するためにすべてのロジックを含めたいですか?あなたはどんな立場をしたいですか?スクリプトが特定のシステムをターゲットにしていない限り、PATHをリセットしないでください。/home/bob/bin
/usr/bin
/usr/xpg6/bin
/bin
/usr/gnu/bin
チュートリアルを読んでいませんが、一つ確認しました。最初から変数の置換とコマンドの置換に常に二重引用符を入れるようには言っていませんでした。だから私はこのチュートリアルが良いチュートリアルではないと思います。