Кажется, что из-за правил замещения '10. Force Joining 'имеет приоритет над '19. Порядок '.
Вот документация zsh:
Правила
Ниже приводится свод правил замены. ..
...
10. Принудительное объединение
Если присутствует флаг (j)
или отсутствует флаг (j)
, но строка должна быть разделена, как указанопо правилу 11. и объединение не произошло в правиле 5. любые слова в значении объединяются с использованием заданной строки или первого символа $ IFS, если его нет. Обратите внимание, что флаг (F)
неявно предоставляет строку для объединения таким способом.
...
19. Упорядочивание
Если результат все еще является массивом и одним из (o)
или (O)
флагов присутствовал, массив переупорядочен.
--- zshparam(1)
, правила, параметры zsh
y=${(Oa)x}
против z=(${(Oa)x})
Первая форма - это скалярное присвоение, а последняя - для присвоения значения массива.
Описание
...
Значение скалярного параметра также может быть задано записью:
name=value
--- zshparam(1)
, описание, параметры zsh
...
Чтобы присвоить значение массива, введите одно из:
set -A name value ...
name=(value ...)
name=([key]=value ...)
--- zshparam(1)
, параметры массива, параметры zsh
Итак, первая форма выдает скалярное значение, а второе значение массива:
(echo
значение с флагом расширения параметра (q)
в подробном видеform.)
x=(1 2 3)
y=${(Oa)x}
echo ${(qqq)y} ;# look the `y` value in a verbose form with `(qqq)`
#=> "1 2 3" ;# forced joining and resulted scalar value
z=(${(Oa)x})
echo ${(qqq)z}
#=> "3" "2" "1" ;# resulted array value
В скалярном присваивании значение раскрывается как одна строка, в которой элементы массивов объединяются
--- zshparam(1)
, параметры массива, параметры zsh
Это вписывается в правило 10. Если форма не в двойных кавычках.