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
}
现在您可以 运行 rununit
或 rununit short
.
我最近从 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
}
现在您可以 运行 rununit
或 rununit short
.