xref: /onnv-gate/usr/src/lib/libshell/common/tests/options.sh (revision 12068:08a39a083754)
14887Schin########################################################################
24887Schin#                                                                      #
34887Schin#               This software is part of the ast package               #
4*12068SRoger.Faulkner@Oracle.COM#          Copyright (c) 1982-2010 AT&T Intellectual Property          #
54887Schin#                      and is licensed under the                       #
64887Schin#                  Common Public License, Version 1.0                  #
78462SApril.Chin@Sun.COM#                    by AT&T Intellectual Property                     #
84887Schin#                                                                      #
94887Schin#                A copy of the License is available at                 #
104887Schin#            http://www.opensource.org/licenses/cpl1.0.txt             #
114887Schin#         (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9)         #
124887Schin#                                                                      #
134887Schin#              Information and Software Systems Research               #
144887Schin#                            AT&T Research                             #
154887Schin#                           Florham Park NJ                            #
164887Schin#                                                                      #
174887Schin#                  David Korn <dgk@research.att.com>                   #
184887Schin#                                                                      #
194887Schin########################################################################
204887Schinfunction err_exit
214887Schin{
224887Schin	print -u2 -n "\t"
234887Schin	print -u2 -r ${Command}[$1]: "${@:2}"
244887Schin	let Errors+=1
254887Schin}
264887Schinalias err_exit='err_exit $LINENO'
274887Schin
284887SchinCommand=${0##*/}
294887Schininteger Errors=0
308462SApril.Chin@Sun.COM
318462SApril.Chin@Sun.COMunset HISTFILE
3210898Sroland.mainz@nrubsig.orgexport LC_ALL=C ENV=
3310898Sroland.mainz@nrubsig.org
3410898Sroland.mainz@nrubsig.orgulimit -c 0
3510898Sroland.mainz@nrubsig.org
3610898Sroland.mainz@nrubsig.orgtmp=$(mktemp -dt) || { err_exit mktemp -dt failed; exit 1; }
3710898Sroland.mainz@nrubsig.orgtrap "cd /; rm -rf $tmp" EXIT
388462SApril.Chin@Sun.COM
394887Schinif	[[ $( ${SHELL-ksh} -s hello<<-\!
404887Schin		print $1
414887Schin		!
4210898Sroland.mainz@nrubsig.org	 ) != hello ]]
434887Schinthen	err_exit "${SHELL-ksh} -s not working"
444887Schinfi
454887Schinx=$(
464887Schin	set -e
474887Schin	false && print bad
484887Schin	print good
494887Schin)
504887Schinif	[[ $x != good ]]
5110898Sroland.mainz@nrubsig.orgthen	err_exit 'sh -e not working'
524887Schinfi
534887Schin[[ $($SHELL -D -c 'print hi; print $"hello"') == '"hello"' ]] || err_exit 'ksh -D not working'
544887Schin
5510898Sroland.mainz@nrubsig.orgenv=$tmp/.env
5610898Sroland.mainz@nrubsig.orgprint $'(print -u1 aha) &>/dev/null\n(print -u2 aha) &>/dev/null' > $env
574887Schinrc=$tmp/.kshrc
588462SApril.Chin@Sun.COMprint $'PS1=""\nfunction env_hit\n{\n\tprint OK\n}' > $rc
594887Schin
6010898Sroland.mainz@nrubsig.orgexport ENV=/.$env
6110898Sroland.mainz@nrubsig.orgif	[[ ! -o privileged ]]
6210898Sroland.mainz@nrubsig.orgthen
6310898Sroland.mainz@nrubsig.org	got=$($SHELL -E -c : 2>/dev/null)
6410898Sroland.mainz@nrubsig.org	if	[[ $g ]]
6510898Sroland.mainz@nrubsig.org	then
6610898Sroland.mainz@nrubsig.org		got=$(printf %q "$got")
6710898Sroland.mainz@nrubsig.org		err_exit "\$ENV file &>/dev/null does not redirect stdout -- expected '', got $got"
6810898Sroland.mainz@nrubsig.org	fi
6910898Sroland.mainz@nrubsig.org	got=$($SHELL -E -c : 2>&1 >/dev/null)
7010898Sroland.mainz@nrubsig.org	if	[[ $got != *nonstandard* || $got == *$'\n'* ]]
7110898Sroland.mainz@nrubsig.org	then
7210898Sroland.mainz@nrubsig.org		got=$(printf %q "$got")
7310898Sroland.mainz@nrubsig.org		err_exit "\$ENV file &>/dev/null does not redirect stderr -- expected one diagnostic line, got $got"
7410898Sroland.mainz@nrubsig.org	fi
7510898Sroland.mainz@nrubsig.orgfi
7610898Sroland.mainz@nrubsig.org
7710898Sroland.mainz@nrubsig.orgexport ENV=/.$rc
784887Schinif	[[ -o privileged ]]
794887Schinthen
8010898Sroland.mainz@nrubsig.org	[[ $(print env_hit | $SHELL 2>&1) == "OK" ]] &&
814887Schin		err_exit 'privileged nointeractive shell reads $ENV file'
8210898Sroland.mainz@nrubsig.org	[[ $(print env_hit | $SHELL -E 2>&1) == "OK" ]] &&
834887Schin		err_exit 'privileged -E reads $ENV file'
8410898Sroland.mainz@nrubsig.org	[[ $(print env_hit | $SHELL +E 2>&1) == "OK" ]] &&
854887Schin		err_exit 'privileged +E reads $ENV file'
8610898Sroland.mainz@nrubsig.org	[[ $(print env_hit | $SHELL --rc 2>&1) == "OK" ]] &&
874887Schin		err_exit 'privileged --rc reads $ENV file'
8810898Sroland.mainz@nrubsig.org	[[ $(print env_hit | $SHELL --norc 2>&1) == "OK" ]] &&
894887Schin		err_exit 'privileged --norc reads $ENV file'
904887Schinelse
9110898Sroland.mainz@nrubsig.org	[[ $(print env_hit | $SHELL 2>&1) == "OK" ]] &&
924887Schin		err_exit 'nointeractive shell reads $ENV file'
9310898Sroland.mainz@nrubsig.org	[[ $(print env_hit | $SHELL -E 2>&1) == "OK" ]] ||
944887Schin		err_exit '-E ignores $ENV file'
9510898Sroland.mainz@nrubsig.org	[[ $(print env_hit | $SHELL +E 2>&1) == "OK" ]] &&
964887Schin		err_exit '+E reads $ENV file'
9710898Sroland.mainz@nrubsig.org	[[ $(print env_hit | $SHELL --rc 2>&1) == "OK" ]] ||
984887Schin		err_exit '--rc ignores $ENV file'
9910898Sroland.mainz@nrubsig.org	[[ $(print env_hit | $SHELL --norc 2>&1) == "OK" ]] &&
1004887Schin		err_exit '--norc reads $ENV file'
10110898Sroland.mainz@nrubsig.org	[[ $(print env_hit | $SHELL -i 2>&1) == "OK" ]] ||
1028462SApril.Chin@Sun.COM		err_exit '-i ignores $ENV file'
1034887Schinfi
1044887Schin
1054887Schinexport ENV=
1064887Schinif	[[ -o privileged ]]
1074887Schinthen
10810898Sroland.mainz@nrubsig.org	[[ $(print env_hit | HOME=$tmp $SHELL 2>&1) == "OK" ]] &&
1094887Schin		err_exit 'privileged nointeractive shell reads $HOME/.kshrc file'
11010898Sroland.mainz@nrubsig.org	[[ $(print env_hit | HOME=$tmp $SHELL -E 2>&1) == "OK" ]] &&
1114887Schin		err_exit 'privileged -E ignores empty $ENV'
11210898Sroland.mainz@nrubsig.org	[[ $(print env_hit | HOME=$tmp $SHELL +E 2>&1) == "OK" ]] &&
1134887Schin		err_exit 'privileged +E reads $HOME/.kshrc file'
11410898Sroland.mainz@nrubsig.org	[[ $(print env_hit | HOME=$tmp $SHELL --rc 2>&1) == "OK" ]] &&
1154887Schin		err_exit 'privileged --rc ignores empty $ENV'
11610898Sroland.mainz@nrubsig.org	[[ $(print env_hit | HOME=$tmp $SHELL --norc 2>&1) == "OK" ]] &&
1174887Schin		err_exit 'privileged --norc reads $HOME/.kshrc file'
1184887Schinelse
11910898Sroland.mainz@nrubsig.org	[[ $(print env_hit | HOME=$tmp $SHELL 2>&1) == "OK" ]] &&
1204887Schin		err_exit 'nointeractive shell reads $HOME/.kshrc file'
12110898Sroland.mainz@nrubsig.org	[[ $(print env_hit | HOME=$tmp $SHELL -E 2>&1) == "OK" ]] &&
1224887Schin		err_exit '-E ignores empty $ENV'
12310898Sroland.mainz@nrubsig.org	[[ $(print env_hit | HOME=$tmp $SHELL +E 2>&1) == "OK" ]] &&
1244887Schin		err_exit '+E reads $HOME/.kshrc file'
12510898Sroland.mainz@nrubsig.org	[[ $(print env_hit | HOME=$tmp $SHELL --rc 2>&1) == "OK" ]] &&
1264887Schin		err_exit '--rc ignores empty $ENV'
12710898Sroland.mainz@nrubsig.org	[[ $(print env_hit | HOME=$tmp $SHELL --norc 2>&1) == "OK" ]] &&
1284887Schin		err_exit '--norc reads $HOME/.kshrc file'
1294887Schinfi
1304887Schin
1314887Schinunset ENV
1324887Schinif	[[ -o privileged ]]
1334887Schinthen
13410898Sroland.mainz@nrubsig.org	[[ $(print env_hit | HOME=$tmp $SHELL 2>&1) == "OK" ]] &&
1354887Schin		err_exit 'privileged nointeractive shell reads $HOME/.kshrc file'
13610898Sroland.mainz@nrubsig.org	[[ $(print env_hit | HOME=$tmp $SHELL -E 2>&1) == "OK" ]] &&
1374887Schin		err_exit 'privileged -E reads $HOME/.kshrc file'
13810898Sroland.mainz@nrubsig.org	[[ $(print env_hit | HOME=$tmp $SHELL +E 2>&1) == "OK" ]] &&
1394887Schin		err_exit 'privileged +E reads $HOME/.kshrc file'
14010898Sroland.mainz@nrubsig.org	[[ $(print env_hit | HOME=$tmp $SHELL --rc 2>&1) == "OK" ]] &&
1414887Schin		err_exit 'privileged --rc reads $HOME/.kshrc file'
14210898Sroland.mainz@nrubsig.org	[[ $(print env_hit | HOME=$tmp $SHELL --norc 2>&1) == "OK" ]] &&
1434887Schin		err_exit 'privileged --norc reads $HOME/.kshrc file'
1444887Schinelse
14510898Sroland.mainz@nrubsig.org	[[ $(print env_hit | HOME=$tmp $SHELL 2>&1) == "OK" ]] &&
1464887Schin		err_exit 'nointeractive shell reads $HOME/.kshrc file'
14710898Sroland.mainz@nrubsig.org	[[ $(print env_hit | HOME=$tmp $SHELL -E 2>&1) == "OK" ]] ||
1484887Schin		err_exit '-E ignores $HOME/.kshrc file'
14910898Sroland.mainz@nrubsig.org	[[ $(print env_hit | HOME=$tmp $SHELL +E 2>&1) == "OK" ]] &&
1504887Schin		err_exit '+E reads $HOME/.kshrc file'
15110898Sroland.mainz@nrubsig.org	[[ $(print env_hit | HOME=$tmp $SHELL --rc 2>&1) == "OK" ]] ||
1524887Schin		err_exit '--rc ignores $HOME/.kshrc file'
15310898Sroland.mainz@nrubsig.org	[[ $(print env_hit | HOME=$tmp $SHELL --norc 2>&1) == "OK" ]] &&
1544887Schin		err_exit '--norc reads $HOME/.kshrc file'
1554887Schinfi
1564887Schin
15710898Sroland.mainz@nrubsig.orgrm -rf $tmp/.kshrc
1584887Schin
1594887Schinif	command set -G 2> /dev/null
16010898Sroland.mainz@nrubsig.orgthen	cd $tmp
1614887Schin	mkdir bar foo
16210898Sroland.mainz@nrubsig.org	> bar.c > bam.c
1634887Schin	> bar/foo.c > bar/bam.c
1644887Schin	> foo/bam.c
1654887Schin	set -- **.c
1664887Schin	expected='bam.c bar.c'
1674887Schin	[[ $* == $expected ]] ||
1684887Schin		err_exit "-G **.c failed -- expected '$expected', got '$*'"
1694887Schin	set -- **
1704887Schin	expected='bam.c bar bar.c bar/bam.c bar/foo.c foo foo/bam.c'
1714887Schin	[[ $* == $expected ]] ||
1724887Schin		err_exit "-G ** failed -- expected '$expected', got '$*'"
1734887Schin	set -- **/*.c
1744887Schin	expected='bam.c bar.c bar/bam.c bar/foo.c foo/bam.c'
1754887Schin	[[ $* == $expected ]] ||
1764887Schin		err_exit "-G **/*.c failed -- expected '$expected', got '$*'"
1774887Schin	set -- **/bam.c
1784887Schin	expected='bam.c bar/bam.c foo/bam.c'
1794887Schin	[[ $* == $expected ]] ||
1804887Schin		err_exit "-G **/bam.c failed -- expected '$expected', got '$*'"
1814887Schin	cd ~-
1824887Schinfi
1834887Schin
18410898Sroland.mainz@nrubsig.orgcd $tmp
1854887Schint="<$$>.profile.<$$>"
1864887Schinecho "echo '$t'" > .profile
1874887Schincp $SHELL ./-ksh
1884887Schinif	[[ -o privileged ]]
1894887Schinthen
19010898Sroland.mainz@nrubsig.org	[[ $(HOME=$PWD $SHELL -l </dev/null 2>&1) == *$t* ]] &&
1914887Schin		err_exit 'privileged -l reads .profile'
19210898Sroland.mainz@nrubsig.org	[[ $(HOME=$PWD $SHELL --login </dev/null 2>&1) == *$t* ]] &&
1934887Schin		err_exit 'privileged --login reads .profile'
19410898Sroland.mainz@nrubsig.org	[[ $(HOME=$PWD $SHELL --login-shell </dev/null 2>&1) == *$t* ]] &&
1954887Schin		err_exit 'privileged --login-shell reads .profile'
19610898Sroland.mainz@nrubsig.org	[[ $(HOME=$PWD $SHELL --login_shell </dev/null 2>&1) == *$t* ]] &&
1974887Schin		err_exit 'privileged --login_shell reads .profile'
19810898Sroland.mainz@nrubsig.org	[[ $(HOME=$PWD exec -a -ksh $SHELL </dev/null 2>&1) == *$t* ]] &&
1994887Schin		err_exit 'privileged exec -a -ksh ksh reads .profile'
20010898Sroland.mainz@nrubsig.org	[[ $(HOME=$PWD ./-ksh -i </dev/null 2>&1) == *$t* ]] &&
2014887Schin		err_exit 'privileged ./-ksh reads .profile'
20210898Sroland.mainz@nrubsig.org	[[ $(HOME=$PWD ./-ksh -ip </dev/null 2>&1) == *$t* ]] &&
2034887Schin		err_exit 'privileged ./-ksh -p reads .profile'
2044887Schinelse
20510898Sroland.mainz@nrubsig.org	[[ $(HOME=$PWD $SHELL -l </dev/null 2>&1) == *$t* ]] ||
2064887Schin		err_exit '-l ignores .profile'
20710898Sroland.mainz@nrubsig.org	[[ $(HOME=$PWD $SHELL --login </dev/null 2>&1) == *$t* ]] ||
2084887Schin		err_exit '--login ignores .profile'
20910898Sroland.mainz@nrubsig.org	[[ $(HOME=$PWD $SHELL --login-shell </dev/null 2>&1) == *$t* ]] ||
2104887Schin		err_exit '--login-shell ignores .profile'
21110898Sroland.mainz@nrubsig.org	[[ $(HOME=$PWD $SHELL --login_shell </dev/null 2>&1) == *$t* ]] ||
2124887Schin		err_exit '--login_shell ignores .profile'
21310898Sroland.mainz@nrubsig.org	[[ $(HOME=$PWD exec -a -ksh $SHELL </dev/null 2>/dev/null) == *$t* ]] ||
21410898Sroland.mainz@nrubsig.org		err_exit 'exec -a -ksh ksh 2>/dev/null ignores .profile'
21510898Sroland.mainz@nrubsig.org	[[ $(HOME=$PWD exec -a -ksh $SHELL </dev/null 2>&1) == *$t* ]] ||
21610898Sroland.mainz@nrubsig.org		err_exit 'exec -a -ksh ksh 2>&1 ignores .profile'
21710898Sroland.mainz@nrubsig.org	[[ $(HOME=$PWD ./-ksh -i </dev/null 2>&1) == *$t* ]] ||
2184887Schin		err_exit './-ksh ignores .profile'
21910898Sroland.mainz@nrubsig.org	[[ $(HOME=$PWD ./-ksh -ip </dev/null 2>&1) == *$t* ]] &&
2204887Schin		err_exit './-ksh -p does not ignore .profile'
2214887Schinfi
2224887Schincd ~-
22310898Sroland.mainz@nrubsig.orgrm -rf $tmp/.profile
2244887Schin
2254887Schin# { exec interactive login_shell restricted xtrace } in the following test
2264887Schin
2274887Schinfor opt in \
2284887Schin	allexport all-export all_export \
2294887Schin	bgnice bg-nice bg_nice \
2304887Schin	clobber emacs \
2314887Schin	errexit err-exit err_exit \
2324887Schin	glob \
2334887Schin	globstar glob-star glob_star \
2344887Schin	gmacs \
2354887Schin	ignoreeof ignore-eof ignore_eof \
2364887Schin	keyword log markdirs monitor notify \
2374887Schin	pipefail pipe-fail pipe_fail \
2384887Schin	trackall track-all track_all \
2394887Schin	unset verbose vi \
2404887Schin	viraw vi-raw vi_raw
2414887Schindo	old=$opt
2424887Schin	if [[ ! -o $opt ]]
2434887Schin	then	old=no$opt
2444887Schin	fi
2454887Schin
2464887Schin	set --$opt || err_exit "set --$opt failed"
2474887Schin	[[ -o $opt ]] || err_exit "[[ -o $opt ]] failed"
2484887Schin	[[ -o no$opt ]] && err_exit "[[ -o no$opt ]] failed"
2494887Schin	[[ -o no-$opt ]] && err_exit "[[ -o no-$opt ]] failed"
2504887Schin	[[ -o no_$opt ]] && err_exit "[[ -o no_$opt ]] failed"
2514887Schin	[[ -o ?$opt ]] || err_exit "[[ -o ?$opt ]] failed"
2524887Schin	[[ -o ?no$opt ]] || err_exit "[[ -o ?no$opt ]] failed"
2534887Schin	[[ -o ?no-$opt ]] || err_exit "[[ -o ?no-$opt ]] failed"
2544887Schin	[[ -o ?no_$opt ]] || err_exit "[[ -o ?no_$opt ]] failed"
2554887Schin
2564887Schin	set --no$opt || err_exit "set --no$opt failed"
2574887Schin	[[ -o no$opt ]] || err_exit "[[ -o no$opt ]] failed"
2584887Schin	[[ -o $opt ]] && err_exit "[[ -o $opt ]] failed"
2594887Schin
2604887Schin	set --no-$opt || err_exit "set --no-$opt failed"
2614887Schin	[[ -o no$opt ]] || err_exit "[[ -o no$opt ]] failed"
2624887Schin	[[ -o $opt ]] && err_exit "[[ -o $opt ]] failed"
2634887Schin
2644887Schin	set --no_$opt || err_exit "set --no_$opt failed"
2654887Schin	[[ -o no$opt ]] || err_exit "[[ -o no$opt ]] failed"
2664887Schin	[[ -o $opt ]] && err_exit "[[ -o $opt ]] failed"
2674887Schin
2684887Schin	set -o $opt || err_exit "set -o $opt failed"
2694887Schin	[[ -o $opt ]] || err_exit "[[ -o $opt ]] failed"
2704887Schin	set -o $opt=1 || err_exit "set -o $opt=1 failed"
2714887Schin	[[ -o $opt ]] || err_exit "[[ -o $opt ]] failed"
2724887Schin	set -o no$opt=0 || err_exit "set -o no$opt=0 failed"
2734887Schin	[[ -o $opt ]] || err_exit "[[ -o $opt ]] failed"
2744887Schin	set --$opt=1 || err_exit "set --$opt=1 failed"
2754887Schin	[[ -o $opt ]] || err_exit "[[ -o $opt ]] failed"
2764887Schin	set --no$opt=0 || err_exit "set --no$opt=0 failed"
2774887Schin	[[ -o $opt ]] || err_exit "[[ -o $opt ]] failed"
2784887Schin
2794887Schin	set -o no$opt || err_exit "set -o no$opt failed"
2804887Schin	[[ -o no$opt ]] || err_exit "[[ -o no$opt ]] failed"
2814887Schin	set -o $opt=0 || err_exit "set -o $opt=0 failed"
2824887Schin	[[ -o no$opt ]] || err_exit "[[ -o no$opt ]] failed"
2834887Schin	set -o no$opt=1 || err_exit "set -o no$opt=1 failed"
2844887Schin	[[ -o no$opt ]] || err_exit "[[ -o no$opt ]] failed"
2854887Schin	set --$opt=0 || err_exit "set --$opt=0 failed"
2864887Schin	[[ -o no$opt ]] || err_exit "[[ -o no$opt ]] failed"
2874887Schin	set --no$opt=1 || err_exit "set --no$opt=1 failed"
2884887Schin	[[ -o no$opt ]] || err_exit "[[ -o no$opt ]] failed"
2894887Schin
2904887Schin	set -o no-$opt || err_exit "set -o no-$opt failed"
2914887Schin	[[ -o no-$opt ]] || err_exit "[[ -o no-$opt ]] failed"
2924887Schin
2934887Schin	set -o no_$opt || err_exit "set -o no_$opt failed"
2944887Schin	[[ -o no_$opt ]] || err_exit "[[ -o no_$opt ]] failed"
2954887Schin
2964887Schin	set +o $opt || err_exit "set +o $opt failed"
2974887Schin	[[ -o no$opt ]] || err_exit "[[ -o no$opt ]] failed"
2984887Schin
2994887Schin	set +o no$opt || err_exit "set +o no$opt failed"
3004887Schin	[[ -o $opt ]] || err_exit "[[ -o $opt ]] failed"
3014887Schin
3024887Schin	set +o no-$opt || err_exit "set +o no-$opt failed"
3034887Schin	[[ -o $opt ]] || err_exit "[[ -o $opt ]] failed"
3044887Schin
3054887Schin	set +o no_$opt || err_exit "set +o no_$opt failed"
3064887Schin	[[ -o $opt ]] || err_exit "[[ -o $opt ]] failed"
3074887Schin
3084887Schin	set --$old
3094887Schindone
3104887Schin
3114887Schinfor opt in \
3124887Schin	exec interactive login_shell login-shell logi privileged \
3134887Schin	rc restricted xtrace
3144887Schindo	[[ -o $opt ]]
3154887Schin	y=$?
3164887Schin	[[ -o no$opt ]]
3174887Schin	n=$?
3184887Schin	case $y$n in
3194887Schin	10|01)	;;
3204887Schin	*)	err_exit "[[ -o $opt ]] == [[ -o no$opt ]]" ;;
3214887Schin	esac
3224887Schindone
3234887Schin
3244887Schinfor opt in \
3254887Schin	foo foo-bar foo_bar
3264887Schindo	if	[[ -o ?$opt ]]
3274887Schin	then	err_exit "[[ -o ?$opt ]] should fail"
3284887Schin	fi
3294887Schin	if	[[ -o ?no$opt ]]
3304887Schin	then	err_exit "[[ -o ?no$opt ]] should fail"
3314887Schin	fi
3324887Schindone
3338462SApril.Chin@Sun.COM
3348462SApril.Chin@Sun.COM[[ $(set +o) == $(set --state) ]] || err_exit "set --state different from set +o"
3358462SApril.Chin@Sun.COMset -- $(set --state)
3368462SApril.Chin@Sun.COM[[ $1 == set && $2 == --default ]] || err_exit "set --state failed -- expected 'set --default *', got '$1 $2 *'"
3378462SApril.Chin@Sun.COMshift
3388462SApril.Chin@Sun.COMrestore=$*
3398462SApril.Chin@Sun.COMshift
3408462SApril.Chin@Sun.COMoff=
3418462SApril.Chin@Sun.COMfor opt
3428462SApril.Chin@Sun.COMdo	case $opt in
3438462SApril.Chin@Sun.COM	--not*)	opt=${opt/--/--no} ;;
3448462SApril.Chin@Sun.COM	--no*)	opt=${opt/--no/--} ;;
3458462SApril.Chin@Sun.COM	--*)	opt=${opt/--/--no} ;;
3468462SApril.Chin@Sun.COM	esac
3478462SApril.Chin@Sun.COM	off="$off $opt"
3488462SApril.Chin@Sun.COMdone
3498462SApril.Chin@Sun.COMset $off
3508462SApril.Chin@Sun.COMstate=$(set --state)
3518462SApril.Chin@Sun.COMdefault=$(set --default --state)
3528462SApril.Chin@Sun.COM[[ $state == $default ]] || err_exit "set --state for default options failed: expected '$default', got '$state'"
3538462SApril.Chin@Sun.COMset $restore
3548462SApril.Chin@Sun.COMstate=$(set --state)
3558462SApril.Chin@Sun.COM[[ $state == "set $restore" ]] || err_exit "set --state after restore failed: expected 'set $restore', got '$state'"
3568462SApril.Chin@Sun.COM
35710898Sroland.mainz@nrubsig.orgtypeset -a pipeline
35810898Sroland.mainz@nrubsig.orgpipeline=(
35910898Sroland.mainz@nrubsig.org	( nopipefail=0 pipefail=1 command='false|true|true' )
36010898Sroland.mainz@nrubsig.org	( nopipefail=0 pipefail=1 command='true|false|true' )
36110898Sroland.mainz@nrubsig.org	( nopipefail=1 pipefail=1 command='true|true|false' )
36210898Sroland.mainz@nrubsig.org	( nopipefail=1 pipefail=1 command='false|false|false' )
36310898Sroland.mainz@nrubsig.org	( nopipefail=0 pipefail=0 command='true|true|true' )
36410898Sroland.mainz@nrubsig.org	( nopipefail=0 pipefail=0 command='print hi|(sleep 1;/bin/cat)>/dev/null' )
36510898Sroland.mainz@nrubsig.org)
36610898Sroland.mainz@nrubsig.orgset --nopipefail
36710898Sroland.mainz@nrubsig.orgfor ((i = 0; i < ${#pipeline[@]}; i++ ))
36810898Sroland.mainz@nrubsig.orgdo	eval ${pipeline[i].command}
36910898Sroland.mainz@nrubsig.org	status=$?
37010898Sroland.mainz@nrubsig.org	expected=${pipeline[i].nopipefail}
37110898Sroland.mainz@nrubsig.org	[[ $status == $expected ]] ||
37210898Sroland.mainz@nrubsig.org	err_exit "--nopipefail '${pipeline[i].command}' exit status $status -- expected $expected"
37310898Sroland.mainz@nrubsig.orgdone
37410898Sroland.mainz@nrubsig.orgftt=0
37510898Sroland.mainz@nrubsig.orgset --pipefail
37610898Sroland.mainz@nrubsig.orgfor ((i = 0; i < ${#pipeline[@]}; i++ ))
37710898Sroland.mainz@nrubsig.orgdo	eval ${pipeline[i].command}
37810898Sroland.mainz@nrubsig.org	status=$?
37910898Sroland.mainz@nrubsig.org	expected=${pipeline[i].pipefail}
38010898Sroland.mainz@nrubsig.org	if	[[ $status != $expected ]]
38110898Sroland.mainz@nrubsig.org	then	err_exit "--pipefail '${pipeline[i].command}' exit status $status -- expected $expected"
38210898Sroland.mainz@nrubsig.org		(( i == 0 )) && ftt=1
38310898Sroland.mainz@nrubsig.org	fi
38410898Sroland.mainz@nrubsig.orgdone
38510898Sroland.mainz@nrubsig.orgif	(( ! ftt ))
38610898Sroland.mainz@nrubsig.orgthen	exp=10
38710898Sroland.mainz@nrubsig.org	got=$(for((n=1;n<exp;n++))do $SHELL --pipefail -c '(sleep 0.1;false)|true|true' && break; done; print $n)
38810898Sroland.mainz@nrubsig.org	[[ $got == $exp ]] || err_exit "--pipefail -c '(sleep 0.1;false)|true|true' fails with exit status 0 (after $got/$exp iterations)"
38910898Sroland.mainz@nrubsig.orgfi
39010898Sroland.mainz@nrubsig.org
39110898Sroland.mainz@nrubsig.orgecho=$(whence -p echo)
39210898Sroland.mainz@nrubsig.orgfor ((i=0; i < 20; i++))
39310898Sroland.mainz@nrubsig.orgdo	if	! x=$(true | $echo 123)
39410898Sroland.mainz@nrubsig.org	then	err_exit 'command substitution with wrong exit status with pipefai'
39510898Sroland.mainz@nrubsig.org		break
39610898Sroland.mainz@nrubsig.org	fi
39710898Sroland.mainz@nrubsig.orgdone
3988462SApril.Chin@Sun.COM(
3998462SApril.Chin@Sun.COM	set -o pipefail
4008462SApril.Chin@Sun.COM	false | true
4018462SApril.Chin@Sun.COM	(( $? )) || err_exit 'pipe not failing in subshell with pipefail'
4028462SApril.Chin@Sun.COM) | wc >/dev/null
4038462SApril.Chin@Sun.COM$SHELL -c 'set -o pipefail; false | $(whence -p true);' && err_exit 'pipefail not returning failure with sh -c'
40410898Sroland.mainz@nrubsig.orgexp='1212 or 1221'
40510898Sroland.mainz@nrubsig.orggot=$(
40610898Sroland.mainz@nrubsig.org	set --pipefail
4078462SApril.Chin@Sun.COM	pipe() { date | cat > /dev/null ;}
4088462SApril.Chin@Sun.COM	print $'1\n2' |
40910898Sroland.mainz@nrubsig.org	while	read i
41010898Sroland.mainz@nrubsig.org	do 	if	pipe $tmp
41110898Sroland.mainz@nrubsig.org		then	{ print -n $i; sleep 2; print -n $i; } &
4128462SApril.Chin@Sun.COM		fi
4138462SApril.Chin@Sun.COM	done
41410898Sroland.mainz@nrubsig.org	wait
41510898Sroland.mainz@nrubsig.org)
41610898Sroland.mainz@nrubsig.org[[ $got == @((12|21)(12|21)) ]] || err_exit "& job delayed by --pipefail, expected '$exp', got '$got'"
41710898Sroland.mainz@nrubsig.org$SHELL -c '[[ $- == *c* ]]' || err_exit 'option c not in $-'
41810898Sroland.mainz@nrubsig.org> $tmp/.profile
41910898Sroland.mainz@nrubsig.orgfor i in i l r s D E a b e f h k n t u v x B C G H
42010898Sroland.mainz@nrubsig.orgdo	HOME=$tmp ENV= $SHELL -$i >/dev/null 2>&1 <<- ++EOF++ || err_exit "option $i not in \$-"
42110898Sroland.mainz@nrubsig.org	[[ \$- == *$i* ]] || exit 1
4228462SApril.Chin@Sun.COM	++EOF++
4238462SApril.Chin@Sun.COMdone
4248462SApril.Chin@Sun.COMletters=ilrabefhknuvxBCGE
4258462SApril.Chin@Sun.COMinteger j=0
42610898Sroland.mainz@nrubsig.orgfor i in interactive login restricted allexport notify errexit \
42710898Sroland.mainz@nrubsig.org	noglob trackall keyword noexec nounset verbose xtrace braceexpand \
4288462SApril.Chin@Sun.COM	noclobber globstar rc
42910898Sroland.mainz@nrubsig.orgdo	HOME=$tmp ENV= $SHELL -o $i >/dev/null 2>&1 <<- ++EOF++ || err_exit "option $i not equivalent to ${letters:j:1}"
43010898Sroland.mainz@nrubsig.org	[[ \$- == *${letters:j:1}* ]] || exit 1
4318462SApril.Chin@Sun.COM	++EOF++
4328462SApril.Chin@Sun.COM	((j++))
4338462SApril.Chin@Sun.COMdone
43410898Sroland.mainz@nrubsig.org
43510898Sroland.mainz@nrubsig.orgexport ENV=
43610898Sroland.mainz@nrubsig.orghistfile=$tmp/history
43710898Sroland.mainz@nrubsig.orgexp=$(HISTFILE=$histfile $SHELL -c $'function foo\n{\ncat\n}\ntype foo')
43810898Sroland.mainz@nrubsig.orgfor var in HISTSIZE HISTFILE
43910898Sroland.mainz@nrubsig.orgdo	got=$( ( HISTFILE=$histfile $SHELL -ic $'unset '$var$'\nfunction foo\n{\ncat\n}\ntype foo\nexit' ) 2>&1 )
44010898Sroland.mainz@nrubsig.org	got=${got##*': '}
44110898Sroland.mainz@nrubsig.org	[[ $got == "$exp" ]] || err_exit "function definition inside (...) with $var unset fails -- got '$got', expected '$exp'"
44210898Sroland.mainz@nrubsig.org	got=$( { HISTFILE=$histfile $SHELL -ic $'unset '$var$'\nfunction foo\n{\ncat\n}\ntype foo\nexit' ;} 2>&1 )
44310898Sroland.mainz@nrubsig.org	got=${got##*': '}
44410898Sroland.mainz@nrubsig.org	[[ $got == "$exp" ]] || err_exit "function definition inside {...;} with $var unset fails -- got '$got', expected '$exp'"
44510898Sroland.mainz@nrubsig.orgdone
44610898Sroland.mainz@nrubsig.org( unset HISTFILE; $SHELL -ic "HISTFILE=$histfile" 2>/dev/null ) || err_exit "setting HISTFILE when not in environment fails"
44710898Sroland.mainz@nrubsig.org
44810898Sroland.mainz@nrubsig.org# the next tests loop on all combinations of
44910898Sroland.mainz@nrubsig.org#	{ SUB PAR CMD ADD }
45010898Sroland.mainz@nrubsig.org
45110898Sroland.mainz@nrubsig.orgSUB=(
45210898Sroland.mainz@nrubsig.org	( BEG='$( '	END=' )'	)
45310898Sroland.mainz@nrubsig.org	( BEG='${ '	END='; }'	)
45410898Sroland.mainz@nrubsig.org)
45510898Sroland.mainz@nrubsig.orgPAR=(
45610898Sroland.mainz@nrubsig.org	( BEG='( '	END=' )'	)
45710898Sroland.mainz@nrubsig.org	( BEG='{ '	END='; }'	)
45810898Sroland.mainz@nrubsig.org)
45910898Sroland.mainz@nrubsig.orgCMD=(	command-kill	script-kill	)
46010898Sroland.mainz@nrubsig.orgADD=(	''		'; :'		)
46110898Sroland.mainz@nrubsig.org
46210898Sroland.mainz@nrubsig.orgcd $tmp
46310898Sroland.mainz@nrubsig.orgprint $'#!'$SHELL$'\nkill -KILL $$' > command-kill
46410898Sroland.mainz@nrubsig.orgprint $'kill -KILL $$' > script-kill
46510898Sroland.mainz@nrubsig.orgchmod +x command-kill script-kill
46610898Sroland.mainz@nrubsig.orgexport PATH=.:$PATH
46710898Sroland.mainz@nrubsig.orgexp='Killed'
46810898Sroland.mainz@nrubsig.orgfor ((S=0; S<${#SUB[@]}; S++))
46910898Sroland.mainz@nrubsig.orgdo	for ((P=0; P<${#PAR[@]}; P++))
47010898Sroland.mainz@nrubsig.org	do	for ((C=0; C<${#CMD[@]}; C++))
47110898Sroland.mainz@nrubsig.org		do	for ((A=0; A<${#ADD[@]}; A++))
47210898Sroland.mainz@nrubsig.org			do	cmd="${SUB[S].BEG}${PAR[P].BEG}${CMD[C]}${PAR[P].END} 2>&1${ADD[A]}${SUB[S].END}"
47310898Sroland.mainz@nrubsig.org				eval got="$cmd"
47410898Sroland.mainz@nrubsig.org				got=${got##*': '}
47510898Sroland.mainz@nrubsig.org				got=${got%%'('*}
47610898Sroland.mainz@nrubsig.org				[[ $got == "$exp" ]] || err_exit "$cmd failed -- got '$got', expected '$exp'"
47710898Sroland.mainz@nrubsig.org			done
47810898Sroland.mainz@nrubsig.org		done
47910898Sroland.mainz@nrubsig.org	done
48010898Sroland.mainz@nrubsig.orgdone
48110898Sroland.mainz@nrubsig.org
48210898Sroland.mainz@nrubsig.org$SHELL 2> /dev/null -c '{; true ;}' || err_exit 'leading ; causes syntax error in brace group'
48310898Sroland.mainz@nrubsig.org$SHELL 2> /dev/null -c '(; true ;)' || err_exit 'leading ; causes syntax error in parenthesis group'
48410898Sroland.mainz@nrubsig.org
48510898Sroland.mainz@nrubsig.orgprint 'for ((i = 0; i < ${1:-10000}; i++ )); do printf "%.*c\n" 15 x; done' > pipefail
48610898Sroland.mainz@nrubsig.orgchmod +x pipefail
48710898Sroland.mainz@nrubsig.org$SHELL --pipefail -c './pipefail 10000 | sed 1q' >/dev/null 2>&1 &
48810898Sroland.mainz@nrubsig.orgtst=$!
48910898Sroland.mainz@nrubsig.org{ sleep 4; kill $tst; } 2>/dev/null &
49010898Sroland.mainz@nrubsig.orgspy=$!
49110898Sroland.mainz@nrubsig.orgwait $tst 2>/dev/null
49210898Sroland.mainz@nrubsig.orgstatus=$?
49310898Sroland.mainz@nrubsig.orgif	[[ $status == 0 || $(kill -l $status) == PIPE ]]
49410898Sroland.mainz@nrubsig.orgthen    kill $spy 2>/dev/null
49510898Sroland.mainz@nrubsig.orgelse    err_exit "pipefail pipeline bypasses SIGPIPE and hangs"
49610898Sroland.mainz@nrubsig.orgfi
49710898Sroland.mainz@nrubsig.orgwait
49810898Sroland.mainz@nrubsig.org
4994887Schinexit $((Errors))
500