这是一个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
答案 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
命令都将调用它。