我想运行一系列任务,但是如果其中任何一个失败,就停止运行,因此我已经写了(类似):
for task in [TASKS]; do
process "$task" || break
commit "$task"
done
这可以正常工作,但是(如指定),即使我们提前中断,此循环的退出状态也为零。理想情况下break
-ing将能够传达故障。
我知道返回0
是记录的行为break
,但是我很好奇是否有任何相对干净的解决方法。我能想象的最好的办法是将其包装在函数中并设置一个didBreak
变量,然后将其用作(函数的)退出状态。可以,但是感觉太复杂了。
! break
在许多外壳中使用工程(在我的测试中,除了基于pdksh的外壳和sh
FreeBSD的外壳(通过 设计)):
$ zsh -c 'for i in x; do ! break; echo "$i"; done'; echo "$?"
1
$ bash -c 'for i in x; do ! break; echo "$i"; done'; echo "$?"
1
$ ksh88 -c 'for i in x; do ! break; echo "$i"; done'; echo "$?"
1
$ ksh93 -c 'for i in x; do ! break; echo "$i"; done'; echo "$?"
1
$ dash -c 'for i in x; do ! break; echo "$i"; done'; echo "$?"
1
$ yash -c 'for i in x; do ! break; echo "$i"; done'; echo "$?"
1
$ bosh -c 'for i in x; do ! break; echo "$i"; done'; echo "$?"
1
$ pdksh -c 'for i in x; do ! break; echo "$i"; done'; echo "$?"
0
$ mksh -c 'for i in x; do ! break; echo "$i"; done'; echo "$?"
0
$ posh -c 'for i in x; do ! break; echo "$i"; done'; echo "$?"
0
请注意,它不会errexit
在任何一个中触发。
去年,在奥斯汀小组(POSIX背后的机构)邮件列表中对此进行了讨论。讨论(涉及到bosh
FreeBSDsh
和NetBSD的维护者sh
)在达成共识之前就已经消亡了,但是普遍的观点似乎是POSIX要求行为!
被证明是否定了命令的退出状态,并且break
是一个特殊的内置命令,以0退出状态退出。
但是,如果将相同的推理return
应用于例如,您将看到更少的外壳符合要求。
在中zsh
,您可以使用return
匿名函数代替break
:
$ () for i in x y; do echo $i; return 1; done
x
$ echo $?
1
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句