声明为本地变量将破坏函数并注销“1:预期数字”

声明为本地变量将破坏函数并注销“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
}

我编写了一个 shell 函数来xcworkspace在终端中快速打开。但是当我声明di_fileslocalvar 时,函数就被破坏了,并且记录

projectopen:1:预期数量

我在 Mac 操作系统上使用 zsh。为什么会发生这种情况以及如何解决?

答案1

在旧版本中,您无法使用(或/ )这样zsh初始化数组,您需要将其分开,例如localtypesetdeclare

local -a di_files # explicit array
di_files=( ... )

v5.1 中添加了允许同时声明和数组赋值的功能。

我相信您看到的错误是因为zsh将初始化视为标量和()全局限定符。

您也可以用更简单的管道替换复杂的管道

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设置了相关选项)。

相关内容