diff --git a/src/cmd/ksh93/tests/variables.sh b/src/cmd/ksh93/tests/variables.sh index 45aa0895c..45a5defde 100755 --- a/src/cmd/ksh93/tests/variables.sh +++ b/src/cmd/ksh93/tests/variables.sh @@ -34,46 +34,60 @@ fi # When the $RANDOM variable is used in a forked subshell, it shouldn't # use the same pseudorandom seed as the main shell. # https://github.com/ksh93/ksh/issues/285 +# These tests sometimes fail as duplicate numbers can occur randomly, so try up to $N times. +integer N=3 i rand1 rand2 RANDOM=123 function rand_print { ulimit -t unlimited 2> /dev/null print $RANDOM } -integer rand1=$(rand_print) -integer rand2=$(rand_print) +for((i=0; i /dev/null - test $RANDOM - print $RANDOM -) -integer rand2=${ print $RANDOM ;} +for((i=0; i /dev/null + test $RANDOM + print $RANDOM + ) + rand2=${ print $RANDOM ;} + ((rand1 != rand2)) && break +done (( rand1 == rand2 )) && err_exit "Test 2: \$RANDOM seed in subshell doesn't change" \ "(both results are $rand1)" # $RANDOM should be reseeded when the final command is inside of a subshell -rand1=$($SHELL -c 'RANDOM=1; (echo $RANDOM)') -rand2=$($SHELL -c 'RANDOM=1; (echo $RANDOM)') +for((i=0; ir1 -( echo $RANDOM & ) >r2 -integer giveup=0 -trap '((giveup++))' USR1 -(sleep 2; kill -s USR1 $$) & -while [[ ! -s r1 || ! -s r2 ]] -do ((giveup)) && break +for((i=0; i|r1 + ( echo $RANDOM & ) >|r2 + integer giveup=0 + trap '((giveup++))' USR1 + (sleep 2; kill -s USR1 $$) & + while [[ ! -s r1 || ! -s r2 ]] + do ((giveup)) && break + done + if ((giveup)) + then err_exit "Test 4: ( echo $RANDOM & ) does not write output" + fi + kill $! 2>/dev/null + trap - USR1 + unset giveup + [[ $(/dev/null -trap - USR1 -unset giveup +[[ $(