Возможность использования массивов в 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
Harold Fischer 16 Авг 2020 в 03:25

1 ответ

Лучший ответ

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

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

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

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

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

2
bk2204 18 Авг 2020 в 04:39
В то время как local или любая другая форма области видимости широко используется. То, как это делается, сильно различается в разных реализациях, поэтому его очень сложно стандартизировать. См. Список оболочек, поддерживающих ключевое слово `local` для определения локальных переменных.
 – 
Stéphane Chazelas
18 Авг 2020 в 10:01
Я согласен с тем, что стандартизация local не будет тривиальной, но есть проблема, зарегистрированная в Austin Group, чтобы добавить ее, и, по крайней мере, большинство оболочек в Debian, кажется, реализуют ее достаточно полезным способом, чтобы Debian может потребоваться для всех /bin/sh реализаций.
 – 
bk2204
20 Авг 2020 в 04:47