]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/commit
sh: Add set -o pipefail
authorjilles <jilles@FreeBSD.org>
Sun, 24 Feb 2019 21:05:13 +0000 (21:05 +0000)
committerjilles <jilles@FreeBSD.org>
Sun, 24 Feb 2019 21:05:13 +0000 (21:05 +0000)
commit6b02121d88839c362d16cad877f732c701b11a67
tree94a5b8ec59cc907d087292016bcd42bef385135d
parent94d3013ee049da5761230a18dc6dc2d0e799d495
sh: Add set -o pipefail

The pipefail option allows checking the exit status of all commands in a
pipeline more easily, at a limited cost of complexity in sh itself. It works
similarly to the option in bash, ksh93 and mksh.

Like ksh93 and unlike bash and mksh, the state of the option is saved when a
pipeline is started. Therefore, even in the case of commands like
  A | B &
a later change of the option does not change the exit status, the same way
  (A | B) &
works.

Since SIGPIPE is not handled specially, more work in the script is required
for a proper exit status for pipelines containing commands such as head that
may terminate successfully without reading all input. This can be something
like

(
        cmd1
        r=$?
        if [ "$r" -gt 128 ] && [ "$(kill -l "$r")" = PIPE ]; then
                exit 0
        else
                exit "$r"
        fi
) | head

PR: 224270
Relnotes: yes
bin/sh/jobs.c
bin/sh/options.h
bin/sh/sh.1
bin/sh/tests/execution/Makefile
bin/sh/tests/execution/pipefail1.0 [new file with mode: 0644]
bin/sh/tests/execution/pipefail2.42 [new file with mode: 0644]
bin/sh/tests/execution/pipefail3.42 [new file with mode: 0644]
bin/sh/tests/execution/pipefail4.42 [new file with mode: 0644]
bin/sh/tests/execution/pipefail5.42 [new file with mode: 0644]
bin/sh/tests/execution/pipefail6.42 [new file with mode: 0644]
bin/sh/tests/execution/pipefail7.0 [new file with mode: 0644]