Ви можете зберегти та призначити IFS за потреби. У цьому немає нічого поганого. Не рідкість зберегти його значення для відновлення після тимчасової, швидкої модифікації, як, наприклад, ваш присвоєння масиву.
Як згадує @llua у своєму коментарі до вашого запитання, просто скасування 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=:
, тоді як тире та busbox це шанують.
$ 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.