Почему этот цикл while завершается после одной итерации? - PullRequest
2 голосов
/ 18 апреля 2019

Это функция fish, используемая для обновления пакетов JavaScript для проекта.Как ни странно, он завершается после одной итерации со статусом выхода 0. Почему?

function yarn-upgrade-all --description "Upgrade JavaScript packages"
    yarn outdated | sed '1,/^Package/d;/^Done/d' | awk '{print $1, $4}' | while read -l PACKAGE VERSION
        echo
        set_color brwhite
        echo -n "==>"
        set_color yellow
        echo -n " "$PACKAGE
        set_color brblue
        echo -n " "$VERSION
        set_color brwhite
        echo -n " <=="
        set_color normal
        echo
        echo

        yarn upgrade --latest $PACKAGE
        and yarn run test
        and yarn run build
        and git commit -am "Upgrade to "$PACKAGE" "$VERSION
        or begin
            set_color red
            echo "last command exited with status $status" >&2
            set_color normal
            return 1
        end
    end
end

С другой стороны, эта вторая функция, которая содержит только тело-заглушку, проходит через все пакеты, переданные в цикл.

function yarn-upgrade-all-debug --description "Upgrade JavaScript packages"
    yarn outdated | sed '1,/^Package/d;/^Done/d' | awk '{print $1, $4}' | while read -l PACKAGE VERSION
        echo $PACKAGE $VERSION
    end
end

рыба - версия

fish, version 3.0.2

Ответы [ 2 ]

1 голос
/ 19 апреля 2019

Цикл завершается после одной итерации, потому что вызовы yarn run в теле цикла выпадают из остальной части стандартного ввода. (Кредиты @ Гленн-Джекман .)

Возможный обходной путь - перенаправить стандартный ввод на /dev/null для следующих команд:

        and yarn run test < /dev/null
        and yarn run build < /dev/null

Преступник run-s из пакета npm-run-all , который вызывается обеими командами yarn run.

https://github.com/mysticatea/npm-run-all/issues/166

1 голос
/ 18 апреля 2019

Вы работаете с рыбой 3.0.0, и удар по https://github.com/fish-shell/fish-shell/issues/5513 - return из while на самом деле не устанавливает статус правильно.

Однако returnвсе еще вызывает прерывание цикла while.

Обновление до 3.0.2.

...