1da2e3ebdSchin######################################################################## 2da2e3ebdSchin# # 3da2e3ebdSchin# This software is part of the ast package # 4*3e14f97fSRoger A. Faulkner# Copyright (c) 1982-2010 AT&T Intellectual Property # 5da2e3ebdSchin# and is licensed under the # 6da2e3ebdSchin# Common Public License, Version 1.0 # 77c2fbfb3SApril Chin# by AT&T Intellectual Property # 8da2e3ebdSchin# # 9da2e3ebdSchin# A copy of the License is available at # 10da2e3ebdSchin# http://www.opensource.org/licenses/cpl1.0.txt # 11da2e3ebdSchin# (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) # 12da2e3ebdSchin# # 13da2e3ebdSchin# Information and Software Systems Research # 14da2e3ebdSchin# AT&T Research # 15da2e3ebdSchin# Florham Park NJ # 16da2e3ebdSchin# # 17da2e3ebdSchin# David Korn <dgk@research.att.com> # 18da2e3ebdSchin# # 19da2e3ebdSchin######################################################################## 20da2e3ebdSchinfunction err_exit 21da2e3ebdSchin{ 22da2e3ebdSchin print -u2 -n "\t" 23da2e3ebdSchin print -u2 -r ${Command}[$1]: "${@:2}" 24da2e3ebdSchin let Errors+=1 25da2e3ebdSchin} 26da2e3ebdSchinalias err_exit='err_exit $LINENO' 27da2e3ebdSchin 28da2e3ebdSchinCommand=${0##*/} 29da2e3ebdSchininteger Errors=0 3034f9b3eeSRoland Mainz 3134f9b3eeSRoland Mainztmp=$(mktemp -dt) || { err_exit mktemp -dt failed; exit 1; } 3234f9b3eeSRoland Mainztrap "cd /; rm -rf $tmp" EXIT 3334f9b3eeSRoland Mainz 34da2e3ebdSchinr=readonly u=Uppercase l=Lowercase i=22 i8=10 L=abc L5=def uL5=abcdef xi=20 35da2e3ebdSchinx=export t=tagged H=hostname LZ5=026 RZ5=026 Z5=123 lR5=ABcdef R5=def n=l 36da2e3ebdSchinfor option in u l i i8 L L5 LZ5 RZ5 Z5 r x H t R5 uL5 lR5 xi n 37da2e3ebdSchindo typeset -$option $option 38da2e3ebdSchindone 39da2e3ebdSchin(r=newval) 2> /dev/null && err_exit readonly attribute fails 40da2e3ebdSchini=i+5 41da2e3ebdSchinif ((i != 27)) 42da2e3ebdSchinthen err_exit integer attributes fails 43da2e3ebdSchinfi 44da2e3ebdSchinif [[ $i8 != 8#12 ]] 45da2e3ebdSchinthen err_exit integer base 8 fails 46da2e3ebdSchinfi 47da2e3ebdSchinif [[ $u != UPPERCASE ]] 48da2e3ebdSchinthen err_exit uppercase fails 49da2e3ebdSchinfi 50da2e3ebdSchinif [[ $l != lowercase ]] 51da2e3ebdSchinthen err_exit lowercase fails 52da2e3ebdSchinfi 53da2e3ebdSchinif [[ $n != lowercase ]] 54da2e3ebdSchinthen err_exit reference variables fail 55da2e3ebdSchinfi 56da2e3ebdSchinif [[ t=tagged != $(typeset -t) ]] 57da2e3ebdSchinthen err_exit tagged fails 58da2e3ebdSchinfi 59da2e3ebdSchinif [[ t != $(typeset +t) ]] 60da2e3ebdSchinthen err_exit tagged fails 61da2e3ebdSchinfi 62da2e3ebdSchinif [[ $Z5 != 00123 ]] 63da2e3ebdSchinthen err_exit zerofill fails 64da2e3ebdSchinfi 65da2e3ebdSchinif [[ $RZ5 != 00026 ]] 66da2e3ebdSchinthen err_exit right zerofill fails 67da2e3ebdSchinfi 68da2e3ebdSchinL=12345 69da2e3ebdSchinif [[ $L != 123 ]] 70da2e3ebdSchinthen err_exit leftjust fails 71da2e3ebdSchinfi 72da2e3ebdSchinif [[ $L5 != "def " ]] 73da2e3ebdSchinthen err_exit leftjust fails 74da2e3ebdSchinfi 75da2e3ebdSchinif [[ $uL5 != ABCDE ]] 76da2e3ebdSchinthen err_exit leftjust uppercase fails 77da2e3ebdSchinfi 78da2e3ebdSchinif [[ $lR5 != bcdef ]] 79da2e3ebdSchinthen err_exit rightjust fails 80da2e3ebdSchinfi 81da2e3ebdSchinif [[ $R5 != " def" ]] 82da2e3ebdSchinthen err_exit rightjust fails 83da2e3ebdSchinfi 84da2e3ebdSchinif [[ $($SHELL -c 'echo $x') != export ]] 85da2e3ebdSchinthen err_exit export fails 86da2e3ebdSchinfi 87da2e3ebdSchinif [[ $($SHELL -c 'xi=xi+4;echo $xi') != 24 ]] 88da2e3ebdSchinthen err_exit export attributes fails 89da2e3ebdSchinfi 90da2e3ebdSchinx=$(foo=abc $SHELL <<! 91da2e3ebdSchin foo=bar 92da2e3ebdSchin $SHELL -c 'print \$foo' 93da2e3ebdSchin! 94da2e3ebdSchin) 95da2e3ebdSchinif [[ $x != bar ]] 96da2e3ebdSchinthen err_exit 'environment variables require re-export' 97da2e3ebdSchinfi 98da2e3ebdSchin(typeset + ) > /dev/null 2>&1 || err_exit 'typeset + not working' 99da2e3ebdSchin(typeset -L-5 buf="A" 2>/dev/null) 100da2e3ebdSchinif [[ $? == 0 ]] 101da2e3ebdSchinthen err_exit 'typeset allows negative field for left/right adjust' 102da2e3ebdSchinfi 103da2e3ebdSchina=b 104da2e3ebdSchinreadonly $a=foo 105da2e3ebdSchinif [[ $b != foo ]] 106da2e3ebdSchinthen err_exit 'readonly $a=b not working' 107da2e3ebdSchinfi 108da2e3ebdSchinif [[ $(export | grep '^PATH=') != PATH=* ]] 109da2e3ebdSchinthen err_exit 'export not working' 110da2e3ebdSchinfi 111da2e3ebdSchinpicture=( 112da2e3ebdSchin bitmap=/fruit 113da2e3ebdSchin size=(typeset -E x=2.5) 114da2e3ebdSchin) 115da2e3ebdSchinstring="$(print $picture)" 116da2e3ebdSchinif [[ "${string}" != *'size=( typeset -E'* ]] 117da2e3ebdSchinthen err_exit 'print of compound exponential variable not working' 118da2e3ebdSchinfi 119da2e3ebdSchinsz=(typeset -E y=2.2) 120da2e3ebdSchinstring="$(print $sz)" 121da2e3ebdSchinif [[ "${sz}" == *'typeset -E -F'* ]] 122da2e3ebdSchinthen err_exit 'print of exponential shows both -E and -F attributes' 123da2e3ebdSchinfi 12434f9b3eeSRoland Mainzprint 'typeset -i m=48/4+1;print -- $m' > $tmp/script 12534f9b3eeSRoland Mainzchmod +x $tmp/script 126da2e3ebdSchintypeset -Z2 m 12734f9b3eeSRoland Mainzif [[ $($tmp/script) != 13 ]] 128da2e3ebdSchinthen err_exit 'attributes not cleared for script execution' 129da2e3ebdSchinfi 13034f9b3eeSRoland Mainzprint 'print VAR=$VAR' > $tmp/script 1317c2fbfb3SApril Chintypeset -L70 VAR=var 13234f9b3eeSRoland Mainz$tmp/script > $tmp/script.1 13334f9b3eeSRoland Mainz[[ $(< $tmp/script.1) == VAR= ]] || err_exit 'typeset -L should not be inherited' 134da2e3ebdSchintypeset -Z LAST=00 135da2e3ebdSchinunset -f foo 136da2e3ebdSchinfunction foo 137da2e3ebdSchin{ 138da2e3ebdSchin if [[ $1 ]] 139da2e3ebdSchin then LAST=$1 140da2e3ebdSchin else ((LAST++)) 141da2e3ebdSchin fi 142da2e3ebdSchin} 143da2e3ebdSchinfoo 1 144da2e3ebdSchinif (( ${#LAST} != 2 )) 145da2e3ebdSchinthen err_exit 'LAST!=2' 146da2e3ebdSchinfi 147da2e3ebdSchinfoo 148da2e3ebdSchinif (( ${#LAST} != 2 )) 149da2e3ebdSchinthen err_exit 'LAST!=2' 150da2e3ebdSchinfi 1517c2fbfb3SApril Chin[[ $(set | grep LAST) == LAST=02 ]] || err_exit "LAST not correct in set list" 152da2e3ebdSchinset -a 153da2e3ebdSchinunset foo 154da2e3ebdSchinfoo=bar 155da2e3ebdSchinif [[ $(export | grep ^foo=) != 'foo=bar' ]] 156da2e3ebdSchinthen err_exit 'all export not working' 157da2e3ebdSchinfi 158da2e3ebdSchinunset foo 159da2e3ebdSchinread foo <<! 160da2e3ebdSchinbar 161da2e3ebdSchin! 162da2e3ebdSchinif [[ $(export | grep ^foo=) != 'foo=bar' ]] 163da2e3ebdSchinthen err_exit 'all export not working with read' 164da2e3ebdSchinfi 165da2e3ebdSchinif [[ $(typeset | grep PS2) == PS2 ]] 166da2e3ebdSchinthen err_exit 'typeset without arguments outputs names without attributes' 167da2e3ebdSchinfi 168da2e3ebdSchinunset a z q x 169da2e3ebdSchinw1=hello 170da2e3ebdSchinw2=world 171da2e3ebdSchint1="$w1 $w2" 172da2e3ebdSchinif (( 'a' == 97 )) 173da2e3ebdSchinthen b1=aGVsbG8gd29ybGQ= 174da2e3ebdSchin b2=aGVsbG8gd29ybGRoZWxsbyB3b3JsZA== 175da2e3ebdSchinelse b1=iIWTk5ZAppaZk4Q= 176da2e3ebdSchin b2=iIWTk5ZAppaZk4SIhZOTlkCmlpmThA== 177da2e3ebdSchinfi 178da2e3ebdSchinz=$b1 179da2e3ebdSchintypeset -b x=$b1 180da2e3ebdSchin[[ $x == "$z" ]] || print -u2 'binary variable not expanding correctly' 181da2e3ebdSchin[[ $(printf "%B" x) == $t1 ]] || err_exit 'typeset -b not working' 182da2e3ebdSchintypeset -b -Z5 a=$b1 183da2e3ebdSchin[[ $(printf "%B" a) == $w1 ]] || err_exit 'typeset -b -Z5 not working' 184da2e3ebdSchintypeset -b q=$x$x 185da2e3ebdSchin[[ $q == $b2 ]] || err_exit 'typeset -b not working with concatination' 186da2e3ebdSchin[[ $(printf "%B" q) == $t1$t1 ]] || err_exit 'typeset -b concatination not working' 187da2e3ebdSchinx+=$b1 188da2e3ebdSchin[[ $x == $b2 ]] || err_exit 'typeset -b not working with append' 189da2e3ebdSchin[[ $(printf "%B" x) == $t1$t1 ]] || err_exit 'typeset -b append not working' 190da2e3ebdSchintypeset -b -Z20 z=$b1 191da2e3ebdSchin(( $(printf "%B" z | wc -c) == 20 )) || err_exit 'typeset -b -Z20 not storing 20 bytes' 192da2e3ebdSchin{ 193da2e3ebdSchin typeset -b v1 v2 194da2e3ebdSchin read -N11 v1 195da2e3ebdSchin read -N22 v2 196da2e3ebdSchin} << ! 197da2e3ebdSchinhello worldhello worldhello world 198da2e3ebdSchin! 199da2e3ebdSchin[[ $v1 == "$b1" ]] || err_exit "v1=$v1 should be $b1" 200da2e3ebdSchin[[ $v2 == "$x" ]] || err_exit "v1=$v2 should be $x" 20134f9b3eeSRoland Mainzif env '!=1' >/dev/null 2>&1 20234f9b3eeSRoland Mainzthen [[ $(env '!=1' $SHELL -c 'echo ok' 2>/dev/null) == ok ]] || err_exit 'malformed environment terminates shell' 20334f9b3eeSRoland Mainzfi 204da2e3ebdSchinunset var 205da2e3ebdSchintypeset -b var 206da2e3ebdSchinprintf '12%Z34' | read -r -N 5 var 207da2e3ebdSchin[[ $var == MTIAMzQ= ]] || err_exit 'binary files with zeros not working' 208da2e3ebdSchinunset var 209da2e3ebdSchinif command typeset -usi var=0xfffff 2> /dev/null 210da2e3ebdSchinthen (( $var == 0xffff )) || err_exit 'unsigned short integers not working' 211da2e3ebdSchinelse err_exit 'typeset -usi cannot be used for unsigned short' 212da2e3ebdSchinfi 213da2e3ebdSchin[[ $($SHELL -c 'unset foo;typeset -Z2 foo; print ${foo:-3}' 2> /dev/null) == 3 ]] || err_exit '${foo:-3} not 3 when typeset -Z2 field undefined' 214da2e3ebdSchin[[ $($SHELL -c 'unset foo;typeset -Z2 foo; print ${foo:=3}' 2> /dev/null) == 03 ]] || err_exit '${foo:=-3} not 3 when typeset -Z2 foo undefined' 215da2e3ebdSchinunset foo bar 216da2e3ebdSchinunset -f fun 217da2e3ebdSchinfunction fun 218da2e3ebdSchin{ 219da2e3ebdSchin export foo=hello 220da2e3ebdSchin typeset -x bar=world 221da2e3ebdSchin [[ $foo == hello ]] || err_exit 'export scoping problem in function' 222da2e3ebdSchin} 223da2e3ebdSchinfun 224da2e3ebdSchin[[ $(export | grep foo) == 'foo=hello' ]] || err_exit 'export not working in functions' 225da2e3ebdSchin[[ $(export | grep bar) ]] && err_exit 'typeset -x not local' 2267c2fbfb3SApril Chin[[ $($SHELL -c 'typeset -r IFS=;print -r $(pwd)' 2> /dev/null) == "$(pwd)" ]] || err_exit 'readonly IFS causes command substitution to fail' 2277c2fbfb3SApril Chinfred[66]=88 2287c2fbfb3SApril Chin[[ $(typeset -pa) == *fred* ]] || err_exit 'typeset -pa not working' 2297c2fbfb3SApril Chinunset x y z 2307c2fbfb3SApril Chintypeset -LZ3 x=abcd y z=00abcd 2317c2fbfb3SApril Chiny=03 2327c2fbfb3SApril Chin[[ $y == "3 " ]] || err_exit '-LZ3 not working for value 03' 2337c2fbfb3SApril Chin[[ $x == "abc" ]] || err_exit '-LZ3 not working for value abcd' 2347c2fbfb3SApril Chin[[ $x == "abc" ]] || err_exit '-LZ3 not working for value 00abcd' 2357c2fbfb3SApril Chinunset x z 2367c2fbfb3SApril Chinset +a 2377c2fbfb3SApril Chin[[ $(typeset -p z) ]] && err_exit "typeset -p for z undefined failed" 2387c2fbfb3SApril Chinunset z 2397c2fbfb3SApril Chinx='typeset -i z=45' 2407c2fbfb3SApril Chineval "$x" 2417c2fbfb3SApril Chin[[ $(typeset -p z) == "$x" ]] || err_exit "typeset -p for '$x' failed" 2427c2fbfb3SApril Chin[[ $(typeset +p z) == "${x%=*}" ]] || err_exit "typeset +p for '$x' failed" 2437c2fbfb3SApril Chinunset z 2447c2fbfb3SApril Chinx='typeset -a z=(a b c)' 2457c2fbfb3SApril Chineval "$x" 2467c2fbfb3SApril Chin[[ $(typeset -p z) == "$x" ]] || err_exit "typeset -p for '$x' failed" 2477c2fbfb3SApril Chin[[ $(typeset +p z) == "${x%=*}" ]] || err_exit "typeset +p for '$x' failed" 2487c2fbfb3SApril Chinunset z 2497c2fbfb3SApril Chinx='typeset -C z=( 2507c2fbfb3SApril Chin foo=bar 2517c2fbfb3SApril Chin xxx=bam 2527c2fbfb3SApril Chin)' 2537c2fbfb3SApril Chineval "$x" 2547c2fbfb3SApril Chinx=${x//$'\t'} 2557c2fbfb3SApril Chinx=${x//$'(\n'/'('} 2567c2fbfb3SApril Chinx=${x//$'\n'/';'} 2577c2fbfb3SApril Chin[[ $(typeset -p z) == "$x" ]] || err_exit "typeset -p for '$x' failed" 2587c2fbfb3SApril Chin[[ $(typeset +p z) == "${x%%=*}" ]] || err_exit "typeset +p for '$x' failed" 2597c2fbfb3SApril Chinunset z 2607c2fbfb3SApril Chinx='typeset -A z=([bar]=bam [xyz]=bar)' 2617c2fbfb3SApril Chineval "$x" 2627c2fbfb3SApril Chin[[ $(typeset -p z) == "$x" ]] || err_exit "typeset -p for '$x' failed" 2637c2fbfb3SApril Chin[[ $(typeset +p z) == "${x%%=*}" ]] || err_exit "typeset +p for '$x' failed" 2647c2fbfb3SApril Chinunset z 2657c2fbfb3SApril Chinfoo=abc 2667c2fbfb3SApril Chinx='typeset -n z=foo' 2677c2fbfb3SApril Chineval "$x" 2687c2fbfb3SApril Chin[[ $(typeset -p z) == "$x" ]] || err_exit "typeset -p for '$x' failed" 2697c2fbfb3SApril Chin[[ $(typeset +p z) == "${x%%=*}" ]] || err_exit "typeset +p for '$x' failed" 2707c2fbfb3SApril Chintypeset +n z 2717c2fbfb3SApril Chinunset foo z 2727c2fbfb3SApril Chintypeset -T Pt_t=( 2737c2fbfb3SApril Chin float x=1 y=2 2747c2fbfb3SApril Chin) 2757c2fbfb3SApril ChinPt_t z 2767c2fbfb3SApril Chinx=${z//$'\t'} 2777c2fbfb3SApril Chinx=${x//$'(\n'/'('} 2787c2fbfb3SApril Chinx=${x//$'\n'/';'} 2797c2fbfb3SApril Chin[[ $(typeset -p z) == "Pt_t z=$x" ]] || err_exit "typeset -p for type failed" 2807c2fbfb3SApril Chin[[ $(typeset +p z) == "Pt_t z" ]] || err_exit "typeset +p for type failed" 2817c2fbfb3SApril Chinunset z 2827c2fbfb3SApril Chinfunction foo 2837c2fbfb3SApril Chin{ 2847c2fbfb3SApril Chin typeset -p bar 2857c2fbfb3SApril Chin} 2867c2fbfb3SApril Chinbar=xxx 2877c2fbfb3SApril Chin[[ $(foo) == bar=xxx ]] || err_exit 'typeset -p not working inside a function' 28834f9b3eeSRoland Mainzunset foo 28934f9b3eeSRoland Mainztypeset -L5 foo 29034f9b3eeSRoland Mainz[[ $(typeset -p foo) == 'typeset -L 5 foo' ]] || err_exit 'typeset -p not working for variables with attributes but without a value' 29134f9b3eeSRoland Mainz{ $SHELL <<- EOF 29234f9b3eeSRoland Mainz typeset -L3 foo=aaa 29334f9b3eeSRoland Mainz typeset -L6 foo=bbbbbb 29434f9b3eeSRoland Mainz [[ \$foo == bbbbbb ]] 29534f9b3eeSRoland MainzEOF 29634f9b3eeSRoland Mainz} || err_exit 'typeset -L should not preserve old attributes' 29734f9b3eeSRoland Mainz{ $SHELL <<- EOF 29834f9b3eeSRoland Mainz typeset -R3 foo=aaa 29934f9b3eeSRoland Mainz typeset -R6 foo=bbbbbb 30034f9b3eeSRoland Mainz [[ \$foo == bbbbbb ]] 30134f9b3eeSRoland MainzEOF 30234f9b3eeSRoland Mainz} 2> /dev/null || err_exit 'typeset -R should not preserve old attributes' 30334f9b3eeSRoland Mainz 30434f9b3eeSRoland Mainzexpected='YWJjZGVmZ2hpag==' 30534f9b3eeSRoland Mainzunset foo 30634f9b3eeSRoland Mainztypeset -b -Z10 foo 30734f9b3eeSRoland Mainzread foo <<< 'abcdefghijklmnop' 30834f9b3eeSRoland Mainz[[ $foo == "$expected" ]] || err_exit 'read foo, where foo is "typeset -b -Z10" not working' 30934f9b3eeSRoland Mainzunset foo 31034f9b3eeSRoland Mainztypeset -b -Z10 foo 31134f9b3eeSRoland Mainzread -N10 foo <<< 'abcdefghijklmnop' 31234f9b3eeSRoland Mainz[[ $foo == "$expected" ]] || err_exit 'read -N10 foo, where foo is "typeset -b -Z10" not working' 31334f9b3eeSRoland Mainzunset foo 31434f9b3eeSRoland Mainztypeset -b -A foo 31534f9b3eeSRoland Mainzread -N10 foo[4] <<< 'abcdefghijklmnop' 31634f9b3eeSRoland Mainz[[ ${foo[4]} == "$expected" ]] || err_exit 'read -N10 foo, where foo is "typeset -b -A" foo not working' 31734f9b3eeSRoland Mainzunset foo 31834f9b3eeSRoland Mainztypeset -b -a foo 31934f9b3eeSRoland Mainzread -N10 foo[4] <<< 'abcdefghijklmnop' 32034f9b3eeSRoland Mainz[[ ${foo[4]} == "$expected" ]] || err_exit 'read -N10 foo, where foo is "typeset -b -a" foo not working' 32134f9b3eeSRoland Mainz[[ $(printf %B foo[4]) == abcdefghij ]] || err_exit 'printf %B for binary associative array element not working' 32234f9b3eeSRoland Mainz[[ $(printf %B foo[4]) == abcdefghij ]] || err_exit 'printf %B for binary indexed array element not working' 32334f9b3eeSRoland Mainzunset foo 32434f9b3eeSRoland Mainz 32534f9b3eeSRoland Mainz$SHELL 2> /dev/null -c 'export foo=(bar=3)' && err_exit 'compound variables cannot be exported' 32634f9b3eeSRoland Mainz 327*3e14f97fSRoger A. Faulkner$SHELL -c 'builtin date' >/dev/null 2>&1 && 328*3e14f97fSRoger A. Faulkner{ 329*3e14f97fSRoger A. Faulkner 330*3e14f97fSRoger A. Faulkner# check env var changes against a builtin that uses the env var 331*3e14f97fSRoger A. Faulkner 332*3e14f97fSRoger A. FaulknerSEC=1234252800 333*3e14f97fSRoger A. FaulknerETZ=EST5EDT 334*3e14f97fSRoger A. FaulknerEDT=03 335*3e14f97fSRoger A. FaulknerPTZ=PST8PDT 336*3e14f97fSRoger A. FaulknerPDT=00 337*3e14f97fSRoger A. Faulkner 338*3e14f97fSRoger A. FaulknerCMD="date -f%H \\#$SEC" 339*3e14f97fSRoger A. Faulkner 340*3e14f97fSRoger A. Faulknerexport TZ=$ETZ 341*3e14f97fSRoger A. Faulkner 342*3e14f97fSRoger A. Faulknerset -- \ 343*3e14f97fSRoger A. Faulkner "$EDT $PDT $EDT" "" "TZ=$PTZ" "" \ 344*3e14f97fSRoger A. Faulkner "$EDT $PDT $EDT" "" "TZ=$PTZ" "TZ=$ETZ" \ 345*3e14f97fSRoger A. Faulkner "$EDT $PDT $EDT" "TZ=$ETZ" "TZ=$PTZ" "TZ=$ETZ" \ 346*3e14f97fSRoger A. Faulkner "$PDT $EDT $PDT" "TZ=$PTZ" "" "TZ=$PTZ" \ 347*3e14f97fSRoger A. Faulkner "$PDT $EDT $PDT" "TZ=$PTZ" "TZ=$ETZ" "TZ=$PTZ" \ 348*3e14f97fSRoger A. Faulkner "$EDT $PDT $EDT" "foo=bar" "TZ=$PTZ" "TZ=$ETZ" \ 349*3e14f97fSRoger A. Faulkner 350*3e14f97fSRoger A. Faulknerwhile (( $# >= 4 )) 351*3e14f97fSRoger A. Faulknerdo exp=$1 352*3e14f97fSRoger A. Faulkner got=$(print $($SHELL -c "builtin date; $2 $CMD; $3 $CMD; $4 $CMD")) 353*3e14f97fSRoger A. Faulkner [[ $got == $exp ]] || err_exit "[ '$2' '$3' '$4' ] env sequence failed -- expected '$exp', got '$got'" 354*3e14f97fSRoger A. Faulkner shift 4 355*3e14f97fSRoger A. Faulknerdone 356*3e14f97fSRoger A. Faulkner 357*3e14f97fSRoger A. Faulkner} 358*3e14f97fSRoger A. Faulkner 359*3e14f97fSRoger A. Faulknerunset v 360*3e14f97fSRoger A. Faulknertypeset -H v=/dev/null 361*3e14f97fSRoger A. Faulkner[[ $v == *nul* ]] || err_exit 'typeset -H for /dev/null not working' 362*3e14f97fSRoger A. Faulkner 363da2e3ebdSchinexit $((Errors)) 364