17c2fbfb3SApril Chin# 27c2fbfb3SApril Chin# CDDL HEADER START 37c2fbfb3SApril Chin# 47c2fbfb3SApril Chin# The contents of this file are subject to the terms of the 57c2fbfb3SApril Chin# Common Development and Distribution License (the "License"). 67c2fbfb3SApril Chin# You may not use this file except in compliance with the License. 77c2fbfb3SApril Chin# 87c2fbfb3SApril Chin# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 97c2fbfb3SApril Chin# or http://www.opensolaris.org/os/licensing. 107c2fbfb3SApril Chin# See the License for the specific language governing permissions 117c2fbfb3SApril Chin# and limitations under the License. 127c2fbfb3SApril Chin# 137c2fbfb3SApril Chin# When distributing Covered Code, include this CDDL HEADER in each 147c2fbfb3SApril Chin# file and include the License file at usr/src/OPENSOLARIS.LICENSE. 157c2fbfb3SApril Chin# If applicable, add the following below this CDDL HEADER, with the 167c2fbfb3SApril Chin# fields enclosed by brackets "[]" replaced with your own identifying 177c2fbfb3SApril Chin# information: Portions Copyright [yyyy] [name of copyright owner] 187c2fbfb3SApril Chin# 197c2fbfb3SApril Chin# CDDL HEADER END 207c2fbfb3SApril Chin# 217c2fbfb3SApril Chin 227c2fbfb3SApril Chin# 233e14f97fSRoger A. Faulkner# Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved. 247c2fbfb3SApril Chin# 257c2fbfb3SApril Chin 2634f9b3eeSRoland Mainz# test setup 277c2fbfb3SApril Chinfunction err_exit 287c2fbfb3SApril Chin{ 297c2fbfb3SApril Chin print -u2 -n "\t" 307c2fbfb3SApril Chin print -u2 -r ${Command}[$1]: "${@:2}" 313e14f97fSRoger A. Faulkner (( Errors < 127 && Errors++ )) 327c2fbfb3SApril Chin} 337c2fbfb3SApril Chinalias err_exit='err_exit $LINENO' 347c2fbfb3SApril Chin 3534f9b3eeSRoland Mainz# "nounset" disabled for now 3634f9b3eeSRoland Mainz#set -o nounset 3734f9b3eeSRoland MainzCommand=${0##*/} 3834f9b3eeSRoland Mainzinteger Errors=0 3934f9b3eeSRoland Mainz 4034f9b3eeSRoland Mainzcompound bracketstat=( 417c2fbfb3SApril Chin integer bopen=0 427c2fbfb3SApril Chin integer bclose=0 437c2fbfb3SApril Chin) 447c2fbfb3SApril Chin 457c2fbfb3SApril Chinfunction count_brackets 467c2fbfb3SApril Chin{ 477c2fbfb3SApril Chin typeset x="$1" 487c2fbfb3SApril Chin typeset c 497c2fbfb3SApril Chin 507c2fbfb3SApril Chin integer i 517c2fbfb3SApril Chin (( bracketstat.bopen=0 , bracketstat.bclose=0 )) 527c2fbfb3SApril Chin 537c2fbfb3SApril Chin for (( i=0 ; i < ${#x} ; i++ )) ; do 547c2fbfb3SApril Chin c="${x:i:1}" 557c2fbfb3SApril Chin [[ "$c" == "(" ]] && (( bracketstat.bopen++ )) 567c2fbfb3SApril Chin [[ "$c" == ")" ]] && (( bracketstat.bclose++ )) 577c2fbfb3SApril Chin done 58*b30d1939SAndy Fiddaman 597c2fbfb3SApril Chin (( bracketstat.bopen != bracketstat.bclose )) && return 1 60*b30d1939SAndy Fiddaman 617c2fbfb3SApril Chin return 0 627c2fbfb3SApril Chin} 637c2fbfb3SApril Chin 6434f9b3eeSRoland Mainz# compound variable "cat" nr.1, using $ print "%B\n" ... # 6534f9b3eeSRoland Mainzfunction cpvcat1 6634f9b3eeSRoland Mainz{ 6734f9b3eeSRoland Mainz set -o errexit 6834f9b3eeSRoland Mainz compound tmp 69*b30d1939SAndy Fiddaman 7034f9b3eeSRoland Mainz while read -C tmp ; do printf "%B\n" tmp ; done 7134f9b3eeSRoland Mainz return 0 7234f9b3eeSRoland Mainz} 7334f9b3eeSRoland Mainz 7434f9b3eeSRoland Mainz# compound variable "cat" nr.2, using $ print "%#B\n" ... # 7534f9b3eeSRoland Mainzfunction cpvcat2 7634f9b3eeSRoland Mainz{ 7734f9b3eeSRoland Mainz set -o errexit 7834f9b3eeSRoland Mainz compound tmp 79*b30d1939SAndy Fiddaman 8034f9b3eeSRoland Mainz while read -C tmp ; do printf "%#B\n" tmp ; done 8134f9b3eeSRoland Mainz return 0 8234f9b3eeSRoland Mainz} 8334f9b3eeSRoland Mainz 8434f9b3eeSRoland Mainz# compound variable "cat" nr.3, using $ print -C ... # 8534f9b3eeSRoland Mainzfunction cpvcat3 8634f9b3eeSRoland Mainz{ 8734f9b3eeSRoland Mainz set -o errexit 8834f9b3eeSRoland Mainz compound tmp 89*b30d1939SAndy Fiddaman 9034f9b3eeSRoland Mainz while read -C tmp ; do print -C tmp ; done 9134f9b3eeSRoland Mainz return 0 9234f9b3eeSRoland Mainz} 9334f9b3eeSRoland Mainz 9434f9b3eeSRoland Mainz# compound variable "cat" nr.4, using $ print -v ... # 9534f9b3eeSRoland Mainzfunction cpvcat4 9634f9b3eeSRoland Mainz{ 9734f9b3eeSRoland Mainz set -o errexit 9834f9b3eeSRoland Mainz compound tmp 99*b30d1939SAndy Fiddaman 10034f9b3eeSRoland Mainz while read -C tmp ; do print -v tmp ; done 10134f9b3eeSRoland Mainz return 0 10234f9b3eeSRoland Mainz} 1037c2fbfb3SApril Chin 1047c2fbfb3SApril Chintypeset s 1057c2fbfb3SApril Chin 1067c2fbfb3SApril Chin# Test 1: 1077c2fbfb3SApril Chin# Check whether "read -C" leaves the file pointer at the next line 1087c2fbfb3SApril Chin# (and does not read beyond that point). 1097c2fbfb3SApril Chin# Data layout is: 1107c2fbfb3SApril Chin# -- snip -- 1117c2fbfb3SApril Chin# <compound var> 1127c2fbfb3SApril Chin# hello 1137c2fbfb3SApril Chin# -- snip -- 1147c2fbfb3SApril Chin# (additionally we test some extra stuff like bracket count) 1157c2fbfb3SApril Chins=${ 11634f9b3eeSRoland Mainz compound x=( 1177c2fbfb3SApril Chin a=1 b=2 1187c2fbfb3SApril Chin typeset -a myarray=( 1 2 3 4 5 6 7 8 9 10 ) 1197c2fbfb3SApril Chin typeset -A myarray2=( [a]=1 [b]=2 ["c d"]=3 [e]=4 ["f"]=5 [g]=6 [h]=7 [i]=8 [j]=9 [k]=10 ) 1207c2fbfb3SApril Chin typeset -A myarray3=( 1217c2fbfb3SApril Chin [a]=( 1227c2fbfb3SApril Chin float m1=0.5 1237c2fbfb3SApril Chin float m2=0.6 1247c2fbfb3SApril Chin foo="hello" 1257c2fbfb3SApril Chin ) 1267c2fbfb3SApril Chin [b]=( 1277c2fbfb3SApril Chin foo="bar" 1287c2fbfb3SApril Chin ) 1297c2fbfb3SApril Chin ["c d"]=( 1307c2fbfb3SApril Chin integer at=90 1317c2fbfb3SApril Chin ) 1327c2fbfb3SApril Chin [e]=( 13334f9b3eeSRoland Mainz compound nested_cpv=( 1347c2fbfb3SApril Chin typeset -a myarray=( 1 2 3 4 5 6 7 8 9 10 ) 1357c2fbfb3SApril Chin typeset str=$'a \'string' 1367c2fbfb3SApril Chin ) 1377c2fbfb3SApril Chin ) 1387c2fbfb3SApril Chin [f]=( 1397c2fbfb3SApril Chin typeset g="f" 1407c2fbfb3SApril Chin ) 14134f9b3eeSRoland Mainz [a_nan]=( 14234f9b3eeSRoland Mainz float my_nan=-nan 14334f9b3eeSRoland Mainz ) 14434f9b3eeSRoland Mainz [a_hexfloat]=( 14534f9b3eeSRoland Mainz typeset -X my_hexfloat=1.1 14634f9b3eeSRoland Mainz ) 1477c2fbfb3SApril Chin ) 1487c2fbfb3SApril Chin ) 1497c2fbfb3SApril Chin 1507c2fbfb3SApril Chin { 1517c2fbfb3SApril Chin printf "%B\n" x 1527c2fbfb3SApril Chin print "hello" 15334f9b3eeSRoland Mainz } | cpvcat1 | cpvcat2 | cpvcat3 | cpvcat4 | { 1547c2fbfb3SApril Chin read -C y 1557c2fbfb3SApril Chin read s 1567c2fbfb3SApril Chin } 1577c2fbfb3SApril Chin print "x${s}x" 1587c2fbfb3SApril Chin} || err_exit "test returned exit code $?" 1597c2fbfb3SApril Chin 1607c2fbfb3SApril Chin[[ "${s}" == "xhellox" ]] || err_exit "Expected 'xhellox', got ${s}" 1617c2fbfb3SApril Chincount_brackets "$y" || err_exit "y: bracket open ${bracketstat.bopen} != bracket close ${bracketstat.bclose}" 16234f9b3eeSRoland Mainzcount_brackets "$(print -v y)" || err_exit "y: bracket open ${bracketstat.bopen} != bracket close ${bracketstat.bclose}" 16334f9b3eeSRoland Mainzcount_brackets "$(print -C y)" || err_exit "y: bracket open ${bracketstat.bopen} != bracket close ${bracketstat.bclose}" 1647c2fbfb3SApril Chin 1657c2fbfb3SApril Chin# cleanup 1667c2fbfb3SApril Chinunset x y || err_exit "unset failed" 1677c2fbfb3SApril Chin[[ "$x" == "" ]] || err_exit "cleanup failed for x" 1687c2fbfb3SApril Chin[[ "$y" == "" ]] || err_exit "cleanup failed for y" 1697c2fbfb3SApril Chin 1707c2fbfb3SApril Chin 1717c2fbfb3SApril Chin# Test 2: 1727c2fbfb3SApril Chin# Same as test 1 except one more compound var following the "hello" 1737c2fbfb3SApril Chin# line. 1747c2fbfb3SApril Chin# Data layout is: 1757c2fbfb3SApril Chin# -- snip -- 1767c2fbfb3SApril Chin# <compound var> 1777c2fbfb3SApril Chin# hello 1787c2fbfb3SApril Chin# <compound var> 1797c2fbfb3SApril Chin# -- snip -- 1807c2fbfb3SApril Chins=${ 18134f9b3eeSRoland Mainz compound x=( 1827c2fbfb3SApril Chin a=1 b=2 1837c2fbfb3SApril Chin typeset -a myarray=( 1 2 3 4 5 6 7 8 9 10 ) 1847c2fbfb3SApril Chin typeset -A myarray2=( [a]=1 [b]=2 ["c d"]=3 [e]=4 ["f"]=5 [g]=6 [h]=7 [i]=8 [j]=9 [k]=10 ) 18534f9b3eeSRoland Mainz compound -A myarray3=( 1867c2fbfb3SApril Chin [a]=( 1877c2fbfb3SApril Chin float m1=0.5 1887c2fbfb3SApril Chin float m2=0.6 1897c2fbfb3SApril Chin foo="hello" 1907c2fbfb3SApril Chin ) 1917c2fbfb3SApril Chin [b]=( 1927c2fbfb3SApril Chin foo="bar" 1937c2fbfb3SApril Chin ) 1947c2fbfb3SApril Chin ["c d"]=( 1957c2fbfb3SApril Chin integer at=90 1967c2fbfb3SApril Chin ) 1977c2fbfb3SApril Chin [e]=( 19834f9b3eeSRoland Mainz compound nested_cpv=( 1997c2fbfb3SApril Chin typeset -a myarray=( 1 2 3 4 5 6 7 8 9 10 ) 2007c2fbfb3SApril Chin typeset str=$'a \'string' 2017c2fbfb3SApril Chin ) 2027c2fbfb3SApril Chin ) 2037c2fbfb3SApril Chin [f]=( 2047c2fbfb3SApril Chin typeset g="f" 2057c2fbfb3SApril Chin ) 20634f9b3eeSRoland Mainz [a_nan]=( 20734f9b3eeSRoland Mainz float my_nan=-nan 20834f9b3eeSRoland Mainz ) 20934f9b3eeSRoland Mainz [a_hexfloat]=( 21034f9b3eeSRoland Mainz typeset -X my_hexfloat=1.1 21134f9b3eeSRoland Mainz ) 2127c2fbfb3SApril Chin ) 2137c2fbfb3SApril Chin ) 2147c2fbfb3SApril Chin 2157c2fbfb3SApril Chin { 2167c2fbfb3SApril Chin printf "%B\n" x 2177c2fbfb3SApril Chin print "hello" 2187c2fbfb3SApril Chin printf "%B\n" x 21934f9b3eeSRoland Mainz } | cpvcat1 | cpvcat2 | cpvcat3 | cpvcat4 | { 2207c2fbfb3SApril Chin read -C y1 2217c2fbfb3SApril Chin read s 2227c2fbfb3SApril Chin read -C y2 2237c2fbfb3SApril Chin } 224*b30d1939SAndy Fiddaman 2257c2fbfb3SApril Chin print "x${s}x" 2267c2fbfb3SApril Chin} || err_exit "test returned exit code $?" 2277c2fbfb3SApril Chin 2287c2fbfb3SApril Chin[[ "${s}" == "xhellox" ]] || err_exit "Expected 'xhellox', got ${s}." 22934f9b3eeSRoland Mainz[[ "${y1.myarray3[b].foo}" == "bar" ]] || err_exit "y1.myarray3[b].foo != bar" 23034f9b3eeSRoland Mainz[[ "${y2.myarray3[b].foo}" == "bar" ]] || err_exit "y2.myarray3[b].foo != bar" 2317c2fbfb3SApril Chin[[ "$y1" != "" ]] || err_exit "y1 is empty" 2327c2fbfb3SApril Chin[[ "$y2" != "" ]] || err_exit "y2 is empty" 23334f9b3eeSRoland Mainz(( ${#y1.myarray3[e].nested_cpv.myarray[@]} == 10 )) || err_exit "Expected 10 elements in y1.myarray3[e].nested_cpv, got ${#y1.myarray3[e].nested_cpv[@]}" 23434f9b3eeSRoland Mainz(( ${#y2.myarray3[e].nested_cpv.myarray[@]} == 10 )) || err_exit "Expected 10 elements in y2.myarray3[e].nested_cpv, got ${#y2.myarray3[e].nested_cpv[@]}" 23534f9b3eeSRoland Mainz(( isnan(y1.myarray3[a_nan].my_nan) )) || err_exit "y1.myarray3[a_nan].my_nan not a NaN" 23634f9b3eeSRoland Mainz(( isnan(y2.myarray3[a_nan].my_nan) )) || err_exit "y2.myarray3[a_nan].my_nan not a NaN" 23734f9b3eeSRoland Mainz(( signbit(y1.myarray3[a_nan].my_nan) )) || err_exit "y1.myarray3[a_nan].my_nan not negative" 23834f9b3eeSRoland Mainz(( signbit(y2.myarray3[a_nan].my_nan) )) || err_exit "y2.myarray3[a_nan].my_nan not negative" 2397c2fbfb3SApril Chincount_brackets "$y1" || err_exit "y1: bracket open ${bracketstat.bopen} != bracket close ${bracketstat.bclose}" 24034f9b3eeSRoland Mainzcount_brackets "$(print -v y1)" || err_exit "y1: bracket open ${bracketstat.bopen} != bracket close ${bracketstat.bclose}" 24134f9b3eeSRoland Mainzcount_brackets "$(print -C y1)" || err_exit "y1: bracket open ${bracketstat.bopen} != bracket close ${bracketstat.bclose}" 2427c2fbfb3SApril Chincount_brackets "$y2" || err_exit "y2: bracket open ${bracketstat.bopen} != bracket close ${bracketstat.bclose}" 24334f9b3eeSRoland Mainzcount_brackets "$(print -v y2)" || err_exit "y2: bracket open ${bracketstat.bopen} != bracket close ${bracketstat.bclose}" 24434f9b3eeSRoland Mainzcount_brackets "$(print -C y2)" || err_exit "y2: bracket open ${bracketstat.bopen} != bracket close ${bracketstat.bclose}" 2457c2fbfb3SApril Chin[[ "$y1" == "$y2" ]] || err_exit "Expected $(printf "%q\n" "${y1}") == $(printf "%q\n" "${y2}")." 2467c2fbfb3SApril Chin[[ "$x" == "$y1" ]] || err_exit "Expected $(printf "%q\n" "${x}") == $(printf "%q\n" "${y}")." 2477c2fbfb3SApril Chin 2487c2fbfb3SApril Chin# cleanup 2497c2fbfb3SApril Chinunset x y1 y2 || err_exit "unset failed" 2507c2fbfb3SApril Chin[[ "$x" == "" ]] || err_exit "cleanup failed for x" 2517c2fbfb3SApril Chin[[ "$y1" == "" ]] || err_exit "cleanup failed for y1" 2527c2fbfb3SApril Chin[[ "$y2" == "" ]] || err_exit "cleanup failed for y2" 2537c2fbfb3SApril Chin 2547c2fbfb3SApril Chin 2557c2fbfb3SApril Chin# Test 3: Test compound variable copy operator vs. "read -C" 25634f9b3eeSRoland Mainzcompound x=( 2577c2fbfb3SApril Chin a=1 b=2 2587c2fbfb3SApril Chin typeset -a myarray=( 1 2 3 4 5 6 7 8 9 10 ) 2597c2fbfb3SApril Chin typeset -A myarray2=( [a]=1 [b]=2 ["c d"]=3 [e]=4 ["f"]=5 [g]=6 [h]=7 [i]=8 [j]=9 [k]=10 ) 26034f9b3eeSRoland Mainz compound -A myarray3=( 2617c2fbfb3SApril Chin [a]=( 2627c2fbfb3SApril Chin float m1=0.5 2637c2fbfb3SApril Chin float m2=0.6 2647c2fbfb3SApril Chin foo="hello" 2657c2fbfb3SApril Chin ) 2667c2fbfb3SApril Chin [b]=( 2677c2fbfb3SApril Chin foo="bar" 2687c2fbfb3SApril Chin ) 2697c2fbfb3SApril Chin ["c d"]=( 2707c2fbfb3SApril Chin integer at=90 2717c2fbfb3SApril Chin ) 2727c2fbfb3SApril Chin [e]=( 27334f9b3eeSRoland Mainz compound nested_cpv=( 2747c2fbfb3SApril Chin typeset -a myarray=( 1 2 3 4 5 6 7 8 9 10 ) 2757c2fbfb3SApril Chin typeset str=$'a \'string' 2767c2fbfb3SApril Chin ) 2777c2fbfb3SApril Chin ) 2787c2fbfb3SApril Chin [f]=( 2797c2fbfb3SApril Chin typeset g="f" 2807c2fbfb3SApril Chin ) 28134f9b3eeSRoland Mainz [a_nan]=( 28234f9b3eeSRoland Mainz float my_nan=-nan 28334f9b3eeSRoland Mainz ) 28434f9b3eeSRoland Mainz [a_hexfloat]=( 28534f9b3eeSRoland Mainz typeset -X my_hexfloat=1.1 28634f9b3eeSRoland Mainz ) 2877c2fbfb3SApril Chin ) 2887c2fbfb3SApril Chin) 2897c2fbfb3SApril Chin 29034f9b3eeSRoland Mainzcompound x_copy=x || err_exit "x_copy copy failed" 2917c2fbfb3SApril Chin[[ "${x_copy}" != "" ]] || err_exit "x_copy should not be empty" 2927c2fbfb3SApril Chincount_brackets "${x_copy}" || err_exit "x_copy: bracket open ${bracketstat.bopen} != bracket close ${bracketstat.bclose}" 29334f9b3eeSRoland Mainzcount_brackets "$(print -v x_copy)" || err_exit "x_copy: bracket open ${bracketstat.bopen} != bracket close ${bracketstat.bclose}" 29434f9b3eeSRoland Mainzcount_brackets "$(print -C x_copy)" || err_exit "x_copy: bracket open ${bracketstat.bopen} != bracket close ${bracketstat.bclose}" 2957c2fbfb3SApril Chin 29634f9b3eeSRoland Mainzcompound nested_cpv_copy 2977c2fbfb3SApril Chin 2987c2fbfb3SApril Chinnested_cpv_copy=x.myarray3[e].nested_cpv || err_exit "x.myarray3[e].nested_cpv copy failed" 29934f9b3eeSRoland Mainz(( ${#nested_cpv_copy.myarray[@]} == 10 )) || err_exit "Expected 10 elements in nested_cpv_copy.myarray, got ${#nested_cpv_copy.myarray[@]}" 3007c2fbfb3SApril Chin 3017c2fbfb3SApril Chin# unset branch "x.myarray3[e].nested_cpv" of the variable tree "x" ... 3027c2fbfb3SApril Chinunset x.myarray3[e].nested_cpv || err_exit "unset x.myarray3[e].nested_cpv failed" 3037c2fbfb3SApril Chin[[ "${x.myarray3[e].nested_cpv}" == "" ]] || err_exit "x.myarray3[e].nested_cpv still has a value" 3047c2fbfb3SApril Chin 3057c2fbfb3SApril Chin# ... and restore it from the saved copy 30634f9b3eeSRoland Mainzprintf "%B\n" nested_cpv_copy | cpvcat1 | cpvcat2 | cpvcat3 | cpvcat4 | read -C x.myarray3[e].nested_cpv || err_exit "read failed" 3077c2fbfb3SApril Chin 3087c2fbfb3SApril Chin# compare copy of the original tree and the modified one 3097c2fbfb3SApril Chin[[ "${x}" == "${x_copy}" ]] || err_exit "x != x_copy" 3107c2fbfb3SApril Chincount_brackets "${x}" || err_exit "x: bracket open ${bracketstat.bopen} != bracket close ${bracketstat.bclose}" 31134f9b3eeSRoland Mainzcount_brackets "$(print -v x)" || err_exit "x: bracket open ${bracketstat.bopen} != bracket close ${bracketstat.bclose}" 31234f9b3eeSRoland Mainzcount_brackets "$(print -C x)" || err_exit "x: bracket open ${bracketstat.bopen} != bracket close ${bracketstat.bclose}" 31334f9b3eeSRoland Mainz(( ${#x.myarray3[e].nested_cpv.myarray[@]} == 10 )) || err_exit "Expected 10 elements in x.myarray3[e].nested_cpv, got ${#x.myarray3[e].nested_cpv[@]}" 31434f9b3eeSRoland Mainz(( isnan(x.myarray3[a_nan].my_nan) )) || err_exit "x.myarray3[a_nan].my_nan not a NaN" 31534f9b3eeSRoland Mainz(( signbit(x.myarray3[a_nan].my_nan) )) || err_exit "x.myarray3[a_nan].my_nan not negative" 3167c2fbfb3SApril Chin 3177c2fbfb3SApril Chin# cleanup 3187c2fbfb3SApril Chinunset x x_copy nested_cpv_copy || err_exit "unset failed" 3197c2fbfb3SApril Chin 3207c2fbfb3SApril Chin 3217c2fbfb3SApril Chin# Test 4: Test "read -C" failure for missing bracket at the end 3227c2fbfb3SApril Chintypeset s 32334f9b3eeSRoland Mainzs=$($SHELL -c 'compound myvar ; print "( unfinished=1" | read -C myvar 2>/dev/null || print "error $?"') || err_exit "shell failed" 3247c2fbfb3SApril Chin[[ "$s" == "error 3" ]] || err_exit "compound_read: expected error 3, got ${s}" 3257c2fbfb3SApril Chin 3267c2fbfb3SApril Chin 3277c2fbfb3SApril Chin# Test 5: Test "read -C" failure for missing bracket at the beginning 3287c2fbfb3SApril Chintypeset s 32934f9b3eeSRoland Mainzs=$($SHELL -c 'compound myvar ; print " unfinished=1 )" | read -C myvar 2>/dev/null || print "error $?"') || err_exit "shell failed" 3307c2fbfb3SApril Chin[[ "$s" == "error 3" ]] || err_exit "compound_read: expected error 3, got ${s}" 3317c2fbfb3SApril Chin 33234f9b3eeSRoland Mainz 3337c2fbfb3SApril Chin# tests done 3347c2fbfb3SApril Chinexit $((Errors)) 335