Declare como var local vai quebrar uma função e sair "1: número esperado"

1
function projectopen {
    local di_files=(*.xcworkspace */*.xcworkspace *.xcodeproj */*.xcodeproj)

    # open first exsit file
    ls -d -f -1 $di_files  2>/dev/null \
    | head -1 \
    | xargs open
}

Eu escrevo uma função de shell para abrir rapidamente o xcworkspace no terminal. Mas quando eu declaro di_files como local var, a função é quebrada, e log

projectopen:1: number expected

Eu uso o zsh no Mac OS. Por que isso acontece e como consertar isso?

    
por Karl 25.11.2016 / 08:42

1 resposta

3

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).

    
por 25.11.2016 / 12:05