在 zsh 中使用 bash 函数

using bash function in zsh

我有一个功能在 bash

中运行良好
function cfwipe() {
    local space_guid=`cf space --guid  `
    cf t -s 
    for a in `cf curl /v2/spaces/$space_guid/apps | jq -r .resources[].entity.name`; do cf delete -r -f $a; done
    for a in `cf curl /v2/spaces/$space_guid/service_instances | jq -r .resources[].entity.name`; do cf ds -f $a;done
    for a in `cf curl /v2/user_provided_service_instances?q=space_guid:$space_guid | jq -r .resources[].entity.name`; do cf ds -f $a;done
}

我将函数复制到 .zshrc 文件并将其添加到 autoload

if type brew &>/dev/null; then
    FPATH=$(brew --prefix)/share/zsh-completions:$FPATH

    autoload -Uz compinit cfwipe
    compinit
fi

然而,当我尝试 运行 它时 - 尽管开始执行它失败并在控制台中重复同一行

no matches found: .resources[].entity.name
...

问题是什么? 即使修复了拼写检查也无法正常工作

cfwipe() {
    space_guid=$(cf space --guid  "")
    cf t -s ""
    for a in $(cf curl /v2/spaces/"$space_guid"/apps | jq -r .resources[].entity.name); do cf delete -r -f "$a"; done
    for a in $(cf curl /v2/spaces/"$space_guid"/service_instances | jq -r .resources[].entity.name); do cf ds -f "$a";done
    for a in $(cf curl /v2/user_provided_service_instances?q=space_guid:"$space_guid" | jq -r .resources[].entity.name); do cf ds -f "$a";done
}

您没有引用 jq 过滤器。过滤器中的 [] 使两个 shell 都将字符串识别为模式并尝试应用路径名生成。默认情况下,bash 将不匹配的模式视为文字文本。另一方面,zsh 将不匹配的模式视为错误。

如果您在当前目录中有一个名为 .resources.entity.name 的文件,两个 shell 都会使用它作为路径名生成的结果,改变您打算作为参数传递给 jq.

如果您不希望 shell 处理字符串,请引用它。

... | jq -r '.resources[].entity.name'

不幸的是,shellcheck 无法将此标记为错误,因为它不知道任意命令期望其参数是什么:也许未引用的模式是故意的。


顺便说一句,可以更改 shell 的默认行为。要使 bash 表现得像 zsh,请使用

shopt -s failglob

要使 zsh 表现得像 bash,请使用

setoption NO_NOMATCH

(我不确定为什么默认启用名为 NOMATCH 的选项,而不是默认禁用名为 MATCH 的选项。)

我设置NO_NOMATCH,转义jq'.[]'。根本不适合我。 Bash 工作正常。