繁体   English   中英

在 zsh 中使用 bash function

[英]using bash function in zsh

我有一个在 bash 中运行良好的bash

function cfwipe() {
    local space_guid=`cf space --guid  $1`
    cf t -s $1
    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复制到 .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  "$1")
    cf t -s "$1"
    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不能将此标记为错误,因为它不知道任意命令期望其 arguments 是什么:也许未引用的模式是故意的。


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

shopt -s failglob

要使zsh的行为类似于bash ,请使用

setoption NO_NOMATCH

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM