为什么这条while循环鱼在一次迭代后终止?

时间:2019-04-18 18:09:21

标签: npm yarnpkg fish npm-run

这是一个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 个答案:

答案 0 :(得分:1)

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

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

升级到3.0.2。

答案 1 :(得分:1)

循环在一次迭代后终止,因为循环主体中的yarn run调用使stdin的其余部分陷入混乱。 (贷记@glenn-jackman。)

可能的解决方法是将这些命令的stdin重定向到/dev/null

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

罪魁祸首是npm-run-all程序包中的run-s,这两个yarn run命令都将调用它。

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