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
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainztmp=$(mktemp -dt) || { err_exit mktemp -dt failed; exit 1; }
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainztrap "cd /; rm -rf $tmp" EXIT
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# test shell builtin commands
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinbuiltin getconf
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin: ${foo=bar} || err_exit ": failed"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin[[ $foo = bar ]] || err_exit ": side effects failed"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinset -- - foobar
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin[[ $# = 2 && $1 = - && $2 = foobar ]] || err_exit "set -- - foobar failed"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinset -- -x foobar
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin[[ $# = 2 && $1 = -x && $2 = foobar ]] || err_exit "set -- -x foobar failed"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chingetopts :x: foo || err_exit "getopts :x: returns false"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin[[ $foo = x && $OPTARG = foobar ]] || err_exit "getopts :x: failed"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinOPTIND=1
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chingetopts :r:s var -r
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinif [[ $var != : || $OPTARG != r ]]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinthen err_exit "'getopts :r:s var -r' not working"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinOPTIND=1
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chingetopts :d#u OPT -d 16177
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinif [[ $OPT != d || $OPTARG != 16177 ]]
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinthen err_exit "'getopts :d#u OPT=d OPTARG=16177' failed -- OPT=$OPT OPTARG=$OPTARG"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinOPTIND=1
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinwhile getopts 'ab' option -a -b
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chindo [[ $OPTIND == $((OPTIND)) ]] || err_exit "OPTIND optimization bug"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chindone
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinUSAGE=$'[-][S:server?Operate on the specified \asubservice\a:]:[subservice:=pmserver]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin [p:pmserver]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin [r:repserver]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin [11:notifyd]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinset pmser p rep r notifyd -11
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinwhile (( $# > 1 ))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chindo OPTIND=1
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin getopts "$USAGE" OPT -S $1
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin [[ $OPT == S && $OPTARG == $2 ]] || err_exit "OPT=$OPT OPTARG=$OPTARG -- expected OPT=S OPTARG=$2"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin shift 2
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chindone
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfalse ${foo=bar} && err_exit "false failed"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinread <<!
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinhello world
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin!
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin[[ $REPLY = 'hello world' ]] || err_exit "read builtin failed"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinprint x:y | IFS=: read a b
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinif [[ $a != x ]]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinthen err_exit "IFS=: read ... not working"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinread <<!
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinhello \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinworld
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin!
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin[[ $REPLY = 'hello world' ]] || err_exit "read continuation failed"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinread -d x <<!
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinhello worldxfoobar
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin!
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin[[ $REPLY = 'hello world' ]] || err_exit "read builtin failed"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinread <<\!
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinhello \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin world \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin!
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin[[ $REPLY == 'hello world' ]] || err_exit "read continuation2 failed"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinprint "one\ntwo" | { read line
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin print $line | /bin/cat > /dev/null
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin read line
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinread <<\!
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968china\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinb
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin!
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinif [[ $REPLY != ab ]]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinthen err_exit "read multiple continuation failed"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinif [[ $line != two ]]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinthen err_exit "read from pipeline failed"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinline=two
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinread line < /dev/null
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinif [[ $line != "" ]]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinthen err_exit "read from /dev/null failed"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinif [[ $(print -R -) != - ]]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinthen err_exit "print -R not working correctly"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinif [[ $(print -- -) != - ]]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinthen err_exit "print -- not working correctly"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinprint -f "hello%nbar\n" size > /dev/null
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinif (( size != 5 ))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinthen err_exit "%n format of printf not working"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinprint -n -u2 2>&1-
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin[[ -w /dev/fd/1 ]] || err_exit "2<&1- with built-ins has side effects"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinx=$0
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinif [[ $(eval 'print $0') != $x ]]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinthen err_exit '$0 not correct for eval'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin$SHELL -c 'read x <<< hello' 2> /dev/null || err_exit 'syntax <<< not recognized'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin($SHELL -c 'read x[1] <<< hello') 2> /dev/null || err_exit 'read x[1] not working'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinunset x
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinreadonly x
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinset -- $(readonly)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinif [[ " $@ " != *" x "* ]]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinthen err_exit 'unset readonly variables are not displayed'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinif [[ $( for i in foo bar
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin do print $i
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin continue 10
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin done
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ) != $'foo\nbar' ]]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinthen err_exit 'continue breaks out of loop'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin(continue bad 2>/dev/null && err_exit 'continue bad should return an error')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin(break bad 2>/dev/null && err_exit 'break bad should return an error')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin(continue 0 2>/dev/null && err_exit 'continue 0 should return an error')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin(break 0 2>/dev/null && err_exit 'break 0 should return an error')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinbreakfun() { break;}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chincontinuefun() { continue;}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfor fun in break continue
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chindo if [[ $( for i in foo
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin do ${fun}fun
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin print $i
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin done
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ) != foo ]]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin then err_exit "$fun call in ${fun}fun breaks out of for loop"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chindone
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinif [[ $(print -f "%b" "\a\n\v\b\r\f\E\03\\oo") != $'\a\n\v\b\r\f\E\03\\oo' ]]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinthen err_exit 'print -f "%b" not working'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinif [[ $(print -f "%P" "[^x].*b\$") != '*[!x]*b' ]]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinthen err_exit 'print -f "%P" not working'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinif [[ $(abc: for i in foo bar;do print $i;break abc;done) != foo ]]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinthen err_exit 'break labels not working'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinif [[ $(command -v if) != if ]]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinthen err_exit 'command -v not working'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinread -r var <<\!
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin!
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinif [[ $var != "" ]]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinthen err_exit "read -r of blank line not working"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzmkdir -p $tmp/a/b/c 2>/dev/null || err_exit "mkdir -p failed"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz$SHELL -c "cd $tmp/a/b; cd c" 2>/dev/null || err_exit "initial script relative cd fails"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainztrap 'print TERM' TERM
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzexp=$'trap -- \'print TERM\' TERM\ntrap -- \'cd /; rm -rf '$tmp$'\' EXIT'
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzgot=$(trap)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz[[ $got == $exp ]] || err_exit "\$(trap) failed -- expected \"$exp\", got \"$got\""
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzexp='print TERM'
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzgot=$(trap -p TERM)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz[[ $got == $exp ]] || err_exit "\$(trap -p TERM) failed -- expected \"$exp\", got \"$got\""
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin[[ $($SHELL -c 'trap "print ok" SIGTERM; kill -s SIGTERM $$' 2> /dev/null) == ok ]] || err_exit 'SIGTERM not recognized'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin[[ $($SHELL -c 'trap "print ok" sigterm; kill -s sigterm $$' 2> /dev/null) == ok ]] || err_exit 'SIGTERM not recognized'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin[[ $($SHELL -c '( trap "" TERM);kill $$;print bad' == bad) ]] 2> /dev/null && err_exit 'trap ignored in subshell causes it to be ignored by parent'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin${SHELL} -c 'kill -1 -$$' 2> /dev/null
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz[[ $(kill -l $?) == HUP ]] || err_exit 'kill -1 -pid not working'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin${SHELL} -c 'kill -1 -$$' 2> /dev/null
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz[[ $(kill -l $?) == HUP ]] || err_exit 'kill -n1 -pid not working'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin${SHELL} -c 'kill -s HUP -$$' 2> /dev/null
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz[[ $(kill -l $?) == HUP ]] || err_exit 'kill -HUP -pid not working'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinn=123
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chintypeset -A base
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinbase[o]=8#
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinbase[x]=16#
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinbase[X]=16#
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfor i in d i o u x X
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chindo if (( $(( ${base[$i]}$(printf "%$i" $n) )) != n ))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin then err_exit "printf %$i not working"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chindone
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinif [[ $( trap 'print done' EXIT) != done ]]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinthen err_exit 'trap on EXIT not working'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinif [[ $( trap 'print done' EXIT; trap - EXIT) == done ]]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinthen err_exit 'trap on EXIT not being cleared'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinif [[ $(type test) != 'test is a shell builtin' ]]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinthen err_exit 'whence -v test not a builtin'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinbuiltin -d test
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinif [[ $(type test) == *builtin* ]]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinthen err_exit 'whence -v test after builtin -d incorrect'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chintypeset -Z3 percent=$(printf '%o\n' "'%'")
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinforrmat=\\${percent}s
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinif [[ $(printf "$forrmat") != %s ]]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinthen err_exit "printf $forrmat not working"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinif (( $(printf 'x\0y' | wc -c) != 3 ))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinthen err_exit 'printf \0 not working'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinif [[ $(printf "%bx%s\n" 'f\to\cbar') != $'f\to' ]]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinthen err_exit 'printf %bx%s\n not working'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinalpha=abcdefghijklmnop
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinif [[ $(printf "%10.*s\n" 5 $alpha) != ' abcde' ]]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinthen err_exit 'printf %10.%s\n not working'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfloat x2=.0000625
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinif [[ $(printf "%10.5E\n" x2) != 6.25000E-05 ]]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinthen err_exit 'printf "%10.5E" not normalizing correctly'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinx2=.000000001
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinif [[ $(printf "%g\n" x2 2>/dev/null) != 1e-09 ]]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinthen err_exit 'printf "%g" not working correctly'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#FIXME#($SHELL read -s foobar <<\!
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#FIXME#testing
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#FIXME#!
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#FIXME#) 2> /dev/null || err_exit ksh read -s var fails
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinif [[ $(printf +3 2>/dev/null) != +3 ]]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinthen err_exit 'printf is not processing formats beginning with + correctly'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinif printf "%d %d\n" 123bad 78 >/dev/null 2>/dev/null
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinthen err_exit "printf not exiting non-zero with conversion errors"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinif [[ $(trap --version 2> /dev/null;print done) != done ]]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinthen err_exit 'trap builtin terminating after --version'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinif [[ $(set --version 2> /dev/null;print done) != done ]]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinthen err_exit 'set builtin terminating after --veresion'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinunset -f foobar
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfunction foobar
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin print 'hello world'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinOPTIND=1
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinif [[ $(getopts $'[+?X\ffoobar\fX]' v --man 2>&1) != *'Xhello world'X* ]]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinthen err_exit '\f...\f not working in getopts usage strings'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzif [[ $(printf '%H\n' $'<>"& \'\tabc') != '&lt;&gt;&quot;&amp;&nbsp;&apos;&#9;abc' ]]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinthen err_exit 'printf %H not working'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzif [[ $(printf '%R %R %R %R\n' 'a.b' '*.c' '^' '!(*.*)') != '^a\.b$ \.c$ ^\^$ ^(.*\..*)!$' ]]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinthen err_exit 'printf %R not working'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinif [[ $(printf '%..:c\n' abc) != a:b:c ]]
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzthen err_exit "printf '%..:c' not working"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinif [[ $(printf '%..*c\n' : abc) != a:b:c ]]
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzthen err_exit "printf '%..*c' not working"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinif [[ $(printf '%..:s\n' abc def ) != abc:def ]]
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzthen err_exit "printf '%..:s' not working"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinif [[ $(printf '%..*s\n' : abc def) != abc:def ]]
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzthen err_exit "printf '%..*s' not working"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin[[ $(printf '%q\n') == '' ]] || err_exit 'printf "%q" with missing arguments'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# we won't get hit by the one second boundary twice, right?
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin[[ $(printf '%T\n' now) == "$(date)" ]] ||
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin[[ $(printf '%T\n' now) == "$(date)" ]] ||
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinerr_exit 'printf "%T" now'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinbehead()
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin read line
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin left=$(cat)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinprint $'line1\nline2' | behead
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinif [[ $left != line2 ]]
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzthen err_exit "read reading ahead on a pipe"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzread -n1 y <<!
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzabc
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz!
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzexp=a
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzif [[ $y != $exp ]]
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzthen err_exit "read -n1 failed -- expected '$exp', got '$y'"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzfi
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzprint -n $'{ read -r line;print $line;}\nhello' > $tmp/script
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzchmod 755 $tmp/script
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzif [[ $($SHELL < $tmp/script) != hello ]]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinthen err_exit 'read of incomplete line not working correctly'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinset -f
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinset -- *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinif [[ $1 != '*' ]]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinthen err_exit 'set -f not working'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinunset pid1 pid2
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfalse &
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinpid1=$!
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinpid2=$(
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin wait $pid1
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin (( $? == 127 )) || err_exit "job known to subshell"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin print $!
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinwait $pid1
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin(( $? == 1 )) || err_exit "wait not saving exit value"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinwait $pid2
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin(( $? == 127 )) || err_exit "subshell job known to parent"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinenv=
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzv=$(getconf LIBPATH)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzfor v in ${v//,/ }
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzdo v=${v#*:}
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz v=${v%%:*}
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz eval [[ \$$v ]] && env="$env $v=\"\$$v\""
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chindone
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinif [[ $(foo=bar; eval foo=\$foo $env exec -c \$SHELL -c \'print \$foo\') != bar ]]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinthen err_exit '"name=value exec -c ..." not working'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin$SHELL -c 'OPTIND=-1000000; getopts a opt -a' 2> /dev/null
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin[[ $? == 1 ]] || err_exit 'getopts with negative OPTIND not working'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chingetopts 'n#num' opt -n 3
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin[[ $OPTARG == 3 ]] || err_exit 'getopts with numerical arguments failed'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinif [[ $($SHELL -c $'printf \'%2$s %1$s\n\' world hello') != 'hello world' ]]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinthen err_exit 'printf %2$s %1$s not working'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinval=$(( 'C' ))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinset -- \
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin "'C" $val 0 \
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin "'C'" $val 0 \
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin '"C' $val 0 \
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin '"C"' $val 0 \
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin "'CX" $val 1 \
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin "'CX'" $val 1 \
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin "'C'X" $val 1 \
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin '"CX' $val 1 \
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin '"CX"' $val 1 \
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin '"C"X' $val 1
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinwhile (( $# >= 3 ))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chindo arg=$1 val=$2 code=$3
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin shift 3
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin for fmt in '%d' '%g'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin do out=$(printf "$fmt" "$arg" 2>/dev/null)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin err=$(printf "$fmt" "$arg" 2>&1 >/dev/null)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin printf "$fmt" "$arg" >/dev/null 2>&1
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ret=$?
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz [[ $out == $val ]] || err_exit "printf $fmt $arg failed -- expected '$val', got '$out'"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if (( $code ))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin then [[ $err ]] || err_exit "printf $fmt $arg failed, error message expected"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin else [[ $err ]] && err_exit "$err: printf $fmt $arg failed, error message not expected -- got '$err'"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin fi
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin (( $ret == $code )) || err_exit "printf $fmt $arg failed -- expected exit code $code, got $ret"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin done
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chindone
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin((n=0))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin((n++)); ARGC[$n]=1 ARGV[$n]=""
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin((n++)); ARGC[$n]=2 ARGV[$n]="-a"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin((n++)); ARGC[$n]=4 ARGV[$n]="-a -v 2"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin((n++)); ARGC[$n]=4 ARGV[$n]="-a -v 2 x"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin((n++)); ARGC[$n]=4 ARGV[$n]="-a -v 2 x y"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfor ((i=1; i<=n; i++))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chindo set -- ${ARGV[$i]}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin OPTIND=0
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while getopts -a tst "av:" OPT
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin do :
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin done
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if [[ $OPTIND != ${ARGC[$i]} ]]
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin then err_exit "\$OPTIND after getopts loop incorrect -- expected ${ARGC[$i]}, got $OPTIND"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chindone
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinoptions=ab:c
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinoptarg=foo
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinset -- -a -b $optarg -c bar
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinwhile getopts $options opt
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chindo case $opt in
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin a|c) [[ $OPTARG ]] && err_exit "getopts $options \$OPTARG for flag $opt failed, expected \"\", got \"$OPTARG\"" ;;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin b) [[ $OPTARG == $optarg ]] || err_exit "getopts $options \$OPTARG failed -- \"$optarg\" expected, got \"$OPTARG\"" ;;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin *) err_exit "getopts $options failed -- got flag $opt" ;;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin esac
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chindone
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzunset a
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz{ read -N3 a; read -N1 b;} <<!
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzabcdefg
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz!
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzexp=abc
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz[[ $a == $exp ]] || err_exit "read -N3 here-document failed -- expected '$exp', got '$a'"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzexp=d
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz[[ $b == $exp ]] || err_exit "read -N1 here-document failed -- expected '$exp', got '$b'"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzread -n3 a <<!
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzabcdefg
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz!
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzexp=abc
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz[[ $a == $exp ]] || err_exit "read -n3 here-document failed -- expected '$exp', got '$a'"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#(print -n a;sleep 1; print -n bcde) | { read -N3 a; read -N1 b;}
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#[[ $a == $exp ]] || err_exit "read -N3 from pipe failed -- expected '$exp', got '$a'"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#exp=d
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#[[ $b == $exp ]] || err_exit "read -N1 from pipe failed -- expected '$exp', got '$b'"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#(print -n a;sleep 1; print -n bcde) | read -n3 a
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#exp=a
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#[[ $a == $exp ]] || err_exit "read -n3 from pipe failed -- expected '$exp', got '$a'"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#rm -f $tmp/fifo
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#if mkfifo $tmp/fifo 2> /dev/null
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#then (print -n a; sleep 1;print -n bcde) > $tmp/fifo &
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# {
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# read -u5 -n3 -t2 a || err_exit 'read -n3 from fifo timedout'
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# read -u5 -n1 -t2 b || err_exit 'read -n1 from fifo timedout'
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# } 5< $tmp/fifo
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# exp=a
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# [[ $a == $exp ]] || err_exit "read -n3 from fifo failed -- expected '$exp', got '$a'"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# rm -f $tmp/fifo
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# mkfifo $tmp/fifo 2> /dev/null
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# (print -n a; sleep 1;print -n bcde) > $tmp/fifo &
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# {
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# read -u5 -N3 -t2 a || err_exit 'read -N3 from fifo timed out'
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# read -u5 -N1 -t2 b || err_exit 'read -N1 from fifo timedout'
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# } 5< $tmp/fifo
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# exp=abc
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# [[ $a == $exp ]] || err_exit "read -N3 from fifo failed -- expected '$exp', got '$a'"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# exp=d
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# [[ $b == $exp ]] || err_exit "read -N1 from fifo failed -- expected '$exp', got '$b'"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#fi
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#rm -f $tmp/fifo
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfunction longline
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin integer i
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for((i=0; i < $1; i++))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin do print argument$i
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin done
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# test command -x option
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chininteger sum=0 n=10000
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinif ! ${SHELL:-ksh} -c 'print $#' count $(longline $n) > /dev/null 2>&1
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinthen for i in $(command command -x ${SHELL:-ksh} -c 'print $#;[[ $1 != argument0 ]]' count $(longline $n) 2> /dev/null)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin do ((sum += $i))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin done
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin (( sum == n )) || err_exit "command -x processed only $sum arguments"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin command -p command -x ${SHELL:-ksh} -c 'print $#;[[ $1 == argument0 ]]' count $(longline $n) > /dev/null 2>&1
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin [[ $? != 1 ]] && err_exit 'incorrect exit status for command -x'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# test command -x option with extra arguments
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chininteger sum=0 n=10000
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinif ! ${SHELL:-ksh} -c 'print $#' count $(longline $n) > /dev/null 2>&1
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinthen for i in $(command command -x ${SHELL:-ksh} -c 'print $#;[[ $1 != argument0 ]]' count $(longline $n) one two three) #2> /dev/null)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin do ((sum += $i))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin done
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin (( sum > n )) || err_exit "command -x processed only $sum arguments"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin (( (sum-n)%3==0 )) || err_exit "command -x processed only $sum arguments"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin (( sum == n+3)) && err_exit "command -x processed only $sum arguments"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin command -p command -x ${SHELL:-ksh} -c 'print $#;[[ $1 == argument0 ]]' count $(longline $n) > /dev/null 2>&1
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin [[ $? != 1 ]] && err_exit 'incorrect exit status for command -x'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# test for debug trap
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin[[ $(typeset -i i=0
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin trap 'print $i' DEBUG
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (( i <2))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin do (( i++))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin done) == $'0\n0\n1\n1\n2' ]] || err_exit "DEBUG trap not working"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chingetconf UNIVERSE - ucb
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin[[ $($SHELL -c 'echo -3') == -3 ]] || err_exit "echo -3 not working in ucb universe"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chintypeset -F3 start_x=SECONDS total_t delay=0.02
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chintypeset reps=50 leeway=5
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#sleep $(( 2 * leeway * reps * delay )) |
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#for (( i=0 ; i < reps ; i++ ))
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#do read -N1 -t $delay
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#done
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#(( total_t = SECONDS - start_x ))
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#if (( total_t > leeway * reps * delay ))
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#then err_exit "read -t in pipe taking $total_t secs - $(( reps * delay )) minimum - too long"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#elif (( total_t < reps * delay ))
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#then err_exit "read -t in pipe taking $total_t secs - $(( reps * delay )) minimum - too fast"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#fi
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#$SHELL -c 'sleep $(printf "%a" .95)' 2> /dev/null || err_exit "sleep doesn't except %a format constants"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#$SHELL -c 'test \( ! -e \)' 2> /dev/null ; [[ $? == 1 ]] || err_exit 'test \( ! -e \) not working'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin[[ $(ulimit) == "$(ulimit -fS)" ]] || err_exit 'ulimit is not the same as ulimit -fS'
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainztmpfile=$tmp/file.2
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinprint $'\nprint -r -- "${.sh.file} ${LINENO} ${.sh.lineno}"' > $tmpfile
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin[[ $( . "$tmpfile") == "$tmpfile 2 1" ]] || err_exit 'dot command not working'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinprint -r -- "'xxx" > $tmpfile
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin[[ $($SHELL -c ". $tmpfile"$'\n print ok' 2> /dev/null) == ok ]] || err_exit 'syntax error in dot command affects next command'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#float sec=$SECONDS del=4
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#exec 3>&2 2>/dev/null
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#$SHELL -c "( sleep 1; kill -ALRM \$\$ ) & sleep $del" 2> /dev/null
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#exitval=$?
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#(( sec = SECONDS - sec ))
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#exec 2>&3-
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#(( exitval )) && err_exit "sleep doesn't exit 0 with ALRM interupt"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#(( sec > (del - 1) )) || err_exit "ALRM signal causes sleep to terminate prematurely -- expected 3 sec, got $sec"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainztypeset -r z=3
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzy=5
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzfor i in 123 z %x a.b.c
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzdo ( unset $i) 2>/dev/null && err_exit "unset $i should fail"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzdone
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainza=()
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzfor i in y y y[8] t[abc] y.d a.b a
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzdo unset $i || print -u2 "err_exit unset $i should not fail"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzdone
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz[[ $($SHELL -c 'y=3; unset 123 y;print $?$y') == 1 ]] 2> /dev/null || err_exit 'y is not getting unset with unset 123 y'
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz[[ $($SHELL -c 'trap foo TERM; (trap;(trap) )') == 'trap -- foo TERM' ]] || err_exit 'traps not getting reset when subshell is last process'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinexit $((Errors))