da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin########################################################################
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# This software is part of the ast package #
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner# Copyright (c) 1982-2010 AT&T Intellectual Property #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# and is licensed under the #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# Common Public License, Version 1.0 #
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# by AT&T Intellectual Property #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# A copy of the License is available at #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# http://www.opensource.org/licenses/cpl1.0.txt #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# Information and Software Systems Research #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# AT&T Research #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# Florham Park NJ #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# David Korn <dgk@research.att.com> #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin########################################################################
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfunction err_exit
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin print -u2 -n "\t"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin print -u2 -r ${Command}[$1]: "${@:2}"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin let Errors+=1
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinalias err_exit='err_exit $LINENO'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinCommand=${0##*/}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chininteger Errors=0
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinunset HISTFILE
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzexport LC_ALL=C ENV=
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzulimit -c 0
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainztmp=$(mktemp -dt) || { err_exit mktemp -dt failed; exit 1; }
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainztrap "cd /; rm -rf $tmp" EXIT
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinif [[ $( ${SHELL-ksh} -s hello<<-\!
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin print $1
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin !
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz ) != hello ]]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinthen err_exit "${SHELL-ksh} -s not working"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinx=$(
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin set -e
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin false && print bad
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin print good
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinif [[ $x != good ]]
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzthen err_exit 'sh -e not working'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin[[ $($SHELL -D -c 'print hi; print $"hello"') == '"hello"' ]] || err_exit 'ksh -D not working'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzenv=$tmp/.env
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzprint $'(print -u1 aha) &>/dev/null\n(print -u2 aha) &>/dev/null' > $env
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinrc=$tmp/.kshrc
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinprint $'PS1=""\nfunction env_hit\n{\n\tprint OK\n}' > $rc
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzexport ENV=/.$env
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzif [[ ! -o privileged ]]
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzthen
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz got=$($SHELL -E -c : 2>/dev/null)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if [[ $g ]]
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz then
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz got=$(printf %q "$got")
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz err_exit "\$ENV file &>/dev/null does not redirect stdout -- expected '', got $got"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz fi
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz got=$($SHELL -E -c : 2>&1 >/dev/null)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if [[ $got != *nonstandard* || $got == *$'\n'* ]]
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz then
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz got=$(printf %q "$got")
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz err_exit "\$ENV file &>/dev/null does not redirect stderr -- expected one diagnostic line, got $got"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz fi
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzfi
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzexport ENV=/.$rc
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinif [[ -o privileged ]]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinthen
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz [[ $(print env_hit | $SHELL 2>&1) == "OK" ]] &&
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin err_exit 'privileged nointeractive shell reads $ENV file'
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz [[ $(print env_hit | $SHELL -E 2>&1) == "OK" ]] &&
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin err_exit 'privileged -E reads $ENV file'
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz [[ $(print env_hit | $SHELL +E 2>&1) == "OK" ]] &&
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin err_exit 'privileged +E reads $ENV file'
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz [[ $(print env_hit | $SHELL --rc 2>&1) == "OK" ]] &&
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin err_exit 'privileged --rc reads $ENV file'
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz [[ $(print env_hit | $SHELL --norc 2>&1) == "OK" ]] &&
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin err_exit 'privileged --norc reads $ENV file'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinelse
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz [[ $(print env_hit | $SHELL 2>&1) == "OK" ]] &&
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin err_exit 'nointeractive shell reads $ENV file'
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz [[ $(print env_hit | $SHELL -E 2>&1) == "OK" ]] ||
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin err_exit '-E ignores $ENV file'
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz [[ $(print env_hit | $SHELL +E 2>&1) == "OK" ]] &&
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin err_exit '+E reads $ENV file'
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz [[ $(print env_hit | $SHELL --rc 2>&1) == "OK" ]] ||
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin err_exit '--rc ignores $ENV file'
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz [[ $(print env_hit | $SHELL --norc 2>&1) == "OK" ]] &&
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin err_exit '--norc reads $ENV file'
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz [[ $(print env_hit | $SHELL -i 2>&1) == "OK" ]] ||
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin err_exit '-i ignores $ENV file'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinexport ENV=
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinif [[ -o privileged ]]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinthen
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz [[ $(print env_hit | HOME=$tmp $SHELL 2>&1) == "OK" ]] &&
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin err_exit 'privileged nointeractive shell reads $HOME/.kshrc file'
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz [[ $(print env_hit | HOME=$tmp $SHELL -E 2>&1) == "OK" ]] &&
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin err_exit 'privileged -E ignores empty $ENV'
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz [[ $(print env_hit | HOME=$tmp $SHELL +E 2>&1) == "OK" ]] &&
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin err_exit 'privileged +E reads $HOME/.kshrc file'
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz [[ $(print env_hit | HOME=$tmp $SHELL --rc 2>&1) == "OK" ]] &&
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin err_exit 'privileged --rc ignores empty $ENV'
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz [[ $(print env_hit | HOME=$tmp $SHELL --norc 2>&1) == "OK" ]] &&
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin err_exit 'privileged --norc reads $HOME/.kshrc file'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinelse
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz [[ $(print env_hit | HOME=$tmp $SHELL 2>&1) == "OK" ]] &&
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin err_exit 'nointeractive shell reads $HOME/.kshrc file'
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz [[ $(print env_hit | HOME=$tmp $SHELL -E 2>&1) == "OK" ]] &&
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin err_exit '-E ignores empty $ENV'
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz [[ $(print env_hit | HOME=$tmp $SHELL +E 2>&1) == "OK" ]] &&
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin err_exit '+E reads $HOME/.kshrc file'
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz [[ $(print env_hit | HOME=$tmp $SHELL --rc 2>&1) == "OK" ]] &&
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin err_exit '--rc ignores empty $ENV'
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz [[ $(print env_hit | HOME=$tmp $SHELL --norc 2>&1) == "OK" ]] &&
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin err_exit '--norc reads $HOME/.kshrc file'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinunset ENV
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinif [[ -o privileged ]]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinthen
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz [[ $(print env_hit | HOME=$tmp $SHELL 2>&1) == "OK" ]] &&
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin err_exit 'privileged nointeractive shell reads $HOME/.kshrc file'
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz [[ $(print env_hit | HOME=$tmp $SHELL -E 2>&1) == "OK" ]] &&
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin err_exit 'privileged -E reads $HOME/.kshrc file'
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz [[ $(print env_hit | HOME=$tmp $SHELL +E 2>&1) == "OK" ]] &&
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin err_exit 'privileged +E reads $HOME/.kshrc file'
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz [[ $(print env_hit | HOME=$tmp $SHELL --rc 2>&1) == "OK" ]] &&
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin err_exit 'privileged --rc reads $HOME/.kshrc file'
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz [[ $(print env_hit | HOME=$tmp $SHELL --norc 2>&1) == "OK" ]] &&
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin err_exit 'privileged --norc reads $HOME/.kshrc file'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinelse
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz [[ $(print env_hit | HOME=$tmp $SHELL 2>&1) == "OK" ]] &&
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin err_exit 'nointeractive shell reads $HOME/.kshrc file'
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz [[ $(print env_hit | HOME=$tmp $SHELL -E 2>&1) == "OK" ]] ||
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin err_exit '-E ignores $HOME/.kshrc file'
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz [[ $(print env_hit | HOME=$tmp $SHELL +E 2>&1) == "OK" ]] &&
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin err_exit '+E reads $HOME/.kshrc file'
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz [[ $(print env_hit | HOME=$tmp $SHELL --rc 2>&1) == "OK" ]] ||
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin err_exit '--rc ignores $HOME/.kshrc file'
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz [[ $(print env_hit | HOME=$tmp $SHELL --norc 2>&1) == "OK" ]] &&
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin err_exit '--norc reads $HOME/.kshrc file'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzrm -rf $tmp/.kshrc
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinif command set -G 2> /dev/null
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzthen cd $tmp
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin mkdir bar foo
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz > bar.c > bam.c
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin > bar/foo.c > bar/bam.c
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin > foo/bam.c
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin set -- **.c
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin expected='bam.c bar.c'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin [[ $* == $expected ]] ||
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin err_exit "-G **.c failed -- expected '$expected', got '$*'"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin set -- **
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin expected='bam.c bar bar.c bar/bam.c bar/foo.c foo foo/bam.c'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin [[ $* == $expected ]] ||
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin err_exit "-G ** failed -- expected '$expected', got '$*'"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin set -- **/*.c
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin expected='bam.c bar.c bar/bam.c bar/foo.c foo/bam.c'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin [[ $* == $expected ]] ||
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin err_exit "-G **/*.c failed -- expected '$expected', got '$*'"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin set -- **/bam.c
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin expected='bam.c bar/bam.c foo/bam.c'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin [[ $* == $expected ]] ||
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin err_exit "-G **/bam.c failed -- expected '$expected', got '$*'"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin cd ~-
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzcd $tmp
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chint="<$$>.profile.<$$>"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinecho "echo '$t'" > .profile
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chincp $SHELL ./-ksh
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinif [[ -o privileged ]]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinthen
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz [[ $(HOME=$PWD $SHELL -l </dev/null 2>&1) == *$t* ]] &&
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin err_exit 'privileged -l reads .profile'
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz [[ $(HOME=$PWD $SHELL --login </dev/null 2>&1) == *$t* ]] &&
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin err_exit 'privileged --login reads .profile'
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz [[ $(HOME=$PWD $SHELL --login-shell </dev/null 2>&1) == *$t* ]] &&
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin err_exit 'privileged --login-shell reads .profile'
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz [[ $(HOME=$PWD $SHELL --login_shell </dev/null 2>&1) == *$t* ]] &&
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin err_exit 'privileged --login_shell reads .profile'
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz [[ $(HOME=$PWD exec -a -ksh $SHELL </dev/null 2>&1) == *$t* ]] &&
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin err_exit 'privileged exec -a -ksh ksh reads .profile'
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz [[ $(HOME=$PWD ./-ksh -i </dev/null 2>&1) == *$t* ]] &&
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin err_exit 'privileged ./-ksh reads .profile'
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz [[ $(HOME=$PWD ./-ksh -ip </dev/null 2>&1) == *$t* ]] &&
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin err_exit 'privileged ./-ksh -p reads .profile'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinelse
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz [[ $(HOME=$PWD $SHELL -l </dev/null 2>&1) == *$t* ]] ||
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin err_exit '-l ignores .profile'
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz [[ $(HOME=$PWD $SHELL --login </dev/null 2>&1) == *$t* ]] ||
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin err_exit '--login ignores .profile'
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz [[ $(HOME=$PWD $SHELL --login-shell </dev/null 2>&1) == *$t* ]] ||
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin err_exit '--login-shell ignores .profile'
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz [[ $(HOME=$PWD $SHELL --login_shell </dev/null 2>&1) == *$t* ]] ||
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin err_exit '--login_shell ignores .profile'
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz [[ $(HOME=$PWD exec -a -ksh $SHELL </dev/null 2>/dev/null) == *$t* ]] ||
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz err_exit 'exec -a -ksh ksh 2>/dev/null ignores .profile'
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz [[ $(HOME=$PWD exec -a -ksh $SHELL </dev/null 2>&1) == *$t* ]] ||
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz err_exit 'exec -a -ksh ksh 2>&1 ignores .profile'
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz [[ $(HOME=$PWD ./-ksh -i </dev/null 2>&1) == *$t* ]] ||
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin err_exit './-ksh ignores .profile'
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz [[ $(HOME=$PWD ./-ksh -ip </dev/null 2>&1) == *$t* ]] &&
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin err_exit './-ksh -p does not ignore .profile'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chincd ~-
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzrm -rf $tmp/.profile
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# { exec interactive login_shell restricted xtrace } in the following test
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfor opt in \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin allexport all-export all_export \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin bgnice bg-nice bg_nice \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin clobber emacs \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin errexit err-exit err_exit \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin glob \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin globstar glob-star glob_star \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin gmacs \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ignoreeof ignore-eof ignore_eof \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin keyword log markdirs monitor notify \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pipefail pipe-fail pipe_fail \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin trackall track-all track_all \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin unset verbose vi \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin viraw vi-raw vi_raw
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chindo old=$opt
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if [[ ! -o $opt ]]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin then old=no$opt
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin set --$opt || err_exit "set --$opt failed"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin [[ -o $opt ]] || err_exit "[[ -o $opt ]] failed"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin [[ -o no$opt ]] && err_exit "[[ -o no$opt ]] failed"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin [[ -o no-$opt ]] && err_exit "[[ -o no-$opt ]] failed"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin [[ -o no_$opt ]] && err_exit "[[ -o no_$opt ]] failed"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin [[ -o ?$opt ]] || err_exit "[[ -o ?$opt ]] failed"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin [[ -o ?no$opt ]] || err_exit "[[ -o ?no$opt ]] failed"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin [[ -o ?no-$opt ]] || err_exit "[[ -o ?no-$opt ]] failed"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin [[ -o ?no_$opt ]] || err_exit "[[ -o ?no_$opt ]] failed"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin set --no$opt || err_exit "set --no$opt failed"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin [[ -o no$opt ]] || err_exit "[[ -o no$opt ]] failed"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin [[ -o $opt ]] && err_exit "[[ -o $opt ]] failed"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin set --no-$opt || err_exit "set --no-$opt failed"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin [[ -o no$opt ]] || err_exit "[[ -o no$opt ]] failed"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin [[ -o $opt ]] && err_exit "[[ -o $opt ]] failed"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin set --no_$opt || err_exit "set --no_$opt failed"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin [[ -o no$opt ]] || err_exit "[[ -o no$opt ]] failed"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin [[ -o $opt ]] && err_exit "[[ -o $opt ]] failed"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin set -o $opt || err_exit "set -o $opt failed"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin [[ -o $opt ]] || err_exit "[[ -o $opt ]] failed"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin set -o $opt=1 || err_exit "set -o $opt=1 failed"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin [[ -o $opt ]] || err_exit "[[ -o $opt ]] failed"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin set -o no$opt=0 || err_exit "set -o no$opt=0 failed"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin [[ -o $opt ]] || err_exit "[[ -o $opt ]] failed"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin set --$opt=1 || err_exit "set --$opt=1 failed"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin [[ -o $opt ]] || err_exit "[[ -o $opt ]] failed"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin set --no$opt=0 || err_exit "set --no$opt=0 failed"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin [[ -o $opt ]] || err_exit "[[ -o $opt ]] failed"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin set -o no$opt || err_exit "set -o no$opt failed"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin [[ -o no$opt ]] || err_exit "[[ -o no$opt ]] failed"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin set -o $opt=0 || err_exit "set -o $opt=0 failed"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin [[ -o no$opt ]] || err_exit "[[ -o no$opt ]] failed"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin set -o no$opt=1 || err_exit "set -o no$opt=1 failed"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin [[ -o no$opt ]] || err_exit "[[ -o no$opt ]] failed"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin set --$opt=0 || err_exit "set --$opt=0 failed"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin [[ -o no$opt ]] || err_exit "[[ -o no$opt ]] failed"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin set --no$opt=1 || err_exit "set --no$opt=1 failed"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin [[ -o no$opt ]] || err_exit "[[ -o no$opt ]] failed"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin set -o no-$opt || err_exit "set -o no-$opt failed"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin [[ -o no-$opt ]] || err_exit "[[ -o no-$opt ]] failed"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin set -o no_$opt || err_exit "set -o no_$opt failed"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin [[ -o no_$opt ]] || err_exit "[[ -o no_$opt ]] failed"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin set +o $opt || err_exit "set +o $opt failed"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin [[ -o no$opt ]] || err_exit "[[ -o no$opt ]] failed"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin set +o no$opt || err_exit "set +o no$opt failed"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin [[ -o $opt ]] || err_exit "[[ -o $opt ]] failed"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin set +o no-$opt || err_exit "set +o no-$opt failed"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin [[ -o $opt ]] || err_exit "[[ -o $opt ]] failed"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin set +o no_$opt || err_exit "set +o no_$opt failed"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin [[ -o $opt ]] || err_exit "[[ -o $opt ]] failed"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin set --$old
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chindone
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfor opt in \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin exec interactive login_shell login-shell logi privileged \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin rc restricted xtrace
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chindo [[ -o $opt ]]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin y=$?
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin [[ -o no$opt ]]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin n=$?
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case $y$n in
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin 10|01) ;;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *) err_exit "[[ -o $opt ]] == [[ -o no$opt ]]" ;;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin esac
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chindone
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfor opt in \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin foo foo-bar foo_bar
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chindo if [[ -o ?$opt ]]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin then err_exit "[[ -o ?$opt ]] should fail"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if [[ -o ?no$opt ]]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin then err_exit "[[ -o ?no$opt ]] should fail"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chindone
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin[[ $(set +o) == $(set --state) ]] || err_exit "set --state different from set +o"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinset -- $(set --state)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin[[ $1 == set && $2 == --default ]] || err_exit "set --state failed -- expected 'set --default *', got '$1 $2 *'"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinshift
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinrestore=$*
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinshift
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinoff=
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinfor opt
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chindo case $opt in
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin --not*) opt=${opt/--/--no} ;;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin --no*) opt=${opt/--no/--} ;;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin --*) opt=${opt/--/--no} ;;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin esac
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin off="$off $opt"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chindone
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinset $off
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinstate=$(set --state)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chindefault=$(set --default --state)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin[[ $state == $default ]] || err_exit "set --state for default options failed: expected '$default', got '$state'"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinset $restore
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinstate=$(set --state)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin[[ $state == "set $restore" ]] || err_exit "set --state after restore failed: expected 'set $restore', got '$state'"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainztypeset -a pipeline
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzpipeline=(
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz ( nopipefail=0 pipefail=1 command='false|true|true' )
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz ( nopipefail=0 pipefail=1 command='true|false|true' )
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz ( nopipefail=1 pipefail=1 command='true|true|false' )
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz ( nopipefail=1 pipefail=1 command='false|false|false' )
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz ( nopipefail=0 pipefail=0 command='true|true|true' )
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz ( nopipefail=0 pipefail=0 command='print hi|(sleep 1;/bin/cat)>/dev/null' )
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzset --nopipefail
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzfor ((i = 0; i < ${#pipeline[@]}; i++ ))
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzdo eval ${pipeline[i].command}
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz status=$?
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz expected=${pipeline[i].nopipefail}
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz [[ $status == $expected ]] ||
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz err_exit "--nopipefail '${pipeline[i].command}' exit status $status -- expected $expected"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzdone
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzftt=0
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzset --pipefail
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzfor ((i = 0; i < ${#pipeline[@]}; i++ ))
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzdo eval ${pipeline[i].command}
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz status=$?
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz expected=${pipeline[i].pipefail}
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if [[ $status != $expected ]]
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz then err_exit "--pipefail '${pipeline[i].command}' exit status $status -- expected $expected"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz (( i == 0 )) && ftt=1
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz fi
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzdone
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzif (( ! ftt ))
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzthen exp=10
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz got=$(for((n=1;n<exp;n++))do $SHELL --pipefail -c '(sleep 0.1;false)|true|true' && break; done; print $n)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz [[ $got == $exp ]] || err_exit "--pipefail -c '(sleep 0.1;false)|true|true' fails with exit status 0 (after $got/$exp iterations)"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzfi
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzecho=$(whence -p echo)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzfor ((i=0; i < 20; i++))
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzdo if ! x=$(true | $echo 123)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz then err_exit 'command substitution with wrong exit status with pipefai'
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz break
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz fi
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzdone
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin(
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin set -o pipefail
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin false | true
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin (( $? )) || err_exit 'pipe not failing in subshell with pipefail'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin) | wc >/dev/null
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin$SHELL -c 'set -o pipefail; false | $(whence -p true);' && err_exit 'pipefail not returning failure with sh -c'
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzexp='1212 or 1221'
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzgot=$(
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz set --pipefail
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin pipe() { date | cat > /dev/null ;}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin print $'1\n2' |
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz while read i
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz do if pipe $tmp
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz then { print -n $i; sleep 2; print -n $i; } &
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin fi
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin done
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz wait
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz[[ $got == @((12|21)(12|21)) ]] || err_exit "& job delayed by --pipefail, expected '$exp', got '$got'"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz$SHELL -c '[[ $- == *c* ]]' || err_exit 'option c not in $-'
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz> $tmp/.profile
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzfor i in i l r s D E a b e f h k n t u v x B C G H
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzdo HOME=$tmp ENV= $SHELL -$i >/dev/null 2>&1 <<- ++EOF++ || err_exit "option $i not in \$-"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz [[ \$- == *$i* ]] || exit 1
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ++EOF++
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chindone
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinletters=ilrabefhknuvxBCGE
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chininteger j=0
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzfor i in interactive login restricted allexport notify errexit \
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz noglob trackall keyword noexec nounset verbose xtrace braceexpand \
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin noclobber globstar rc
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzdo HOME=$tmp ENV= $SHELL -o $i >/dev/null 2>&1 <<- ++EOF++ || err_exit "option $i not equivalent to ${letters:j:1}"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz [[ \$- == *${letters:j:1}* ]] || exit 1
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ++EOF++
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ((j++))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chindone
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzexport ENV=
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzhistfile=$tmp/history
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzexp=$(HISTFILE=$histfile $SHELL -c $'function foo\n{\ncat\n}\ntype foo')
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzfor var in HISTSIZE HISTFILE
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzdo got=$( ( HISTFILE=$histfile $SHELL -ic $'unset '$var$'\nfunction foo\n{\ncat\n}\ntype foo\nexit' ) 2>&1 )
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz got=${got##*': '}
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz [[ $got == "$exp" ]] || err_exit "function definition inside (...) with $var unset fails -- got '$got', expected '$exp'"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz got=$( { HISTFILE=$histfile $SHELL -ic $'unset '$var$'\nfunction foo\n{\ncat\n}\ntype foo\nexit' ;} 2>&1 )
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz got=${got##*': '}
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz [[ $got == "$exp" ]] || err_exit "function definition inside {...;} with $var unset fails -- got '$got', expected '$exp'"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzdone
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz( unset HISTFILE; $SHELL -ic "HISTFILE=$histfile" 2>/dev/null ) || err_exit "setting HISTFILE when not in environment fails"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# the next tests loop on all combinations of
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# { SUB PAR CMD ADD }
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland MainzSUB=(
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz ( BEG='$( ' END=' )' )
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz ( BEG='${ ' END='; }' )
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland MainzPAR=(
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz ( BEG='( ' END=' )' )
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz ( BEG='{ ' END='; }' )
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland MainzCMD=( command-kill script-kill )
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland MainzADD=( '' '; :' )
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzcd $tmp
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzprint $'#!'$SHELL$'\nkill -KILL $$' > command-kill
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzprint $'kill -KILL $$' > script-kill
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzchmod +x command-kill script-kill
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzexport PATH=.:$PATH
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzexp='Killed'
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzfor ((S=0; S<${#SUB[@]}; S++))
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzdo for ((P=0; P<${#PAR[@]}; P++))
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz do for ((C=0; C<${#CMD[@]}; C++))
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz do for ((A=0; A<${#ADD[@]}; A++))
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz do cmd="${SUB[S].BEG}${PAR[P].BEG}${CMD[C]}${PAR[P].END} 2>&1${ADD[A]}${SUB[S].END}"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz eval got="$cmd"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz got=${got##*': '}
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz got=${got%%'('*}
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz [[ $got == "$exp" ]] || err_exit "$cmd failed -- got '$got', expected '$exp'"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz done
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz done
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz done
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzdone
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz$SHELL 2> /dev/null -c '{; true ;}' || err_exit 'leading ; causes syntax error in brace group'
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz$SHELL 2> /dev/null -c '(; true ;)' || err_exit 'leading ; causes syntax error in parenthesis group'
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzprint 'for ((i = 0; i < ${1:-10000}; i++ )); do printf "%.*c\n" 15 x; done' > pipefail
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzchmod +x pipefail
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz$SHELL --pipefail -c './pipefail 10000 | sed 1q' >/dev/null 2>&1 &
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainztst=$!
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz{ sleep 4; kill $tst; } 2>/dev/null &
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzspy=$!
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzwait $tst 2>/dev/null
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzstatus=$?
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzif [[ $status == 0 || $(kill -l $status) == PIPE ]]
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzthen kill $spy 2>/dev/null
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzelse err_exit "pipefail pipeline bypasses SIGPIPE and hangs"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzfi
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzwait
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinexit $((Errors))