[英]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.