используя функцию bash в zsh - PullRequest
0 голосов
/ 29 апреля 2020

У меня есть функция, которая отлично работала в 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 и добавил ее в 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
}

1 Ответ

2 голосов
/ 29 апреля 2020

Вы не указали jq фильтры. [] в фильтрах заставляет обе оболочки распознавать строки как шаблоны и пытаться применить генерацию пути. По умолчанию bash обрабатывает непревзойденный шаблон как буквальный текст. zsh, с другой стороны, обрабатывает несогласованный шаблон как ошибку.

Если в текущем каталоге имеется файл с именем .resources.entity.name, обе оболочки будут использовать его как результат генерации пути, изменяя строка, которую вы намеревались передать в качестве аргумента jq.

Если вы не хотите, чтобы оболочка обрабатывала строку, заключите ее в кавычки.

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

К сожалению, shellcheck не может пометить это как ошибку, потому что она не знает, что произвольная команда ожидает от своих аргументов: возможно, шаблон без кавычек был преднамеренным.


Кроме того, можно изменить поведение любой оболочки по умолчанию , Чтобы заставить bash вести себя как zsh, используйте

shopt -s failglob

Чтобы заставить zsh вести себя как bash, используйте

setoption NO_NOMATCH

(я не уверен, почему там это опция с именем NOMATCH, включенная по умолчанию, а не опция с именем MATCH, которая по умолчанию отключена.)

...