From bbdc823dbfcb874c29fa4138c2591f5196aab521 Mon Sep 17 00:00:00 2001 From: Jeremie Courreges-Anglas Date: Tue, 7 Jul 2020 10:33:59 +0000 Subject: Add support for set -o pipefail With the pipefail option set, the exit status of a pipeline is 0 if all commands succeed, or the return status of the rightmost command that fails. This can help stronger error checking, but is not a silver bullet. For example, commands will exhibit a non-zero exit status if they're killed by a SIGPIPE when writing to a pipe. Yet pipefail was considered useful enough to be included in the next POSIX standard. This implementation remembers the value of the pipefail option when a pipeline is started, as described as option 1) in https://www.austingroupbugs.net/view.php?id=789#c4102 Requested by ajacoutot@, ok millert@ --- regress/bin/ksh/obsd-regress.t | 90 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 89 insertions(+), 1 deletion(-) (limited to 'regress/bin/ksh') diff --git a/regress/bin/ksh/obsd-regress.t b/regress/bin/ksh/obsd-regress.t index d94695111cf..b9b33d17655 100644 --- a/regress/bin/ksh/obsd-regress.t +++ b/regress/bin/ksh/obsd-regress.t @@ -1,4 +1,4 @@ -# $OpenBSD: obsd-regress.t,v 1.11 2020/05/22 08:45:23 anton Exp $ +# $OpenBSD: obsd-regress.t,v 1.12 2020/07/07 10:33:58 jca Exp $ # # ksh regression tests from OpenBSD @@ -514,3 +514,91 @@ description: stdin: kill -s SIGINFO $$ --- + +name: pipeline-pipefail-1 +description: + check pipeline return status +stdin: + set -o pipefail + true | true +--- + +name: pipeline-pipefail-2 +description: + check pipeline return status +stdin: + set -o pipefail + false | true +expected-exit: e == 1 +--- + +name: pipeline-pipefail-3 +description: + check pipeline return status +stdin: + set -o pipefail + true | false +expected-exit: e == 1 +--- + +name: pipeline-pipefail-4 +description: + check pipeline return status +stdin: + set -o pipefail + ! false | true +--- + +name: pipeline-pipefail-errexit-1 +description: + check pipeline return status +stdin: + set -e + false | true + echo "ok" +expected-stdout: ok +--- + +name: pipeline-pipefail-errexit-2 +description: + check pipeline return status +stdin: + set -e + set -o pipefail + false | true + echo "should not print" +expected-exit: e == 1 +expected-stdout: +--- + +name: pipeline-pipefail-errexit-3 +description: + check pipeline return status +stdin: + set -e + set -o pipefail + false | true || echo "ok" +expected-stdout: ok +--- + +name: pipeline-pipefail-check-time-1 +description: + check pipeline return status +stdin: + false | true & + p=$! + set -o pipefail + wait $p +--- + +name: pipeline-pipefail-check-time-2 +description: + check pipeline return status +stdin: + set -o pipefail + false | true & + p=$! + set +o pipefail + wait $p +expected-exit: e == 1 +--- -- cgit v1.2.3