必要に応じてIFSに保存して割り当てることができます。そうすることには何の問題もありません。配列割り当ての例のように、一時的かつ迅速な変更後の復元のためにその値を保存することは珍しくありません。
@lluaがあなたの質問へのコメントで言及しているように、単にIFSを設定解除すると、space-tab-newlineを割り当てるのと同等のデフォルトの動作に戻ります。
IFSを明示的に設定/設定解除しないことが、それを行うよりも問題になる可能性があることを検討する価値があります。
POSIX 2013エディション、2.5.3シェル変数から:
実装は、シェルの起動時に、環境内のIFSの値、または環境からのIFSの欠如を無視する場合があります。この場合、シェルは、起動時にIFSを<space> <tab> <newline>に設定します。 。
POSIX準拠の呼び出されたシェルは、その環境からIFSを継承する場合としない場合があります。これから次のとおりです。
- ポータブルスクリプトは、環境を介してIFSを確実に継承できません。
- デフォルトの分割動作のみを使用する(またはの場合は参加する
"$*"
)が、環境からIFSを初期化するシェルの下で実行される可能性のあるスクリプトは、IFSを明示的に設定/設定解除して、環境の侵入から身を守る必要があります。
注意この議論では、「呼び出された」という言葉には特定の意味があることを理解することが重要です。シェルは、その名前(#!/path/to/shell
シェバンを含む)を使用して明示的に呼び出された場合にのみ呼び出されます。$(...)
またはによって作成される可能性のあるサブシェルcmd1 || cmd2 &
は、呼び出されたシェルではなく、そのIFS(およびその実行環境のほとんど)はその親のものと同一です。呼び出されたシェルは値を$
pidに設定し、サブシェルはそれを継承します。
これは単なる教訓的な論争ではありません。この領域には実際の分岐があります。これは、いくつかの異なるシェルを使用してシナリオをテストする簡単なスクリプトです。変更されたIFS(に設定:
)を起動されたシェルにエクスポートし、シェルはデフォルトのIFSを出力します。
$ cat export-IFS.sh
export IFS=:
for sh in bash ksh93 mksh dash busybox:sh; do
printf '\n%s\n' "$sh"
$sh -c 'printf %s "$IFS"' | hexdump -C
done
IFSは通常、エクスポート用にマークされていませんが、bash、ksh93、およびmkshが環境のを無視しIFS=:
、ダッシュとbusyboxがそれを尊重することに注意してください。
$ sh export-IFS.sh
bash
00000000 20 09 0a | ..|
00000003
ksh93
00000000 20 09 0a | ..|
00000003
mksh
00000000 20 09 0a | ..|
00000003
dash
00000000 3a |:|
00000001
busybox:sh
00000000 3a |:|
00000001
いくつかのバージョン情報:
bash: GNU bash, version 4.3.11(1)-release
ksh93: sh (AT&T Research) 93u+ 2012-08-01
mksh: KSH_VERSION='@(#)MIRBSD KSH R46 2013/05/02'
dash: 0.5.7
busybox: BusyBox v1.21.1
bash、ksh93、およびmkshは環境からIFSを初期化しませんが、変更されたIFSを再エクスポートします。
何らかの理由で環境を介してIFSを移植可能に渡す必要がある場合、IFS自体を使用して渡すことはできません。値を別の変数に割り当て、その変数をエクスポート用にマークする必要があります。その後、子供はその値をIFSに明示的に割り当てる必要があります。