为什么这个循环在单次迭代后循环终止?

问题描述 投票:2回答:2

这是一个用于升级项目JavaScript包的fish函数。奇怪的是,它在退出状态为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

npm yarnpkg fish npm-run
2个回答
1
投票

你正在运行鱼3.0.0,从https://github.com/fish-shell/fish-shell/issues/5513击中return - while实际上并没有正确设置状态。

然而,return仍然使它终止while循环。

升级到3.0.2。


1
投票

循环在单次迭代后终止,因为循环体中的yarn run调用会使stdin的其余部分淹没。 (致@glenn-jackman的信用。)

可能的解决方法是将stdin重定向到/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

© www.soinside.com 2019 - 2024. All rights reserved.