Nas versões mais antigas de zsh , não é possível inicializar uma matriz com local (ou typeset / declare ) dessa forma, você precisa separá-la, por exemplo
local -a di_files # explicit array
di_files=( ... )
O recurso para permitir declaração e atribuição de matriz juntos foi adicionado na v5.1.
Acredito que o erro que você vê é porque zsh está tratando a inicialização como escalar e () como um qualificador glob.
Você provavelmente também pode substituir seu pipeline elaborado pelo mais simples
open "${di_files[1]}"
Finalmente, incluindo o tratamento de arquivos não correspondentes:
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]}"
}
Com a opção nullglob , cada expansão glob que não corresponde a nenhum arquivo é substituída por uma string vazia (suspeito que você tenha nonomatch set, uma opção relacionada).