1 1.6 gutterid # $NetBSD: t_cmdsub.sh,v 1.6 2023/05/11 00:32:48 gutteridge Exp $ 2 1.1 christos # 3 1.1 christos # Copyright (c) 2016 The NetBSD Foundation, Inc. 4 1.1 christos # All rights reserved. 5 1.1 christos # 6 1.1 christos # Redistribution and use in source and binary forms, with or without 7 1.1 christos # modification, are permitted provided that the following conditions 8 1.1 christos # are met: 9 1.1 christos # 1. Redistributions of source code must retain the above copyright 10 1.1 christos # notice, this list of conditions and the following disclaimer. 11 1.1 christos # 2. Redistributions in binary form must reproduce the above copyright 12 1.1 christos # notice, this list of conditions and the following disclaimer in the 13 1.1 christos # documentation and/or other materials provided with the distribution. 14 1.1 christos # 15 1.1 christos # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 16 1.1 christos # ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 17 1.1 christos # TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 18 1.1 christos # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 19 1.1 christos # BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 20 1.1 christos # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 21 1.1 christos # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 22 1.1 christos # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 23 1.1 christos # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 24 1.1 christos # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 25 1.1 christos # POSSIBILITY OF SUCH DAMAGE. 26 1.1 christos # 27 1.1 christos # the implementation of "sh" to test 28 1.1 christos : ${TEST_SH:="/bin/sh"} 29 1.1 christos 30 1.1 christos # 31 1.1 christos # This file tests command substitutions ( `...` and $( ... ) ) 32 1.1 christos # 33 1.1 christos # CAUTION: 34 1.1 christos # Be careful attempting running these tests outside the ATF environment 35 1.1 christos # Some of the tests run "rm *" in the current directory to clean up 36 1.1 christos # An ATF test directory should be empty already, outside ATF, anything 37 1.1 christos 38 1.1 christos atf_test_case a_basic_cmdsub 39 1.1 christos a_basic_cmdsub_head() { 40 1.1 christos atf_set "descr" 'Test operation of simple $( ) substitutions' 41 1.1 christos } 42 1.1 christos a_basic_cmdsub_body() { 43 1.1 christos atf_check -s exit:0 -o match:'Result is true today' -e empty \ 44 1.1 christos ${TEST_SH} -c \ 45 1.1 christos 'echo Result is $( true && echo true || echo false ) today' 46 1.1 christos 47 1.1 christos atf_check -s exit:0 -o match:'Result is false today' -e empty \ 48 1.1 christos ${TEST_SH} -c \ 49 1.1 christos 'echo Result is $( false && echo true || echo false ) today' 50 1.1 christos 51 1.1 christos atf_check -s exit:0 -o match:'aaabbbccc' -e empty \ 52 1.1 christos ${TEST_SH} -c 'echo aaa$( echo bbb )ccc' 53 1.1 christos atf_check -s exit:0 -o match:'aaabbb cccddd' -e empty \ 54 1.1 christos ${TEST_SH} -c 'echo aaa$( echo bbb ccc )ddd' 55 1.1 christos atf_check -s exit:0 -o inline:'aaabbb cccddd\n' -e empty \ 56 1.1 christos ${TEST_SH} -c 'echo aaa$( echo bbb; echo ccc )ddd' 57 1.1 christos atf_check -s exit:0 -o inline:'aaabbb\ncccddd\n' -e empty \ 58 1.1 christos ${TEST_SH} -c 'echo "aaa$( echo bbb; echo ccc )ddd"' 59 1.1 christos 60 1.1 christos atf_check -s exit:0 -o inline:'some string\n' -e empty \ 61 1.1 christos ${TEST_SH} -c 'X=$( echo some string ); echo "$X"' 62 1.1 christos atf_check -s exit:0 -o inline:'weird; string *\n' -e empty \ 63 1.1 christos ${TEST_SH} -c 'X=$( echo "weird; string *" ); echo "$X"' 64 1.1 christos 65 1.1 christos rm -f * 2>/dev/null || : 66 1.1 christos for f in file-1 file-2 67 1.1 christos do 68 1.1 christos cp /dev/null "$f" 69 1.1 christos done 70 1.1 christos 71 1.1 christos atf_check -s exit:0 -o match:'Found file-1 file-2' -e empty \ 72 1.1 christos ${TEST_SH} -c 'echo Found $( echo * )' 73 1.1 christos atf_check -s exit:0 -o match:'Found file-1 file-2' -e empty \ 74 1.1 christos ${TEST_SH} -c 'echo Found "$( echo * )"' 75 1.1 christos atf_check -s exit:0 -o match:'Found file-1 file-2' -e empty \ 76 1.1 christos ${TEST_SH} -c 'echo Found $('" echo '*' )" 77 1.1 christos atf_check -s exit:0 -o match:'Found \*' -e empty \ 78 1.1 christos ${TEST_SH} -c 'echo Found "$('" echo '*' "')"' 79 1.1 christos atf_check -s exit:0 -o match:'Found file-1 file-2' -e empty \ 80 1.1 christos ${TEST_SH} -c 'echo Found $('" echo \\* )" 81 1.1 christos atf_check -s exit:0 -o match:'Found \*' -e empty \ 82 1.1 christos ${TEST_SH} -c 'echo Found "$('" echo \\* )"\" 83 1.1 christos } 84 1.1 christos 85 1.1 christos atf_test_case b_basic_backticks 86 1.1 christos b_basic_backticks_head() { 87 1.1 christos atf_set "descr" 'Test operation of old style ` ` substitutions' 88 1.1 christos } 89 1.1 christos b_basic_backticks_body() { 90 1.1 christos atf_check -s exit:0 -o match:'Result is true today' -e empty \ 91 1.1 christos ${TEST_SH} -c \ 92 1.1 christos 'echo Result is `true && echo true || echo false` today' 93 1.1 christos 94 1.1 christos atf_check -s exit:0 -o match:'Result is false today' -e empty \ 95 1.1 christos ${TEST_SH} -c \ 96 1.1 christos 'echo Result is `false && echo true || echo false` today' 97 1.1 christos 98 1.1 christos atf_check -s exit:0 -o match:'aaabbbccc' -e empty \ 99 1.1 christos ${TEST_SH} -c 'echo aaa` echo bbb `ccc' 100 1.1 christos atf_check -s exit:0 -o match:'aaabbb cccddd' -e empty \ 101 1.1 christos ${TEST_SH} -c 'echo aaa` echo bbb ccc `ddd' 102 1.1 christos atf_check -s exit:0 -o inline:'aaabbb cccddd\n' -e empty \ 103 1.1 christos ${TEST_SH} -c 'echo aaa` echo bbb; echo ccc `ddd' 104 1.1 christos atf_check -s exit:0 -o inline:'aaabbb\ncccddd\n' -e empty \ 105 1.1 christos ${TEST_SH} -c 'echo "aaa` echo bbb; echo ccc `ddd"' 106 1.1 christos 107 1.1 christos atf_check -s exit:0 -o inline:'some string\n' -e empty \ 108 1.1 christos ${TEST_SH} -c 'X=` echo some string `; echo "$X"' 109 1.1 christos atf_check -s exit:0 -o inline:'weird; string *\n' -e empty \ 110 1.1 christos ${TEST_SH} -c 'X=` echo "weird; string *" `; echo "$X"' 111 1.1 christos 112 1.1 christos rm -f * 2>/dev/null || : 113 1.1 christos for f in file-1 file-2 114 1.1 christos do 115 1.1 christos cp /dev/null "$f" 116 1.1 christos done 117 1.1 christos 118 1.1 christos atf_check -s exit:0 -o match:'Found file-1 file-2' -e empty \ 119 1.1 christos ${TEST_SH} -c 'echo Found ` echo * `' 120 1.1 christos atf_check -s exit:0 -o match:'Found file-1 file-2' -e empty \ 121 1.1 christos ${TEST_SH} -c 'echo Found "` echo * `"' 122 1.1 christos atf_check -s exit:0 -o match:'Found file-1 file-2' -e empty \ 123 1.1 christos ${TEST_SH} -c 'echo Found `'" echo '*' "'`' 124 1.1 christos atf_check -s exit:0 -o match:'Found \*' -e empty \ 125 1.1 christos ${TEST_SH} -c 'echo Found "`'" echo '*' "'`"' 126 1.1 christos atf_check -s exit:0 -o match:'Found file-1 file-2' -e empty \ 127 1.1 christos ${TEST_SH} -c 'echo Found `'" echo \\* "'`' 128 1.1 christos atf_check -s exit:0 -o match:'Found \*' -e empty \ 129 1.1 christos ${TEST_SH} -c 'echo Found "`'" echo \\* "'`"' 130 1.1 christos } 131 1.1 christos 132 1.1 christos atf_test_case c_nested_cmdsub 133 1.1 christos c_nested_cmdsub_head() { 134 1.1 christos atf_set "descr" "Test that cmd substitutions can be nested" 135 1.1 christos } 136 1.1 christos c_nested_cmdsub_body() { 137 1.1 christos atf_check -s exit:0 -o match:'__foobarbletch__' -e empty \ 138 1.1 christos ${TEST_SH} -c 'echo __$( echo foo$(echo bar)bletch )__' 139 1.1 christos atf_check -s exit:0 -o match:'_abcde_' -e empty \ 140 1.1 christos ${TEST_SH} -c 'echo _$(echo a$(echo $(echo b)c$(echo d))e )_' 141 1.1 christos atf_check -s exit:0 -o match:'123454321' -e empty \ 142 1.1 christos ${TEST_SH} -c 'echo 1$(echo 2$(echo 3$(echo 4$(echo 5)4)3)2)1' 143 1.1 christos } 144 1.1 christos 145 1.1 christos atf_test_case d_nested_backticks 146 1.1 christos d_nested_backticks_head() { 147 1.1 christos atf_set "descr" "Tests that old style backtick cmd subs can be nested" 148 1.1 christos } 149 1.1 christos d_nested_backticks_body() { 150 1.1 christos atf_check -s exit:0 -o match:'__foobarbletch__' -e empty \ 151 1.1 christos ${TEST_SH} -c 'echo __` echo foo\`echo bar\`bletch `__' 152 1.1 christos atf_check -s exit:0 -o match:'_abcde_' -e empty \ 153 1.1 christos ${TEST_SH} -c \ 154 1.1 christos 'echo _`echo a\`echo \\\`echo b\\\`c\\\`echo d\\\`\`e `_' 155 1.1 christos atf_check -s exit:0 -o match:'123454321' -e empty \ 156 1.1 christos ${TEST_SH} -c \ 157 1.1 christos 'echo 1`echo 2\`echo 3\\\`echo 4\\\\\\\`echo 5\\\\\\\`4\\\`3\`2`1' 158 1.1 christos } 159 1.1 christos 160 1.1 christos atf_test_case e_perverse_mixing 161 1.1 christos e_perverse_mixing_head() { 162 1.1 christos atf_set "descr" \ 163 1.1 christos "Checks various mixed new and old style cmd substitutions" 164 1.1 christos } 165 1.1 christos e_perverse_mixing_body() { 166 1.1 christos atf_check -s exit:0 -o match:'__foobarbletch__' -e empty \ 167 1.1 christos ${TEST_SH} -c 'echo __$( echo foo`echo bar`bletch )__' 168 1.1 christos atf_check -s exit:0 -o match:'__foobarbletch__' -e empty \ 169 1.1 christos ${TEST_SH} -c 'echo __` echo foo$(echo bar)bletch `__' 170 1.1 christos atf_check -s exit:0 -o match:'_abcde_' -e empty \ 171 1.1 christos ${TEST_SH} -c 'echo _$(echo a`echo $(echo b)c$(echo d)`e )_' 172 1.1 christos atf_check -s exit:0 -o match:'_abcde_' -e empty \ 173 1.1 christos ${TEST_SH} -c 'echo _`echo a$(echo \`echo b\`c\`echo d\`)e `_' 174 1.1 christos atf_check -s exit:0 -o match:'12345654321' -e empty \ 175 1.1 christos ${TEST_SH} -c \ 176 1.1 christos 'echo 1`echo 2$(echo 3\`echo 4\\\`echo 5$(echo 6)5\\\`4\`3)2`1' 177 1.1 christos } 178 1.1 christos 179 1.1 christos atf_test_case f_redirect_in_cmdsub 180 1.1 christos f_redirect_in_cmdsub_head() { 181 1.1 christos atf_set "descr" "Checks that redirects work in command substitutions" 182 1.1 christos } 183 1.1 christos f_redirect_in_cmdsub_body() { 184 1.2 christos atf_require_prog cat 185 1.2 christos atf_require_prog rm 186 1.2 christos 187 1.1 christos rm -f file 2>/dev/null || : 188 1.1 christos atf_check -s exit:0 -o match:'_aa_' -e empty \ 189 1.1 christos ${TEST_SH} -c 'echo _$( echo a$( echo b > file )a)_' 190 1.1 christos atf_check -s exit:0 -o match:b -e empty ${TEST_SH} -c 'cat file' 191 1.1 christos atf_check -s exit:0 -o match:'_aba_' -e empty \ 192 1.1 christos ${TEST_SH} -c 'echo _$( echo a$( cat < file )a)_' 193 1.1 christos atf_check -s exit:0 -o match:'_aa_' -e empty \ 194 1.1 christos ${TEST_SH} -c 'echo _$( echo a$( echo d >> file )a)_' 195 1.1 christos atf_check -s exit:0 -o inline:'b\nd\n' -e empty ${TEST_SH} -c 'cat file' 196 1.1 christos atf_check -s exit:0 -o match:'_aa_' -e match:'not error' \ 197 1.1 christos ${TEST_SH} -c 'echo _$( echo a$( echo not error >&2 )a)_' 198 1.1 christos } 199 1.1 christos 200 1.1 christos atf_test_case g_redirect_in_backticks 201 1.1 christos g_redirect_in_backticks_head() { 202 1.1 christos atf_set "descr" "Checks that redirects work in old style cmd sub" 203 1.1 christos } 204 1.1 christos g_redirect_in_backticks_body() { 205 1.2 christos atf_require_prog cat 206 1.2 christos atf_require_prog rm 207 1.2 christos 208 1.1 christos rm -f file 2>/dev/null || : 209 1.1 christos atf_check -s exit:0 -o match:'_aa_' -e empty \ 210 1.1 christos ${TEST_SH} -c 'echo _` echo a\` echo b > file \`a`_' 211 1.1 christos atf_check -s exit:0 -o match:b -e empty ${TEST_SH} -c 'cat file' 212 1.1 christos atf_check -s exit:0 -o match:'_aba_' -e empty \ 213 1.1 christos ${TEST_SH} -c 'echo _` echo a\` cat < file \`a`_' 214 1.1 christos atf_check -s exit:0 -o match:'_aa_' -e empty \ 215 1.1 christos ${TEST_SH} -c 'echo _` echo a\` echo d >> file \`a`_' 216 1.1 christos atf_check -s exit:0 -o inline:'b\nd\n' -e empty ${TEST_SH} -c 'cat file' 217 1.1 christos atf_check -s exit:0 -o match:'_aa_' -e match:'not error' \ 218 1.1 christos ${TEST_SH} -c 'echo _` echo a\` echo not error >&2 \`a`_' 219 1.1 christos } 220 1.1 christos 221 1.1 christos atf_test_case h_vars_in_cmdsub 222 1.1 christos h_vars_in_cmdsub_head() { 223 1.1 christos atf_set "descr" "Check that variables work in command substitutions" 224 1.1 christos } 225 1.1 christos h_vars_in_cmdsub_body() { 226 1.1 christos atf_check -s exit:0 -o match:'__abc__' -e empty \ 227 1.1 christos ${TEST_SH} -c 'X=abc; echo __$( echo ${X} )__' 228 1.1 christos atf_check -s exit:0 -o match:'__abc__' -e empty \ 229 1.1 christos ${TEST_SH} -c 'X=abc; echo __$( echo "${X}" )__' 230 1.1 christos atf_check -s exit:0 -o match:'__abc__' -e empty \ 231 1.1 christos ${TEST_SH} -c 'X=abc; echo "__$( echo ${X} )__"' 232 1.1 christos atf_check -s exit:0 -o match:'__abc__' -e empty \ 233 1.1 christos ${TEST_SH} -c 'X=abc; echo "__$( echo "${X}" )__"' 234 1.1 christos 235 1.1 christos atf_check -s exit:0 -o inline:'a\n\nb\n\nc\n' -e empty \ 236 1.1 christos ${TEST_SH} -c "for X in a '' b '' c"'; do echo $( echo "$X" ); done' 237 1.1 christos 238 1.1 christos atf_check -s exit:0 -o match:'__acd__' -e empty \ 239 1.1 christos ${TEST_SH} -c 'X=; unset Y; echo "__$( echo a${X-b}${Y-c}d)__"' 240 1.1 christos atf_check -s exit:0 -o match:'__abcd__' -e empty \ 241 1.1 christos ${TEST_SH} -c 'X=; unset Y; echo "__$( echo a${X:-b}${Y:-c}d)__"' 242 1.1 christos atf_check -s exit:0 -o match:'__XYX__' -e empty \ 243 1.1 christos ${TEST_SH} -c 'X=X; echo "__${X}$( X=Y; echo ${X} )${X}__"' 244 1.1 christos atf_check -s exit:0 -o match:'__def__' -e empty \ 245 1.1 christos ${TEST_SH} -c 'X=abc; echo "__$(X=def; echo "${X}" )__"' 246 1.1 christos atf_check -s exit:0 -o inline:'abcdef\nabc\n' -e empty \ 247 1.1 christos ${TEST_SH} -c 'X=abc; echo "$X$(X=def; echo ${X} )"; echo $X' 248 1.1 christos } 249 1.1 christos 250 1.1 christos atf_test_case i_vars_in_backticks 251 1.1 christos i_vars_in_backticks_head() { 252 1.1 christos atf_set "descr" "Checks that variables work in old style cmd sub" 253 1.1 christos } 254 1.1 christos i_vars_in_backticks_body() { 255 1.1 christos atf_check -s exit:0 -o match:'__abc__' -e empty \ 256 1.1 christos ${TEST_SH} -c 'X=abc; echo __` echo ${X} `__' 257 1.1 christos atf_check -s exit:0 -o match:'__abc__' -e empty \ 258 1.1 christos ${TEST_SH} -c 'X=abc; echo __` echo "${X}" `__' 259 1.1 christos atf_check -s exit:0 -o match:'__abc__' -e empty \ 260 1.1 christos ${TEST_SH} -c 'X=abc; echo "__` echo ${X} `__"' 261 1.1 christos atf_check -s exit:0 -o match:'__abc__' -e empty \ 262 1.1 christos ${TEST_SH} -c 'X=abc; echo "__` echo \"${X}\" `__"' 263 1.1 christos 264 1.1 christos atf_check -s exit:0 -o inline:'a\n\nb\n\nc\n' -e empty \ 265 1.1 christos ${TEST_SH} -c "for X in a '' b '' c"'; do echo $( echo "$X" ); done' 266 1.1 christos 267 1.1 christos atf_check -s exit:0 -o match:'__acd__' -e empty \ 268 1.1 christos ${TEST_SH} -c 'X=; unset Y; echo "__$( echo a${X-b}${Y-c}d)__"' 269 1.1 christos atf_check -s exit:0 -o match:'__abcd__' -e empty \ 270 1.1 christos ${TEST_SH} -c 'X=; unset Y; echo "__$( echo a${X:-b}${Y:-c}d)__"' 271 1.1 christos atf_check -s exit:0 -o match:'__XYX__' -e empty \ 272 1.1 christos ${TEST_SH} -c 'X=X; echo "__${X}$( X=Y; echo ${X} )${X}__"' 273 1.1 christos atf_check -s exit:0 -o inline:'abcdef\nabc\n' -e empty \ 274 1.1 christos ${TEST_SH} -c 'X=abc; echo "$X`X=def; echo \"${X}\" `";echo $X' 275 1.1 christos 276 1.1 christos # The following is nonsense, so is not included ... 277 1.1 christos # atf_check -s exit:0 -o match:'__abc__' -e empty \ 278 1.1 christos # oV cV oV cV 279 1.1 christos # ${TEST_SH} -c 'X=abc; echo "__`X=def echo "${X}" `__"' 280 1.1 christos # `start in " ^ " ends, ` not yet 281 1.1 christos } 282 1.1 christos 283 1.1 christos atf_test_case j_cmdsub_in_varexpand 284 1.1 christos j_cmdsub_in_varexpand_head() { 285 1.1 christos atf_set "descr" "Checks that command sub can be used in var expansion" 286 1.1 christos } 287 1.1 christos j_cmdsub_in_varexpand_body() { 288 1.1 christos atf_check -s exit:0 -o match:'foo' -e empty \ 289 1.1 christos ${TEST_SH} -c 'X=set; echo ${X+$(echo foo)}' 290 1.1 christos atf_check -s exit:0 -o match:'set' -e empty \ 291 1.1 christos ${TEST_SH} -c 'X=set; echo ${X-$(echo foo)}' 292 1.1 christos rm -f bar 2>/dev/null || : 293 1.1 christos atf_check -s exit:0 -o match:'set' -e empty \ 294 1.1 christos ${TEST_SH} -c 'X=set; echo ${X-$(echo foo > bar)}' 295 1.1 christos test -f bar && atf_fail "bar should not exist, but does" 296 1.1 christos atf_check -s exit:0 -o inline:'\n' -e empty \ 297 1.1 christos ${TEST_SH} -c 'X=set; echo ${X+$(echo foo > bar)}' 298 1.1 christos test -f bar || atf_fail "bar should exist, but does not" 299 1.1 christos } 300 1.1 christos 301 1.1 christos atf_test_case k_backticks_in_varexpand 302 1.1 christos k_backticks_in_varexpand_head() { 303 1.1 christos atf_set "descr" "Checks that old style cmd sub works in var expansion" 304 1.1 christos } 305 1.1 christos k_backticks_in_varexpand_body() { 306 1.1 christos atf_check -s exit:0 -o match:'foo' -e empty \ 307 1.1 christos ${TEST_SH} -c 'X=set; echo ${X+`echo foo`}' 308 1.1 christos atf_check -s exit:0 -o match:'set' -e empty \ 309 1.1 christos ${TEST_SH} -c 'X=set; echo ${X-`echo foo`}' 310 1.1 christos rm -f bar 2>/dev/null || : 311 1.1 christos atf_check -s exit:0 -o match:'set' -e empty \ 312 1.1 christos ${TEST_SH} -c 'X=set; echo ${X-`echo foo > bar`}' 313 1.1 christos test -f bar && atf_fail "bar should not exist, but does" 314 1.1 christos atf_check -s exit:0 -o inline:'\n' -e empty \ 315 1.1 christos ${TEST_SH} -c 'X=set; echo ${X+`echo foo > bar`}' 316 1.1 christos test -f bar || atf_fail "bar should exist, but does not" 317 1.1 christos } 318 1.1 christos 319 1.1 christos atf_test_case l_arithmetic_in_cmdsub 320 1.1 christos l_arithmetic_in_cmdsub_head() { 321 1.1 christos atf_set "descr" "Checks that arithmetic works in cmd substitutions" 322 1.1 christos } 323 1.1 christos l_arithmetic_in_cmdsub_body() { 324 1.1 christos atf_check -s exit:0 -o inline:'1 + 1 = 2\n' -e empty \ 325 1.1 christos ${TEST_SH} -c 'echo 1 + 1 = $( echo $(( 1 + 1 )) )' 326 1.1 christos atf_check -s exit:0 -o inline:'X * Y = 6\n' -e empty \ 327 1.1 christos ${TEST_SH} -c 'X=2; Y=3; echo X \* Y = $( echo $(( X * Y )) )' 328 1.1 christos atf_check -s exit:0 -o inline:'Y % X = 1\n' -e empty \ 329 1.1 christos ${TEST_SH} -c 'X=2; Y=3; echo Y % X = $( echo $(( $Y % $X )) )' 330 1.1 christos } 331 1.1 christos 332 1.1 christos atf_test_case m_arithmetic_in_backticks 333 1.1 christos m_arithmetic_in_backticks_head() { 334 1.1 christos atf_set "descr" "Checks that arithmetic works in old style cmd sub" 335 1.1 christos } 336 1.1 christos m_arithmetic_in_backticks_body() { 337 1.1 christos atf_check -s exit:0 -o inline:'2 + 3 = 5\n' -e empty \ 338 1.1 christos ${TEST_SH} -c 'echo 2 + 3 = ` echo $(( 2 + 3 )) `' 339 1.1 christos atf_check -s exit:0 -o inline:'X * Y = 6\n' -e empty \ 340 1.1 christos ${TEST_SH} -c 'X=2; Y=3; echo X \* Y = ` echo $(( X * Y )) `' 341 1.1 christos atf_check -s exit:0 -o inline:'Y % X = 1\n' -e empty \ 342 1.1 christos ${TEST_SH} -c 'X=2; Y=3; echo Y % X = ` echo $(( $Y % $X )) `' 343 1.1 christos } 344 1.1 christos 345 1.1 christos atf_test_case n_cmdsub_in_arithmetic 346 1.1 christos n_cmdsub_in_arithmetic_head() { 347 1.1 christos atf_set "descr" "Tests uses of command substitutions in arithmetic" 348 1.1 christos } 349 1.1 christos n_cmdsub_in_arithmetic_body() { 350 1.1 christos atf_check -s exit:0 -o inline:'7\n' -e empty \ 351 1.1 christos ${TEST_SH} -c 'echo $(( $( echo 3 ) $( echo + ) $( echo 4 ) ))' 352 1.1 christos atf_check -s exit:0 -o inline:'11\n7\n18\n4\n1\n' -e empty \ 353 1.1 christos ${TEST_SH} -c \ 354 1.1 christos 'for op in + - \* / % 355 1.1 christos do 356 1.1 christos echo $(( $( echo 9 ) $( echo "${op}" ) $( echo 2 ) )) 357 1.1 christos done' 358 1.1 christos } 359 1.1 christos 360 1.1 christos atf_test_case o_backticks_in_arithmetic 361 1.1 christos o_backticks_in_arithmetic_head() { 362 1.1 christos atf_set "descr" "Tests old style cmd sub used in arithmetic" 363 1.1 christos } 364 1.1 christos o_backticks_in_arithmetic_body() { 365 1.1 christos atf_check -s exit:0 -o inline:'33\n' -e empty \ 366 1.1 christos ${TEST_SH} -c 'echo $(( `echo 77` `echo -` `echo 44`))' 367 1.1 christos atf_check -s exit:0 -o inline:'14\n8\n33\n3\n2\n' -e empty \ 368 1.1 christos ${TEST_SH} -c \ 369 1.1 christos 'for op in + - \* / % 370 1.1 christos do 371 1.1 christos echo $((`echo 11``echo "${op}"``echo 3`)) 372 1.1 christos done' 373 1.1 christos } 374 1.1 christos 375 1.1 christos atf_test_case p_cmdsub_in_heredoc 376 1.1 christos p_cmdsub_in_heredoc_head() { 377 1.1 christos atf_set "descr" "Checks that cmdsubs work inside a here document" 378 1.1 christos } 379 1.1 christos p_cmdsub_in_heredoc_body() { 380 1.2 christos atf_require_prog cat 381 1.2 christos 382 1.1 christos atf_check -s exit:0 -o inline:'line 1+1\nline 2\nline 3\n' -e empty \ 383 1.1 christos ${TEST_SH} -c \ 384 1.1 christos 'cat <<- EOF 385 1.1 christos $( echo line 1 )$( echo +1 ) 386 1.1 christos $( echo line 2;echo line 3 ) 387 1.1 christos EOF' 388 1.1 christos } 389 1.1 christos 390 1.1 christos atf_test_case q_backticks_in_heredoc 391 1.1 christos q_backticks_in_heredoc_head() { 392 1.1 christos atf_set "descr" "Checks that old style cmdsubs work in here docs" 393 1.1 christos } 394 1.1 christos q_backticks_in_heredoc_body() { 395 1.2 christos atf_require_prog cat 396 1.2 christos 397 1.1 christos atf_check -s exit:0 -o inline:'Mary had a\nlittle\nlamb\n' -e empty \ 398 1.1 christos ${TEST_SH} -c \ 399 1.1 christos 'cat <<- EOF 400 1.1 christos `echo Mary ` `echo had a ` 401 1.1 christos ` echo little; echo lamb ` 402 1.1 christos EOF' 403 1.1 christos } 404 1.1 christos 405 1.1 christos atf_test_case r_heredoc_in_cmdsub 406 1.1 christos r_heredoc_in_cmdsub_head() { 407 1.1 christos atf_set "descr" "Checks that here docs work inside cmd subs" 408 1.1 christos } 409 1.1 christos r_heredoc_in_cmdsub_body() { 410 1.2 christos atf_require_prog cat 411 1.2 christos 412 1.1 christos atf_check -s exit:0 -o inline:'Mary had a\nlittle\nlamb\n' -e empty \ 413 1.1 christos ${TEST_SH} -c 'echo "$( cat <<- \EOF 414 1.1 christos Mary had a 415 1.1 christos little 416 1.1 christos lamb 417 1.1 christos EOF 418 1.1 christos )"' 419 1.1 christos 420 1.1 christos atf_check -s exit:0 -e empty \ 421 1.1 christos -o inline:'Mary had 1\nlittle\nlamb\nMary had 4\nlittle\nlambs\n' \ 422 1.1 christos ${TEST_SH} -c 'for N in 1 4; do echo "$( cat <<- EOF 423 1.1 christos Mary had ${N} 424 1.1 christos little 425 1.1 christos lamb$( [ $N -gt 1 ] && echo s ) 426 1.1 christos EOF 427 1.1 christos )"; done' 428 1.1 christos 429 1.1 christos 430 1.1 christos atf_check -s exit:0 -o inline:'A Calculation:\n2 * 7 = 14\n' -e empty \ 431 1.1 christos ${TEST_SH} -c 'echo "$( cat <<- EOF 432 1.1 christos A Calculation: 433 1.1 christos 2 * 7 = $(( 2 * 7 )) 434 1.1 christos EOF 435 1.1 christos )"' 436 1.1 christos } 437 1.1 christos 438 1.1 christos atf_test_case s_heredoc_in_backticks 439 1.1 christos s_heredoc_in_backticks_head() { 440 1.1 christos atf_set "descr" "Checks that here docs work inside old style cmd subs" 441 1.1 christos } 442 1.1 christos s_heredoc_in_backticks_body() { 443 1.2 christos atf_require_prog cat 444 1.2 christos 445 1.1 christos atf_check -s exit:0 -o inline:'Mary had a little lamb\n' -e empty \ 446 1.1 christos ${TEST_SH} -c 'echo ` cat <<- \EOF 447 1.1 christos Mary had a 448 1.1 christos little 449 1.1 christos lamb 450 1.1 christos EOF 451 1.1 christos `' 452 1.1 christos 453 1.1 christos atf_check -s exit:0 -o inline:'A Calculation:\n17 / 3 = 5\n' -e empty \ 454 1.1 christos ${TEST_SH} -c 'echo "` cat <<- EOF 455 1.1 christos A Calculation: 456 1.1 christos 17 / 3 = $(( 17 / 3 )) 457 1.1 christos EOF 458 1.1 christos `"' 459 1.1 christos } 460 1.1 christos 461 1.1 christos atf_test_case t_nested_cmdsubs_in_heredoc 462 1.1 christos t_nested_cmdsubs_in_heredoc_head() { 463 1.1 christos atf_set "descr" "Checks nested command substitutions in here docs" 464 1.1 christos } 465 1.1 christos t_nested_cmdsubs_in_heredoc_body() { 466 1.2 christos atf_require_prog cat 467 1.2 christos atf_require_prog rm 468 1.2 christos 469 1.2 christos rm -f * 2>/dev/null || : 470 1.2 christos echo "Hello" > File 471 1.2 christos 472 1.2 christos atf_check -s exit:0 -o inline:'Hello U\nHelp me!\n' -e empty \ 473 1.2 christos ${TEST_SH} -c 'cat <<- EOF 474 1.2 christos $(cat File) U 475 1.2 christos $( V=$(cat File); echo "${V%lo}p" ) me! 476 1.2 christos EOF' 477 1.2 christos 478 1.2 christos rm -f * 2>/dev/null || : 479 1.2 christos echo V>V ; echo A>A; echo R>R 480 1.2 christos echo Value>VAR 481 1.2 christos 482 1.2 christos atf_check -s exit:0 -o inline:'$2.50\n' -e empty \ 483 1.2 christos ${TEST_SH} -c 'cat <<- EOF 484 1.2 christos $(Value='\''$2.50'\'';eval echo $(eval $(cat V)$(cat A)$(cat R)=\'\''\$$(cat $(cat V)$(cat A)$(cat R))\'\''; eval echo \$$(set -- *;echo ${3}${1}${2}))) 485 1.2 christos EOF' 486 1.1 christos } 487 1.1 christos 488 1.1 christos atf_test_case u_nested_backticks_in_heredoc 489 1.1 christos u_nested_backticks_in_heredoc_head() { 490 1.1 christos atf_set "descr" "Checks nested old style cmd subs in here docs" 491 1.1 christos } 492 1.1 christos u_nested_backticks_in_heredoc_body() { 493 1.2 christos atf_require_prog cat 494 1.2 christos atf_require_prog rm 495 1.2 christos 496 1.2 christos rm -f * 2>/dev/null || : 497 1.2 christos echo "Hello" > File 498 1.2 christos 499 1.2 christos atf_check -s exit:0 -o inline:'Hello U\nHelp me!\n' -e empty \ 500 1.2 christos ${TEST_SH} -c 'cat <<- EOF 501 1.2 christos `cat File` U 502 1.2 christos `V=\`cat File\`; echo "${V%lo}p" ` me! 503 1.2 christos EOF' 504 1.2 christos 505 1.2 christos rm -f * 2>/dev/null || : 506 1.2 christos echo V>V ; echo A>A; echo R>R 507 1.2 christos echo Value>VAR 508 1.2 christos 509 1.2 christos atf_check -s exit:0 -o inline:'$5.20\n' -e empty \ 510 1.2 christos ${TEST_SH} -c 'cat <<- EOF 511 1.2 christos `Value='\''$5.20'\'';eval echo \`eval \\\`cat V\\\`\\\`cat A\\\`\\\`cat R\\\`=\\\'\''\\\$\\\`cat \\\\\\\`cat V\\\\\\\`\\\\\\\`cat A\\\\\\\`\\\\\\\`cat R\\\\\\\`\\\`\\\'\''; eval echo \\\$\\\`set -- *;echo \\\\\${3}\\\\\${1}\\\\\${2}\\\`\`` 512 1.2 christos EOF' 513 1.1 christos } 514 1.1 christos 515 1.3 christos atf_test_case v_cmdsub_paren_tests 516 1.6 gutterid v_cmdsub_paren_tests_head() { 517 1.3 christos atf_set "descr" "tests with cmdsubs containing embedded ')'" 518 1.3 christos } 519 1.3 christos v_cmdsub_paren_tests_body() { 520 1.3 christos 521 1.3 christos # Tests from: 522 1.3 christos # http://www.in-ulm.de/~mascheck/various/cmd-subst/ 523 1.3 christos # (slightly modified.) 524 1.3 christos 525 1.3 christos atf_check -s exit:0 -o inline:'A.1\n' -e empty ${TEST_SH} -c \ 526 1.3 christos 'echo $( 527 1.3 christos case x in x) echo A.1;; esac 528 1.3 christos )' 529 1.3 christos 530 1.3 christos atf_check -s exit:0 -o inline:'A.2\n' -e empty ${TEST_SH} -c \ 531 1.3 christos 'echo $( 532 1.3 christos case x in x) echo A.2;; esac # comment 533 1.3 christos )' 534 1.3 christos 535 1.3 christos atf_check -s exit:0 -o inline:'A.3\n' -e empty ${TEST_SH} -c \ 536 1.3 christos 'echo $( 537 1.3 christos case x in (x) echo A.3;; esac 538 1.3 christos )' 539 1.3 christos 540 1.3 christos atf_check -s exit:0 -o inline:'A.4\n' -e empty ${TEST_SH} -c \ 541 1.3 christos 'echo $( 542 1.3 christos case x in (x) echo A.4;; esac # comment 543 1.3 christos )' 544 1.3 christos 545 1.3 christos atf_check -s exit:0 -o inline:'A.5\n' -e empty ${TEST_SH} -c \ 546 1.3 christos 'echo $( 547 1.3 christos case x in (x) echo A.5 548 1.3 christos esac 549 1.3 christos )' 550 1.3 christos 551 1.3 christos atf_check -s exit:0 -o inline:'B: quoted )\n' -e empty ${TEST_SH} -c \ 552 1.3 christos 'echo $( 553 1.3 christos echo '\''B: quoted )'\'' 554 1.3 christos )' 555 1.3 christos 556 1.3 christos atf_check -s exit:0 -o inline:'C: comment then closing paren\n' \ 557 1.3 christos -e empty ${TEST_SH} -c \ 558 1.3 christos 'echo $( 559 1.3 christos echo C: comment then closing paren # ) 560 1.3 christos )' 561 1.3 christos 562 1.3 christos atf_check -s exit:0 -o inline:'D.1: here-doc with )\n' \ 563 1.3 christos -e empty ${TEST_SH} -c \ 564 1.3 christos 'echo $( 565 1.3 christos cat <<-\eof 566 1.3 christos D.1: here-doc with ) 567 1.3 christos eof 568 1.3 christos )' 569 1.3 christos 570 1.3 christos # D.2 is a bogus test. 571 1.3 christos 572 1.3 christos atf_check -s exit:0 -o inline:'D.3: here-doc with \()\n' \ 573 1.3 christos -e empty ${TEST_SH} -c \ 574 1.3 christos 'echo $( 575 1.3 christos cat <<-\eof 576 1.3 christos D.3: here-doc with \() 577 1.3 christos eof 578 1.3 christos )' 579 1.3 christos 580 1.3 christos atf_check -s exit:0 -e empty \ 581 1.3 christos -o inline:'E: here-doc terminated with a parenthesis ("academic")\n' \ 582 1.3 christos ${TEST_SH} -c \ 583 1.3 christos 'echo $( 584 1.3 christos cat <<-\) 585 1.3 christos E: here-doc terminated with a parenthesis ("academic") 586 1.3 christos ) 587 1.3 christos )' 588 1.3 christos 589 1.3 christos atf_check -s exit:0 -e empty \ 590 1.3 christos -o inline:'F.1: here-doc embed with unbal single, back- or doublequote '\''\n' \ 591 1.3 christos ${TEST_SH} -c \ 592 1.3 christos 'echo $( 593 1.3 christos cat <<-"eof" 594 1.3 christos F.1: here-doc embed with unbal single, back- or doublequote '\'' 595 1.3 christos eof 596 1.3 christos )' 597 1.3 christos atf_check -s exit:0 -e empty \ 598 1.3 christos -o inline:'F.2: here-doc embed with unbal single, back- or doublequote "\n' \ 599 1.3 christos ${TEST_SH} -c \ 600 1.3 christos 'echo $( 601 1.3 christos cat <<-"eof" 602 1.3 christos F.2: here-doc embed with unbal single, back- or doublequote " 603 1.3 christos eof 604 1.3 christos )' 605 1.3 christos atf_check -s exit:0 -e empty \ 606 1.3 christos -o inline:'F.3: here-doc embed with unbal single, back- or doublequote `\n' \ 607 1.3 christos ${TEST_SH} -c \ 608 1.3 christos 'echo $( 609 1.3 christos cat <<-"eof" 610 1.3 christos F.3: here-doc embed with unbal single, back- or doublequote ` 611 1.3 christos eof 612 1.3 christos )' 613 1.3 christos 614 1.3 christos atf_check -s exit:0 -e empty -o inline:'G: backslash at end of line\n' \ 615 1.3 christos ${TEST_SH} -c \ 616 1.3 christos 'echo $( 617 1.3 christos echo G: backslash at end of line # \ 618 1.3 christos )' 619 1.3 christos 620 1.3 christos atf_check -s exit:0 -e empty \ 621 1.3 christos -o inline:'H: empty command-substitution\n' \ 622 1.3 christos ${TEST_SH} -c 'echo H: empty command-substitution $( )' 623 1.3 christos } 624 1.3 christos 625 1.4 christos atf_test_case w_heredoc_outside_cmdsub 626 1.4 christos w_heredoc_outside_cmdsub_head() { 627 1.4 christos atf_set "descr" "Checks that here docs work inside cmd subs" 628 1.4 christos } 629 1.4 christos w_heredoc_outside_cmdsub_body() { 630 1.4 christos atf_require_prog cat 631 1.4 christos 632 1.4 christos atf_check -s exit:0 -o inline:'Mary had a\nlittle\nlamb\n' -e empty \ 633 1.4 christos ${TEST_SH} -c 'echo "$( cat <<- \EOF )" 634 1.4 christos Mary had a 635 1.4 christos little 636 1.4 christos lamb 637 1.4 christos EOF 638 1.4 christos ' 639 1.4 christos 640 1.4 christos atf_check -s exit:0 -e empty \ 641 1.4 christos -o inline:'Mary had 1\nlittle\nlamb\nMary had 4\nlittle\nlambs\n' \ 642 1.4 christos ${TEST_SH} -c 'for N in 1 4; do echo "$( cat <<- EOF )" 643 1.4 christos Mary had ${N} 644 1.4 christos little 645 1.4 christos lamb$( [ $N -gt 1 ] && echo s ) 646 1.4 christos EOF 647 1.4 christos done' 648 1.4 christos 649 1.4 christos 650 1.4 christos atf_check -s exit:0 -o inline:'A Calculation:\n2 * 7 = 14\n' -e empty \ 651 1.4 christos ${TEST_SH} -c 'echo "$( cat <<- EOF)" 652 1.4 christos A Calculation: 653 1.4 christos 2 * 7 = $(( 2 * 7 )) 654 1.4 christos EOF 655 1.4 christos ' 656 1.4 christos } 657 1.4 christos 658 1.4 christos atf_test_case x_heredoc_outside_backticks 659 1.4 christos x_heredoc_outside_backticks_head() { 660 1.4 christos atf_set "descr" "Checks that here docs work inside old style cmd subs" 661 1.4 christos } 662 1.4 christos x_heredoc_outside_backticks_body() { 663 1.4 christos atf_require_prog cat 664 1.4 christos 665 1.4 christos atf_check -s exit:0 -o inline:'Mary had a little lamb\n' -e empty \ 666 1.4 christos ${TEST_SH} -c 'echo ` cat <<- \EOF ` 667 1.4 christos Mary had a 668 1.4 christos little 669 1.4 christos lamb 670 1.4 christos EOF 671 1.4 christos ' 672 1.4 christos 673 1.4 christos atf_check -s exit:0 -o inline:'A Calculation:\n17 / 3 = 5\n' -e empty \ 674 1.4 christos ${TEST_SH} -c 'echo "` cat <<- EOF `" 675 1.4 christos A Calculation: 676 1.4 christos 17 / 3 = $(( 17 / 3 )) 677 1.4 christos EOF 678 1.4 christos ' 679 1.4 christos } 680 1.4 christos 681 1.5 kre atf_test_case y_many_embedded_nl 682 1.5 kre y_many_embedded_nl_head() { 683 1.5 kre atf_set "descr" "Checks command substitutions that return many lines" 684 1.5 kre } 685 1.5 kre y_many_embedded_nl_body() { 686 1.5 kre atf_require_prog wc 687 1.5 kre atf_require_prog seq 688 1.5 kre 689 1.5 kre # first make sure it should work 690 1.5 kre atf_check -s exit:0 -o match:'1002' -e empty \ 691 1.5 kre ${TEST_SH} -c "{ printf '%s\n' x 692 1.5 kre for a in \$( seq 1000 ); do printf '\n'; done 693 1.5 kre printf '%s\n' y; } | wc -l" 694 1.5 kre 695 1.5 kre # then use a cmd-sub to get the same thing 696 1.5 kre atf_check -s exit:0 -o match:'1002' -e empty \ 697 1.5 kre ${TEST_SH} -c "printf '%s\n' \"\$( printf '%s\n' x 698 1.5 kre for a in \$( seq 1000 ); do printf '\n'; done 699 1.5 kre printf '%s\n' y )\" | wc -l" 700 1.5 kre 701 1.5 kre # and a much bigger one. 702 1.5 kre atf_check -s exit:0 -o match:'10002' -e empty \ 703 1.5 kre ${TEST_SH} -c "printf '%s\n' \"\$( printf '%s\n' x 704 1.5 kre for a in \$( seq 10000 ); do printf '\n'; done 705 1.5 kre printf '%s\n' y )\" | wc -l" 706 1.4 christos } 707 1.4 christos 708 1.1 christos atf_test_case z_absurd_heredoc_cmdsub_combos 709 1.1 christos z_absurd_heredoc_cmdsub_combos_head() { 710 1.1 christos atf_set "descr" "perverse and unusual cmd substitutions & more" 711 1.1 christos } 712 1.1 christos z_absurd_heredoc_cmdsub_combos_body() { 713 1.2 christos 714 1.2 christos echo "Help!" > help 715 1.2 christos 716 1.2 christos # This version works in NetBSD (& FreeBSD)'s sh (and most others) 717 1.2 christos atf_check -s exit:0 -o inline:'Help!\nMe 2\n' -e empty ${TEST_SH} -c ' 718 1.2 christos cat <<- EOF 719 1.2 christos $( 720 1.2 christos cat <<- STOP 721 1.2 christos $( 722 1.2 christos cat `echo help` 723 1.2 christos ) 724 1.2 christos STOP 725 1.2 christos ) 726 1.2 christos $( 727 1.2 christos cat <<- END 4<<-TRASH 728 1.2 christos Me $(( 1 + 1 )) 729 1.2 christos END 730 1.2 christos This is unused noise! 731 1.2 christos TRASH 732 1.2 christos ) 733 1.2 christos EOF 734 1.2 christos ' 735 1.2 christos 736 1.2 christos # atf_expect_fail "PR bin/50993 - heredoc parsing done incorrectly" 737 1.2 christos atf_check -s exit:0 -o inline:'Help!\nMe 2\n' -e empty ${TEST_SH} -c ' 738 1.2 christos cat <<- EOF 739 1.2 christos $( 740 1.2 christos cat << STOP 741 1.2 christos $( 742 1.2 christos cat `echo help` 743 1.2 christos ) 744 1.2 christos STOP 745 1.2 christos ) 746 1.2 christos $( 747 1.2 christos cat <<- END 4<<TRASH 748 1.2 christos Me $(( 1 + 1 )) 749 1.2 christos END 750 1.2 christos This is unused noise! 751 1.2 christos TRASH 752 1.2 christos ) 753 1.2 christos EOF 754 1.2 christos ' 755 1.1 christos } 756 1.1 christos 757 1.1 christos atf_init_test_cases() { 758 1.1 christos atf_add_test_case a_basic_cmdsub 759 1.1 christos atf_add_test_case b_basic_backticks 760 1.1 christos atf_add_test_case c_nested_cmdsub 761 1.1 christos atf_add_test_case d_nested_backticks 762 1.1 christos atf_add_test_case e_perverse_mixing 763 1.1 christos atf_add_test_case f_redirect_in_cmdsub 764 1.1 christos atf_add_test_case g_redirect_in_backticks 765 1.1 christos atf_add_test_case h_vars_in_cmdsub 766 1.1 christos atf_add_test_case i_vars_in_backticks 767 1.1 christos atf_add_test_case j_cmdsub_in_varexpand 768 1.1 christos atf_add_test_case k_backticks_in_varexpand 769 1.1 christos atf_add_test_case l_arithmetic_in_cmdsub 770 1.1 christos atf_add_test_case m_arithmetic_in_backticks 771 1.1 christos atf_add_test_case n_cmdsub_in_arithmetic 772 1.1 christos atf_add_test_case o_backticks_in_arithmetic 773 1.1 christos atf_add_test_case p_cmdsub_in_heredoc 774 1.1 christos atf_add_test_case q_backticks_in_heredoc 775 1.1 christos atf_add_test_case r_heredoc_in_cmdsub 776 1.1 christos atf_add_test_case s_heredoc_in_backticks 777 1.1 christos atf_add_test_case t_nested_cmdsubs_in_heredoc 778 1.1 christos atf_add_test_case u_nested_backticks_in_heredoc 779 1.3 christos atf_add_test_case v_cmdsub_paren_tests 780 1.4 christos atf_add_test_case w_heredoc_outside_cmdsub 781 1.4 christos atf_add_test_case x_heredoc_outside_backticks 782 1.5 kre atf_add_test_case y_many_embedded_nl 783 1.1 christos atf_add_test_case z_absurd_heredoc_cmdsub_combos 784 1.1 christos } 785