在nodejs项目中,我有一个快捷的yarn lint,它以这样的方式运行几个指针:
lint_1 && lint_2 && lint_3如果其中任何一个发现错误,则返回错误代码,因此yarn lint本身返回错误代码,结果生成失败。
它工作得有点好,捕捉到所有的错误,尽管有一个小问题:如果一个linter错误代码失败-其余的指针将不会被执行。
我想要的是-执行所有这些(所以他们都打印所有错误),然后才会失败。
我知道我可以创建一个bash脚本(我将在yarn lint中运行该脚本),一个接一个地运行每个指针,收集返回代码,然后检查是否有任何代码是非零- exit 1,并且它会使yarn lint失败。但我想知道是否有更优雅的方法来做到这一点?
发布于 2019-01-18 04:31:02
你可以抓住错误设置旗子。这将运行每个指针,如果其中任何一个失败,则退出失败:
#!/bin/bash
result=0
trap 'result=1' ERR
lint_1
lint_2
lint_3
exit "$result" 发布于 2019-01-18 09:38:26
我想要的是-执行所有这些错误(因此它们都打印所有错误),然后才会失败。
基本上我们有一系列的出口代码要抓。如果它们中的任何一个是非零的,我们需要设置一个变量来具有非零值。将其扩展到一个列表,如下所示:
result=0
if ! lint_1; then result=1; fi
if ! lint_2; then result=1; fi
if ! lint_3; then result=1; fi
exit "$result"作为一个程序员,我看到我们这里有一个模式。所以我们可以使用数组,但是bash没有2d数组。使用eval来获得引用的参数是一种解决办法。这是可行的。您必须使用eval,以双重规避数组“指针”/name,但可以工作。注意,eval是evil。
cmds_1=(lint_1 "arg with spaces you pass to lint_1")
cmds_2=(lint_2)
cmds_3=(lint_3)
result=0
# compgen results list of variables starting with `cmds_`
# so naming is important
for i in $(compgen -v cmds_); do
# at first, `$i` is only expanded
# then the array is expanded `"${cmds_?[@]}"`
if ! eval "\"\${$i[@]}\""; then
result=1
fi
done
exit "$result"我们也可以使用沙格。从手动EXIT STATUS是123 if __any__ invocation of the command exited with status 1-125。如果您知道您的程序将退出1-125退出状态,您可以(通常xargs无论如何正确地处理不同的退出状态(返回123),但让我们保持一致):
xargs -l1 -- bash -c '"$@"' -- <<EOF
lint_1 "arg with spaces you pass to lint_1"
lint_2
lint_3
EOF
result=$? # or just exit "$?"
exit "$result"看起来很干净。另外,通过将-P <number of jobs>传递给xargs,您可以并行执行所有命令。通过处理bash脚本中的错误,您可以适应1-125错误范围。
xargs -l1 -- bash -c '"$@" || exit 1' -- <<EOF
lint_1 "arg with spaces you pass to lint_1"
lint_2
lint_3
EOF
result=$?
exit "$result"我有另一个主意。在每个命令之后,我们可以在一个专用的文件描述符上输出返回状态。然后从所有返回状态筛选零,并检查流中是否有其他状态。如果是的话,我们应该以非零状态退出。这感觉就像一个已经完成的工作,基本上与第一个代码片段相同,但是if ! ....; then result=1; fi被简化为; echo $? >&10。
tmp=$(mktemp)
(
lint_1 "arg with spaces you pass to lint_1"; echo $? >&10
lint_2; echo $? >&10
lint_3; echo $? >&10
) 10> >(
[ -z "$(grep -v 0)" ]
echo $? > "$tmp"
)
result="$(cat "$tmp"; rm "$tmp")"
exit "$result"从所提供的选项中,我会选择另一个答案;)或者使用xargs第二个片段。
https://stackoverflow.com/questions/54247481
复制相似问题