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