3

这是一个用于升级项目的 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

4

2 回答 2

2

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

但是,return仍然会导致它终止 while 循环。

升级到 3.0.2。

于 2019-04-18T18:35:11.723 回答
2

循环在单次迭代后终止,因为yarn run循环体中的调用占用了标准输入的其余部分。(归功于@glenn-jackman。)

一种可能的解决方法是将标准输入重定向到/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

于 2019-04-19T20:52:15.600 回答