在 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 工作正常。
我有一个功能在 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 工作正常。