Не приведет ли включение массивов в POSIX к нарушению стандарта POSIX?

Aug 16 2020

Возможность использовать массивы в bash и ksh93 очень удобна, когда возникает необходимость быстрого доступа к элементам из нескольких массивов. Вот краткий пример:

#!/bin/ksh93 --

array1=(1 2 3 4 5 6 7)

array2=(8 9 10 11 12 13 14)

printf '%s\n' "Third element of array1 is ${array1[2]} and fifth element of array2 is ${array2[4]}"

Я помню, как мимоходом читал, что, по крайней мере, одна из причин того, что массивы не включены в стандарт POSIX, заключается в том, что это может сломать ситуацию. Это правда? Что бы сломалось?

Ответы

2 bk2204 Aug 18 2020 at 08:39

Я не знаю, о каком тексте вы говорите, но я почти уверен, что это не так, поскольку bashи ksh93должны быть совместимы с POSIX, и если массивы действительно вызвали поломку оболочки POSIX, то эти оболочки не будут соответствовать .

Однако это не означает, что POSIX может их включать. Во-первых, bashи ksh93может не реализовывать массивы одинаково, и POSIX не хотел бы указывать функцию, которая вела бы себя по-разному в широко распространенных исторических реализациях.

Во-вторых, POSIX обычно не определяет много функций. Только сейчас есть даже предложение require local, которое широко используется почти во всех оболочках POSIX с открытым исходным кодом, кроме ksh93. Точно так же можно было бы использовать viреализацию, реализующую только функции POSIX, но большинство пользователей сочли бы ее довольно скудной по функциям.

Наконец, POSIX предпочитает стандартизировать вещи, которые уже доступны в большинстве реализаций, и массивы оболочки не такие вещи. dashим не хватает, как и у большинства оболочек, с которыми он разделяет родословную, а также у крошечных реализаций, таких как busybox. Полная среда POSIX может быть относительно крошечной, и это очень удобно для людей, которым нужно работать со встроенными системами, поэтому часто упускаются из виду полезные вещи в пользу простоты.

Также обратите внимание, что тот факт, что широко распространенная реализация с открытым исходным кодом имеет функцию, не означает, что коммерческие среды Unix будут. Даже если POSIX укажет массивы в новой версии, пройдет много лет, прежде чем все эти системы будут обновлены для их поддержки.