В более старых версиях zsh
вы не можете инициализировать массив с помощью local
(или typeset
] / объявить
) таким образом, вам нужно разделить его, например
local -a di_files # explicit array
di_files=( ... )
В v5.1 была добавлена возможность одновременного объявления и присвоения массива.
Я считаю, что вы видите ошибку, потому что zsh
обрабатывает инициализацию как скаляр, а ()
как квалификатор glob.
Вы также, вероятно, можете заменить сложный конвейер на более простой
open "${di_files[1]}"
Наконец, включая обработку файлов, не совпадающих:
function projectopen {
setopt local_options nullglob
local di_files=(*.xcworkspace */*.xcworkspace *.xcodeproj */*.xcodeproj)
# open first existing file
[ -n "${di_files[1]}" ] && open "${di_files[1]}"
}
С параметром nullglob
каждое расширение глобуса, которое не соответствует файлам, заменяется на пустая строка (я подозреваю, что у вас может быть установлен параметр nonomatch
, связанный параметр).