ZSH:转义命令参数变量中的 space 个字符

ZSH: Escaped space chars in command args variable

我最近从 bash 转换到 zsh,发现一些基本的东西似乎工作方式不同。我在 Mac OSX.

在我的 bash 个人资料中,我有这个:

alias rununit='python -m pytest --no-cov tests/unit --disable-pytest-warnings --durations=1 --show-capture=no'
export short='--tb=short -qqq'

然后我可以 运行 rununit $short 并且它将 运行 pytest 与 $short 中的附加参数。这在 bash 中工作正常,但在 zsh 中会中断。显然 short-qqq 之间的 space 被转义了,所以 pytest 将 tb arg 的值解释为 short -qqq 这显然会破坏事情。

有没有办法让这个方便的快捷方式在 zsh 中工作?

默认情况下,

zsh 不会将 word-splitting 应用于参数扩展,因此 rununit $short 的行为与 rununit "$short".

相同

改为 short 一个数组。 (它不需要导出。)我也会使 rununit 成为一个函数。

rununit () {
  python -m pytest --no-cov tests/unit --disable-pytest-warnings --durations=1 --show-capture=no
}

short=(--tb=short -qqq)

由于 zsh 处理参数扩展的方式,这将使 rununit $short 的行为与 rununit "${short[@]}" 相同(这也是您应该在 bash 中使用的) .


或者,使 short 成为函数 rununit 处理的一个选项,以向您的命令添加其他选项:

rununit () {
  args=(--no-cov tests/unit --dsiable-pytest-warnings --durations=1 --show-capture=no)
  if [[  = short ]]; then
      args+=(--tb=short -qqq)
  fi
  
  python -m pytest $args
}

现在您可以 运行 rununitrununit short.