1# $MirOS: src/bin/mksh/check.t,v 1.661 2014/10/07 15:22:14 tg Exp $ 2# OpenBSD src/regress/bin/ksh updated: 2013/12/02 20:39:44 3#- 4# Copyright © 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 5# 2011, 2012, 2013, 2014 6# Thorsten Glaser <tg@mirbsd.org> 7# 8# Provided that these terms and disclaimer and all copyright notices 9# are retained or reproduced in an accompanying document, permission 10# is granted to deal in this work without restriction, including un‐ 11# limited rights to use, publicly perform, distribute, sell, modify, 12# merge, give away, or sublicence. 13# 14# This work is provided “AS IS” and WITHOUT WARRANTY of any kind, to 15# the utmost extent permitted by applicable law, neither express nor 16# implied; without malicious intent or gross negligence. In no event 17# may a licensor, author or contributor be held liable for indirect, 18# direct, other damage, loss, or other issues arising in any way out 19# of dealing in the work, even if advised of the possibility of such 20# damage or existence of a defect, except proven that it results out 21# of said person’s immediate fault when using the work as intended. 22#- 23# You may also want to test IFS with the script at 24# http://www.research.att.com/~gsf/public/ifs.sh 25# 26# More testsuites at: 27# http://www.freebsd.org/cgi/cvsweb.cgi/src/tools/regression/bin/test/regress.sh?rev=HEAD 28 29expected-stdout: 30 @(#)MIRBSD KSH R50 2014/10/07 31description: 32 Check version of shell. 33stdin: 34 echo $KSH_VERSION 35name: KSH_VERSION 36category: shell:legacy-no 37--- 38expected-stdout: 39 @(#)LEGACY KSH R50 2014/10/07 40description: 41 Check version of legacy shell. 42stdin: 43 echo $KSH_VERSION 44name: KSH_VERSION-legacy 45category: shell:legacy-yes 46--- 47name: selftest-1 48description: 49 Regression test self-testing 50stdin: 51 echo ${foo:-baz} 52expected-stdout: 53 baz 54--- 55name: selftest-2 56description: 57 Regression test self-testing 58env-setup: !foo=bar! 59stdin: 60 echo ${foo:-baz} 61expected-stdout: 62 bar 63--- 64name: selftest-3 65description: 66 Regression test self-testing 67env-setup: !ENV=fnord! 68stdin: 69 echo "<$ENV>" 70expected-stdout: 71 <fnord> 72--- 73name: selftest-exec 74description: 75 Ensure that the test run directory (default /tmp but can be changed 76 with check.pl flag -T or test.sh $TMPDIR) is not mounted noexec, as 77 we execute scripts from the scratch directory during several tests. 78stdin: 79 print '#!'"$__progname"'\necho tf' >lq 80 chmod +x lq 81 ./lq 82expected-stdout: 83 tf 84--- 85name: selftest-env 86description: 87 Just output the environment variables set (always fails) 88category: disabled 89stdin: 90 set 91--- 92name: selftest-legacy 93description: 94 Check some things in the LEGACY KSH 95category: shell:legacy-yes 96stdin: 97 set +o emacs 98 set +o vi 99 [[ "$(set +o) -o" = *"-o emacs -o"* ]] && echo 1=emacs 100 [[ "$(set +o) -o" = *"-o vi -o"* ]] && echo 1=vi 101 set -o emacs 102 set -o vi 103 [[ "$(set +o) -o" = *"-o emacs -o"* ]] && echo 2=emacs 104 [[ "$(set +o) -o" = *"-o vi -o"* ]] && echo 2=vi 105expected-stdout: 106 2=emacs 107 2=vi 108--- 109name: selftest-direct-builtin-call 110description: 111 Check that direct builtin calls work 112stdin: 113 ln -s "$__progname" cat || cp "$__progname" cat 114 ln -s "$__progname" echo || cp "$__progname" echo 115 ./echo -c 'echo foo' | ./cat -u 116expected-stdout: 117 -c echo foo 118--- 119name: alias-1 120description: 121 Check that recursion is detected/avoided in aliases. 122stdin: 123 alias fooBar=fooBar 124 fooBar 125 exit 0 126expected-stderr-pattern: 127 /fooBar.*not found.*/ 128--- 129name: alias-2 130description: 131 Check that recursion is detected/avoided in aliases. 132stdin: 133 alias fooBar=barFoo 134 alias barFoo=fooBar 135 fooBar 136 barFoo 137 exit 0 138expected-stderr-pattern: 139 /fooBar.*not found.*\n.*barFoo.*not found/ 140--- 141name: alias-3 142description: 143 Check that recursion is detected/avoided in aliases. 144stdin: 145 alias Echo='echo ' 146 alias fooBar=barFoo 147 alias barFoo=fooBar 148 Echo fooBar 149 unalias barFoo 150 Echo fooBar 151expected-stdout: 152 fooBar 153 barFoo 154--- 155name: alias-4 156description: 157 Check that alias expansion isn't done on keywords (in keyword 158 postitions). 159stdin: 160 alias Echo='echo ' 161 alias while=While 162 while false; do echo hi ; done 163 Echo while 164expected-stdout: 165 While 166--- 167name: alias-5 168description: 169 Check that alias expansion done after alias with trailing space. 170stdin: 171 alias Echo='echo ' 172 alias foo='bar stuff ' 173 alias bar='Bar1 Bar2 ' 174 alias stuff='Stuff' 175 alias blah='Blah' 176 Echo foo blah 177expected-stdout: 178 Bar1 Bar2 Stuff Blah 179--- 180name: alias-6 181description: 182 Check that alias expansion done after alias with trailing space. 183stdin: 184 alias Echo='echo ' 185 alias foo='bar bar' 186 alias bar='Bar ' 187 alias blah=Blah 188 Echo foo blah 189expected-stdout: 190 Bar Bar Blah 191--- 192name: alias-7 193description: 194 Check that alias expansion done after alias with trailing space 195 after a keyword. 196stdin: 197 alias X='case ' 198 alias Y=Z 199 X Y in 'Y') echo is y ;; Z) echo is z ; esac 200expected-stdout: 201 is z 202--- 203name: alias-8 204description: 205 Check that newlines in an alias don't cause the command to be lost. 206stdin: 207 alias foo=' 208 209 210 echo hi 211 212 213 214 echo there 215 216 217 ' 218 foo 219expected-stdout: 220 hi 221 there 222--- 223name: alias-9 224description: 225 Check that recursion is detected/avoided in aliases. 226 This check fails for slow machines or Cygwin, raise 227 the time-limit clause (e.g. to 7) if this occurs. 228time-limit: 3 229stdin: 230 print '#!'"$__progname"'\necho tf' >lq 231 chmod +x lq 232 PATH=$PWD:$PATH 233 alias lq=lq 234 lq 235 echo = now 236 i=`lq` 237 print -r -- $i 238 echo = out 239 exit 0 240expected-stdout: 241 tf 242 = now 243 tf 244 = out 245--- 246name: alias-10 247description: 248 Check that recursion is detected/avoided in aliases. 249 Regression, introduced during an old bugfix. 250stdin: 251 alias foo='print hello ' 252 alias bar='foo world' 253 echo $(bar) 254expected-stdout: 255 hello world 256--- 257name: arith-lazy-1 258description: 259 Check that only one side of ternary operator is evaluated 260stdin: 261 x=i+=2 262 y=j+=2 263 typeset -i i=1 j=1 264 echo $((1 ? 20 : (x+=2))) 265 echo $i,$x 266 echo $((0 ? (y+=2) : 30)) 267 echo $j,$y 268expected-stdout: 269 20 270 1,i+=2 271 30 272 1,j+=2 273--- 274name: arith-lazy-2 275description: 276 Check that assignments not done on non-evaluated side of ternary 277 operator 278stdin: 279 x=i+=2 280 y=j+=2 281 typeset -i i=1 j=1 282 echo $((1 ? 20 : (x+=2))) 283 echo $i,$x 284 echo $((0 ? (y+=2) : 30)) 285 echo $i,$y 286expected-stdout: 287 20 288 1,i+=2 289 30 290 1,j+=2 291--- 292name: arith-lazy-3 293description: 294 Check that assignments not done on non-evaluated side of ternary 295 operator and this construct is parsed correctly (Debian #445651) 296stdin: 297 x=4 298 y=$((0 ? x=1 : 2)) 299 echo = $x $y = 300expected-stdout: 301 = 4 2 = 302--- 303name: arith-lazy-4 304description: 305 Check that preun/postun not done on non-evaluated side of ternary 306 operator 307stdin: 308 (( m = n = 0, 1 ? n++ : m++ ? 2 : 3 )) 309 echo "($n, $m)" 310 m=0; echo $(( 0 ? ++m : 2 )); echo $m 311 m=0; echo $(( 0 ? m++ : 2 )); echo $m 312expected-stdout: 313 (1, 0) 314 2 315 0 316 2 317 0 318--- 319name: arith-ternary-prec-1 320description: 321 Check precedence of ternary operator vs assignment 322stdin: 323 typeset -i x=2 324 y=$((1 ? 20 : x+=2)) 325expected-exit: e != 0 326expected-stderr-pattern: 327 /.*:.*1 \? 20 : x\+=2.*lvalue.*\n$/ 328--- 329name: arith-ternary-prec-2 330description: 331 Check precedence of ternary operator vs assignment 332stdin: 333 typeset -i x=2 334 echo $((0 ? x+=2 : 20)) 335expected-stdout: 336 20 337--- 338name: arith-div-assoc-1 339description: 340 Check associativity of division operator 341stdin: 342 echo $((20 / 2 / 2)) 343expected-stdout: 344 5 345--- 346name: arith-div-byzero 347description: 348 Check division by zero errors out 349stdin: 350 x=$(echo $((1 / 0))) 351 echo =$?:$x. 352expected-stdout: 353 =1:. 354expected-stderr-pattern: 355 /.*divisor/ 356--- 357name: arith-div-intmin-by-minusone 358description: 359 Check division overflow wraps around silently 360category: int:32 361stdin: 362 echo signed:$((-2147483648 / -1))r$((-2147483648 % -1)). 363 echo unsigned:$((# -2147483648 / -1))r$((# -2147483648 % -1)). 364expected-stdout: 365 signed:-2147483648r0. 366 unsigned:0r2147483648. 367--- 368name: arith-div-intmin-by-minusone-64 369description: 370 Check division overflow wraps around silently 371category: int:64 372stdin: 373 echo signed:$((-9223372036854775808 / -1))r$((-9223372036854775808 % -1)). 374 echo unsigned:$((# -9223372036854775808 / -1))r$((# -9223372036854775808 % -1)). 375expected-stdout: 376 signed:-9223372036854775808r0. 377 unsigned:0r9223372036854775808. 378--- 379name: arith-assop-assoc-1 380description: 381 Check associativity of assignment-operator operator 382stdin: 383 typeset -i i=1 j=2 k=3 384 echo $((i += j += k)) 385 echo $i,$j,$k 386expected-stdout: 387 6 388 6,5,3 389--- 390name: arith-mandatory 391description: 392 Passing of this test is *mandatory* for a valid mksh executable! 393category: shell:legacy-no 394stdin: 395 typeset -i sari=0 396 typeset -Ui uari=0 397 typeset -i x=0 398 print -r -- $((x++)):$sari=$uari. #0 399 let --sari --uari 400 print -r -- $((x++)):$sari=$uari. #1 401 sari=2147483647 uari=2147483647 402 print -r -- $((x++)):$sari=$uari. #2 403 let ++sari ++uari 404 print -r -- $((x++)):$sari=$uari. #3 405 let --sari --uari 406 let 'sari *= 2' 'uari *= 2' 407 let ++sari ++uari 408 print -r -- $((x++)):$sari=$uari. #4 409 let ++sari ++uari 410 print -r -- $((x++)):$sari=$uari. #5 411 sari=-2147483648 uari=-2147483648 412 print -r -- $((x++)):$sari=$uari. #6 413 let --sari --uari 414 print -r -- $((x++)):$sari=$uari. #7 415 (( sari = -5 >> 1 )) 416 ((# uari = -5 >> 1 )) 417 print -r -- $((x++)):$sari=$uari. #8 418 (( sari = -2 )) 419 ((# uari = sari )) 420 print -r -- $((x++)):$sari=$uari. #9 421expected-stdout: 422 0:0=0. 423 1:-1=4294967295. 424 2:2147483647=2147483647. 425 3:-2147483648=2147483648. 426 4:-1=4294967295. 427 5:0=0. 428 6:-2147483648=2147483648. 429 7:2147483647=2147483647. 430 8:-3=2147483645. 431 9:-2=4294967294. 432--- 433name: arith-unsigned-1 434description: 435 Check if unsigned arithmetics work 436category: int:32 437stdin: 438 # signed vs unsigned 439 echo x1 $((-1)) $((#-1)) 440 # calculating 441 typeset -i vs 442 typeset -Ui vu 443 vs=4123456789; vu=4123456789 444 echo x2 $vs $vu 445 (( vs %= 2147483647 )) 446 (( vu %= 2147483647 )) 447 echo x3 $vs $vu 448 vs=4123456789; vu=4123456789 449 (( # vs %= 2147483647 )) 450 (( # vu %= 2147483647 )) 451 echo x4 $vs $vu 452 # make sure the calculation does not change unsigned flag 453 vs=4123456789; vu=4123456789 454 echo x5 $vs $vu 455 # short form 456 echo x6 $((# vs % 2147483647)) $((# vu % 2147483647)) 457 # array refs 458 set -A va 459 va[1975973142]=right 460 va[4123456789]=wrong 461 echo x7 ${va[#4123456789%2147483647]} 462expected-stdout: 463 x1 -1 4294967295 464 x2 -171510507 4123456789 465 x3 -171510507 4123456789 466 x4 1975973142 1975973142 467 x5 -171510507 4123456789 468 x6 1975973142 1975973142 469 x7 right 470--- 471name: arith-limit32-1 472description: 473 Check if arithmetics are 32 bit 474category: int:32 475stdin: 476 # signed vs unsigned 477 echo x1 $((-1)) $((#-1)) 478 # calculating 479 typeset -i vs 480 typeset -Ui vu 481 vs=2147483647; vu=2147483647 482 echo x2 $vs $vu 483 let vs++ vu++ 484 echo x3 $vs $vu 485 vs=4294967295; vu=4294967295 486 echo x4 $vs $vu 487 let vs++ vu++ 488 echo x5 $vs $vu 489 let vs++ vu++ 490 echo x6 $vs $vu 491expected-stdout: 492 x1 -1 4294967295 493 x2 2147483647 2147483647 494 x3 -2147483648 2147483648 495 x4 -1 4294967295 496 x5 0 0 497 x6 1 1 498--- 499name: arith-limit64-1 500description: 501 Check if arithmetics are 64 bit 502category: int:64 503stdin: 504 # signed vs unsigned 505 echo x1 $((-1)) $((#-1)) 506 # calculating 507 typeset -i vs 508 typeset -Ui vu 509 vs=9223372036854775807; vu=9223372036854775807 510 echo x2 $vs $vu 511 let vs++ vu++ 512 echo x3 $vs $vu 513 vs=18446744073709551615; vu=18446744073709551615 514 echo x4 $vs $vu 515 let vs++ vu++ 516 echo x5 $vs $vu 517 let vs++ vu++ 518 echo x6 $vs $vu 519expected-stdout: 520 x1 -1 18446744073709551615 521 x2 9223372036854775807 9223372036854775807 522 x3 -9223372036854775808 9223372036854775808 523 x4 -1 18446744073709551615 524 x5 0 0 525 x6 1 1 526--- 527name: bksl-nl-ign-1 528description: 529 Check that \newline is not collapsed after # 530stdin: 531 echo hi #there \ 532 echo folks 533expected-stdout: 534 hi 535 folks 536--- 537name: bksl-nl-ign-2 538description: 539 Check that \newline is not collapsed inside single quotes 540stdin: 541 echo 'hi \ 542 there' 543 echo folks 544expected-stdout: 545 hi \ 546 there 547 folks 548--- 549name: bksl-nl-ign-3 550description: 551 Check that \newline is not collapsed inside single quotes 552stdin: 553 cat << \EOF 554 hi \ 555 there 556 EOF 557expected-stdout: 558 hi \ 559 there 560--- 561name: bksl-nl-ign-4 562description: 563 Check interaction of aliases, single quotes and here-documents 564 with backslash-newline 565 (don't know what POSIX has to say about this) 566stdin: 567 a=2 568 alias x='echo hi 569 cat << "EOF" 570 foo\ 571 bar 572 some' 573 x 574 more\ 575 stuff$a 576 EOF 577expected-stdout: 578 hi 579 foo\ 580 bar 581 some 582 more\ 583 stuff$a 584--- 585name: bksl-nl-ign-5 586description: 587 Check what happens with backslash at end of input 588 (the old Bourne shell trashes them; so do we) 589stdin: ! 590 echo `echo foo\\`bar 591 echo hi\ 592expected-stdout: 593 foobar 594 hi 595--- 596# 597# Places \newline should be collapsed 598# 599name: bksl-nl-1 600description: 601 Check that \newline is collapsed before, in the middle of, and 602 after words 603stdin: 604 \ 605 echo hi\ 606 There, \ 607 folks 608expected-stdout: 609 hiThere, folks 610--- 611name: bksl-nl-2 612description: 613 Check that \newline is collapsed in $ sequences 614 (ksh93 fails this) 615stdin: 616 a=12 617 ab=19 618 echo $\ 619 a 620 echo $a\ 621 b 622 echo $\ 623 {a} 624 echo ${a\ 625 b} 626 echo ${ab\ 627 } 628expected-stdout: 629 12 630 19 631 12 632 19 633 19 634--- 635name: bksl-nl-3 636description: 637 Check that \newline is collapsed in $(..) and `...` sequences 638 (ksh93 fails this) 639stdin: 640 echo $\ 641 (echo foobar1) 642 echo $(\ 643 echo foobar2) 644 echo $(echo foo\ 645 bar3) 646 echo $(echo foobar4\ 647 ) 648 echo ` 649 echo stuff1` 650 echo `echo st\ 651 uff2` 652expected-stdout: 653 foobar1 654 foobar2 655 foobar3 656 foobar4 657 stuff1 658 stuff2 659--- 660name: bksl-nl-4 661description: 662 Check that \newline is collapsed in $((..)) sequences 663 (ksh93 fails this) 664stdin: 665 echo $\ 666 ((1+2)) 667 echo $(\ 668 (1+2+3)) 669 echo $((\ 670 1+2+3+4)) 671 echo $((1+\ 672 2+3+4+5)) 673 echo $((1+2+3+4+5+6)\ 674 ) 675expected-stdout: 676 3 677 6 678 10 679 15 680 21 681--- 682name: bksl-nl-5 683description: 684 Check that \newline is collapsed in double quoted strings 685stdin: 686 echo "\ 687 hi" 688 echo "foo\ 689 bar" 690 echo "folks\ 691 " 692expected-stdout: 693 hi 694 foobar 695 folks 696--- 697name: bksl-nl-6 698description: 699 Check that \newline is collapsed in here document delimiters 700 (ksh93 fails second part of this) 701stdin: 702 a=12 703 cat << EO\ 704 F 705 a=$a 706 foo\ 707 bar 708 EOF 709 cat << E_O_F 710 foo 711 E_O_\ 712 F 713 echo done 714expected-stdout: 715 a=12 716 foobar 717 foo 718 done 719--- 720name: bksl-nl-7 721description: 722 Check that \newline is collapsed in double-quoted here-document 723 delimiter. 724stdin: 725 a=12 726 cat << "EO\ 727 F" 728 a=$a 729 foo\ 730 bar 731 EOF 732 echo done 733expected-stdout: 734 a=$a 735 foo\ 736 bar 737 done 738--- 739name: bksl-nl-8 740description: 741 Check that \newline is collapsed in various 2+ character tokens 742 delimiter. 743 (ksh93 fails this) 744stdin: 745 echo hi &\ 746 & echo there 747 echo foo |\ 748 | echo bar 749 cat <\ 750 < EOF 751 stuff 752 EOF 753 cat <\ 754 <\ 755 - EOF 756 more stuff 757 EOF 758 cat <<\ 759 EOF 760 abcdef 761 EOF 762 echo hi >\ 763 > /dev/null 764 echo $? 765 i=1 766 case $i in 767 (\ 768 x|\ 769 1\ 770 ) echo hi;\ 771 ; 772 (*) echo oops 773 esac 774expected-stdout: 775 hi 776 there 777 foo 778 stuff 779 more stuff 780 abcdef 781 0 782 hi 783--- 784name: bksl-nl-9 785description: 786 Check that \ at the end of an alias is collapsed when followed 787 by a newline 788 (don't know what POSIX has to say about this) 789stdin: 790 alias x='echo hi\' 791 x 792 echo there 793expected-stdout: 794 hiecho there 795--- 796name: bksl-nl-10 797description: 798 Check that \newline in a keyword is collapsed 799stdin: 800 i\ 801 f true; then\ 802 echo pass; el\ 803 se echo fail; fi 804expected-stdout: 805 pass 806--- 807# 808# Places \newline should be collapsed (ksh extensions) 809# 810name: bksl-nl-ksh-1 811description: 812 Check that \newline is collapsed in extended globbing 813 (ksh93 fails this) 814stdin: 815 xxx=foo 816 case $xxx in 817 (f*\ 818 (\ 819 o\ 820 )\ 821 ) echo ok ;; 822 *) echo bad 823 esac 824expected-stdout: 825 ok 826--- 827name: bksl-nl-ksh-2 828description: 829 Check that \newline is collapsed in ((...)) expressions 830 (ksh93 fails this) 831stdin: 832 i=1 833 (\ 834 (\ 835 i=i+2\ 836 )\ 837 ) 838 echo $i 839expected-stdout: 840 3 841--- 842name: break-1 843description: 844 See if break breaks out of loops 845stdin: 846 for i in a b c; do echo $i; break; echo bad-$i; done 847 echo end-1 848 for i in a b c; do echo $i; break 1; echo bad-$i; done 849 echo end-2 850 for i in a b c; do 851 for j in x y z; do 852 echo $i:$j 853 break 854 echo bad-$i 855 done 856 echo end-$i 857 done 858 echo end-3 859expected-stdout: 860 a 861 end-1 862 a 863 end-2 864 a:x 865 end-a 866 b:x 867 end-b 868 c:x 869 end-c 870 end-3 871--- 872name: break-2 873description: 874 See if break breaks out of nested loops 875stdin: 876 for i in a b c; do 877 for j in x y z; do 878 echo $i:$j 879 break 2 880 echo bad-$i 881 done 882 echo end-$i 883 done 884 echo end 885expected-stdout: 886 a:x 887 end 888--- 889name: break-3 890description: 891 What if break used outside of any loops 892 (ksh88,ksh93 don't print error messages here) 893stdin: 894 break 895expected-stderr-pattern: 896 /.*break.*/ 897--- 898name: break-4 899description: 900 What if break N used when only N-1 loops 901 (ksh88,ksh93 don't print error messages here) 902stdin: 903 for i in a b c; do echo $i; break 2; echo bad-$i; done 904 echo end 905expected-stdout: 906 a 907 end 908expected-stderr-pattern: 909 /.*break.*/ 910--- 911name: break-5 912description: 913 Error if break argument isn't a number 914stdin: 915 for i in a b c; do echo $i; break abc; echo more-$i; done 916 echo end 917expected-stdout: 918 a 919expected-exit: e != 0 920expected-stderr-pattern: 921 /.*break.*/ 922--- 923name: continue-1 924description: 925 See if continue continues loops 926stdin: 927 for i in a b c; do echo $i; continue; echo bad-$i ; done 928 echo end-1 929 for i in a b c; do echo $i; continue 1; echo bad-$i; done 930 echo end-2 931 for i in a b c; do 932 for j in x y z; do 933 echo $i:$j 934 continue 935 echo bad-$i-$j 936 done 937 echo end-$i 938 done 939 echo end-3 940expected-stdout: 941 a 942 b 943 c 944 end-1 945 a 946 b 947 c 948 end-2 949 a:x 950 a:y 951 a:z 952 end-a 953 b:x 954 b:y 955 b:z 956 end-b 957 c:x 958 c:y 959 c:z 960 end-c 961 end-3 962--- 963name: continue-2 964description: 965 See if continue breaks out of nested loops 966stdin: 967 for i in a b c; do 968 for j in x y z; do 969 echo $i:$j 970 continue 2 971 echo bad-$i-$j 972 done 973 echo end-$i 974 done 975 echo end 976expected-stdout: 977 a:x 978 b:x 979 c:x 980 end 981--- 982name: continue-3 983description: 984 What if continue used outside of any loops 985 (ksh88,ksh93 don't print error messages here) 986stdin: 987 continue 988expected-stderr-pattern: 989 /.*continue.*/ 990--- 991name: continue-4 992description: 993 What if continue N used when only N-1 loops 994 (ksh88,ksh93 don't print error messages here) 995stdin: 996 for i in a b c; do echo $i; continue 2; echo bad-$i; done 997 echo end 998expected-stdout: 999 a 1000 b 1001 c 1002 end 1003expected-stderr-pattern: 1004 /.*continue.*/ 1005--- 1006name: continue-5 1007description: 1008 Error if continue argument isn't a number 1009stdin: 1010 for i in a b c; do echo $i; continue abc; echo more-$i; done 1011 echo end 1012expected-stdout: 1013 a 1014expected-exit: e != 0 1015expected-stderr-pattern: 1016 /.*continue.*/ 1017--- 1018name: cd-history 1019description: 1020 Test someone's CD history package (uses arrays) 1021stdin: 1022 # go to known place before doing anything 1023 cd / 1024 1025 alias cd=_cd 1026 function _cd 1027 { 1028 typeset -i cdlen i 1029 typeset t 1030 1031 if [ $# -eq 0 ] 1032 then 1033 set -- $HOME 1034 fi 1035 1036 if [ "$CDHISTFILE" -a -r "$CDHISTFILE" ] # if directory history exists 1037 then 1038 typeset CDHIST 1039 i=-1 1040 while read -r t # read directory history file 1041 do 1042 CDHIST[i=i+1]=$t 1043 done <$CDHISTFILE 1044 fi 1045 1046 if [ "${CDHIST[0]}" != "$PWD" -a "$PWD" != "" ] 1047 then 1048 _cdins # insert $PWD into cd history 1049 fi 1050 1051 cdlen=${#CDHIST[*]} # number of elements in history 1052 1053 case "$@" in 1054 -) # cd to new dir 1055 if [ "$OLDPWD" = "" ] && ((cdlen>1)) 1056 then 1057 'print' ${CDHIST[1]} 1058 'cd' ${CDHIST[1]} 1059 _pwd 1060 else 1061 'cd' $@ 1062 _pwd 1063 fi 1064 ;; 1065 -l) # print directory list 1066 typeset -R3 num 1067 ((i=cdlen)) 1068 while (((i=i-1)>=0)) 1069 do 1070 num=$i 1071 'print' "$num ${CDHIST[i]}" 1072 done 1073 return 1074 ;; 1075 -[0-9]|-[0-9][0-9]) # cd to dir in list 1076 if (((i=${1#-})<cdlen)) 1077 then 1078 'print' ${CDHIST[i]} 1079 'cd' ${CDHIST[i]} 1080 _pwd 1081 else 1082 'cd' $@ 1083 _pwd 1084 fi 1085 ;; 1086 -*) # cd to matched dir in list 1087 t=${1#-} 1088 i=1 1089 while ((i<cdlen)) 1090 do 1091 case ${CDHIST[i]} in 1092 *$t*) 1093 'print' ${CDHIST[i]} 1094 'cd' ${CDHIST[i]} 1095 _pwd 1096 break 1097 ;; 1098 esac 1099 ((i=i+1)) 1100 done 1101 if ((i>=cdlen)) 1102 then 1103 'cd' $@ 1104 _pwd 1105 fi 1106 ;; 1107 *) # cd to new dir 1108 'cd' $@ 1109 _pwd 1110 ;; 1111 esac 1112 1113 _cdins # insert $PWD into cd history 1114 1115 if [ "$CDHISTFILE" ] 1116 then 1117 cdlen=${#CDHIST[*]} # number of elements in history 1118 1119 i=0 1120 while ((i<cdlen)) 1121 do 1122 'print' -r ${CDHIST[i]} # update directory history 1123 ((i=i+1)) 1124 done >$CDHISTFILE 1125 fi 1126 } 1127 1128 function _cdins # insert $PWD into cd history 1129 { # meant to be called only by _cd 1130 typeset -i i 1131 1132 ((i=0)) 1133 while ((i<${#CDHIST[*]})) # see if dir is already in list 1134 do 1135 if [ "${CDHIST[$i]}" = "$PWD" ] 1136 then 1137 break 1138 fi 1139 ((i=i+1)) 1140 done 1141 1142 if ((i>22)) # limit max size of list 1143 then 1144 i=22 1145 fi 1146 1147 while (((i=i-1)>=0)) # bump old dirs in list 1148 do 1149 CDHIST[i+1]=${CDHIST[i]} 1150 done 1151 1152 CDHIST[0]=$PWD # insert new directory in list 1153 } 1154 1155 1156 function _pwd 1157 { 1158 if [ -n "$ECD" ] 1159 then 1160 pwd 1>&6 1161 fi 1162 } 1163 # Start of test 1164 cd /tmp 1165 cd /bin 1166 cd /etc 1167 cd - 1168 cd -2 1169 cd -l 1170expected-stdout: 1171 /bin 1172 /tmp 1173 3 / 1174 2 /etc 1175 1 /bin 1176 0 /tmp 1177--- 1178name: cd-pe 1179description: 1180 Check package for cd -Pe 1181need-pass: no 1182# the mv command fails on Cygwin 1183# Hurd aborts the testsuite (permission denied) 1184# QNX does not find subdir to cd into 1185category: !os:cygwin,!os:gnu,!os:msys,!os:nto,!nosymlink 1186file-setup: file 644 "x" 1187 mkdir noread noread/target noread/target/subdir 1188 ln -s noread link 1189 chmod 311 noread 1190 cd -P$1 . 1191 echo 0=$? 1192 bwd=$PWD 1193 cd -P$1 link/target 1194 echo 1=$?,${PWD#$bwd/} 1195 epwd=$($TSHELL -c pwd 2>/dev/null) 1196 # This unexpectedly succeeds on GNU/Linux and MidnightBSD 1197 #echo pwd=$?,$epwd 1198 # expect: pwd=1, 1199 mv ../../noread ../../renamed 1200 cd -P$1 subdir 1201 echo 2=$?,${PWD#$bwd/} 1202 cd $bwd 1203 chmod 755 renamed 1204 rm -rf noread link renamed 1205stdin: 1206 export TSHELL="$__progname" 1207 "$__progname" x 1208 echo "now with -e:" 1209 "$__progname" x e 1210expected-stdout: 1211 0=0 1212 1=0,noread/target 1213 2=0,noread/target/subdir 1214 now with -e: 1215 0=0 1216 1=0,noread/target 1217 2=1,noread/target/subdir 1218--- 1219name: env-prompt 1220description: 1221 Check that prompt not printed when processing ENV 1222env-setup: !ENV=./foo! 1223file-setup: file 644 "foo" 1224 XXX=_ 1225 PS1=X 1226 false && echo hmmm 1227need-ctty: yes 1228arguments: !-i! 1229stdin: 1230 echo hi${XXX}there 1231expected-stdout: 1232 hi_there 1233expected-stderr: ! 1234 XX 1235--- 1236name: expand-ugly 1237description: 1238 Check that weird ${foo+bar} constructs are parsed correctly 1239stdin: 1240 print '#!'"$__progname"'\nfor x in "$@"; do print -r -- "$x"; done' >pfn 1241 print '#!'"$__progname"'\nfor x in "$@"; do print -nr -- "<$x> "; done' >pfs 1242 chmod +x pfn pfs 1243 (echo 1 ${IFS+'}'z}) 2>/dev/null || echo failed in 1 1244 (echo 2 "${IFS+'}'z}") 2>/dev/null || echo failed in 2 1245 (echo 3 "foo ${IFS+'bar} baz") 2>/dev/null || echo failed in 3 1246 (echo -n '4 '; ./pfn "foo ${IFS+"b c"} baz") 2>/dev/null || echo failed in 4 1247 (echo -n '5 '; ./pfn "foo ${IFS+b c} baz") 2>/dev/null || echo failed in 5 1248 (echo 6 ${IFS+"}"z}) 2>/dev/null || echo failed in 6 1249 (echo 7 "${IFS+"}"z}") 2>/dev/null || echo failed in 7 1250 (echo 8 "${IFS+\"}\"z}") 2>/dev/null || echo failed in 8 1251 (echo 9 "${IFS+\"\}\"z}") 2>/dev/null || echo failed in 9 1252 (echo 10 foo ${IFS+'bar} baz'}) 2>/dev/null || echo failed in 10 1253 (echo 11 "$(echo "${IFS+'}'z}")") 2>/dev/null || echo failed in 11 1254 (echo 12 "$(echo ${IFS+'}'z})") 2>/dev/null || echo failed in 12 1255 (echo 13 ${IFS+\}z}) 2>/dev/null || echo failed in 13 1256 (echo 14 "${IFS+\}z}") 2>/dev/null || echo failed in 14 1257 u=x; (echo -n '15 '; ./pfs "foo ${IFS+a"b$u{ {"{{\}b} c ${IFS+d{}} bar" ${IFS-e{}} baz; echo .) 2>/dev/null || echo failed in 15 1258 l=t; (echo 16 ${IFS+h`echo -n i ${IFS+$l}h`ere}) 2>/dev/null || echo failed in 16 1259 l=t; (echo 17 ${IFS+h$(echo -n i ${IFS+$l}h)ere}) 2>/dev/null || echo failed in 17 1260 l=t; (echo 18 "${IFS+h`echo -n i ${IFS+$l}h`ere}") 2>/dev/null || echo failed in 18 1261 l=t; (echo 19 "${IFS+h$(echo -n i ${IFS+$l}h)ere}") 2>/dev/null || echo failed in 19 1262 l=t; (echo 20 ${IFS+h`echo -n i "${IFS+$l}"h`ere}) 2>/dev/null || echo failed in 20 1263 l=t; (echo 21 ${IFS+h$(echo -n i "${IFS+$l}"h)ere}) 2>/dev/null || echo failed in 21 1264 l=t; (echo 22 "${IFS+h`echo -n i "${IFS+$l}"h`ere}") 2>/dev/null || echo failed in 22 1265 l=t; (echo 23 "${IFS+h$(echo -n i "${IFS+$l}"h)ere}") 2>/dev/null || echo failed in 23 1266 key=value; (echo -n '24 '; ./pfn "${IFS+'$key'}") 2>/dev/null || echo failed in 24 1267 key=value; (echo -n '25 '; ./pfn "${IFS+"'$key'"}") 2>/dev/null || echo failed in 25 # ksh93: “'$key'” 1268 key=value; (echo -n '26 '; ./pfn ${IFS+'$key'}) 2>/dev/null || echo failed in 26 1269 key=value; (echo -n '27 '; ./pfn ${IFS+"'$key'"}) 2>/dev/null || echo failed in 27 1270 (echo -n '28 '; ./pfn "${IFS+"'"x ~ x'}'x"'}"x}" #') 2>/dev/null || echo failed in 28 1271 u=x; (echo -n '29 '; ./pfs foo ${IFS+a"b$u{ {"{ {\}b} c ${IFS+d{}} bar ${IFS-e{}} baz; echo .) 2>/dev/null || echo failed in 29 1272 (echo -n '30 '; ./pfs ${IFS+foo 'b\ 1273 ar' baz}; echo .) 2>/dev/null || (echo failed in 30; echo failed in 31) 1274 (echo -n '32 '; ./pfs ${IFS+foo "b\ 1275 ar" baz}; echo .) 2>/dev/null || echo failed in 32 1276 (echo -n '33 '; ./pfs "${IFS+foo 'b\ 1277 ar' baz}"; echo .) 2>/dev/null || echo failed in 33 1278 (echo -n '34 '; ./pfs "${IFS+foo "b\ 1279 ar" baz}"; echo .) 2>/dev/null || echo failed in 34 1280 (echo -n '35 '; ./pfs ${v=a\ b} x ${v=c\ d}; echo .) 2>/dev/null || echo failed in 35 1281 (echo -n '36 '; ./pfs "${v=a\ b}" x "${v=c\ d}"; echo .) 2>/dev/null || echo failed in 36 1282 (echo -n '37 '; ./pfs ${v-a\ b} x ${v-c\ d}; echo .) 2>/dev/null || echo failed in 37 1283 (echo 38 ${IFS+x'a'y} / "${IFS+x'a'y}" .) 2>/dev/null || echo failed in 38 1284 foo="x'a'y"; (echo 39 ${foo%*'a'*} / "${foo%*'a'*}" .) 2>/dev/null || echo failed in 39 1285 foo="a b c"; (echo -n '40 '; ./pfs "${foo#a}"; echo .) 2>/dev/null || echo failed in 40 1286expected-stdout: 1287 1 }z 1288 2 ''z} 1289 3 foo 'bar baz 1290 4 foo b c baz 1291 5 foo b c baz 1292 6 }z 1293 7 }z 1294 8 ""z} 1295 9 "}"z 1296 10 foo bar} baz 1297 11 ''z} 1298 12 }z 1299 13 }z 1300 14 }z 1301 15 <foo abx{ {{{}b c d{} bar> <}> <baz> . 1302 16 hi there 1303 17 hi there 1304 18 hi there 1305 19 hi there 1306 20 hi there 1307 21 hi there 1308 22 hi there 1309 23 hi there 1310 24 'value' 1311 25 'value' 1312 26 $key 1313 27 'value' 1314 28 'x ~ x''x}"x}" # 1315 29 <foo> <abx{ {{> <{}b> <c> <d{}> <bar> <}> <baz> . 1316 30 <foo> <b\ 1317 ar> <baz> . 1318 32 <foo> <bar> <baz> . 1319 33 <foo 'bar' baz> . 1320 34 <foo bar baz> . 1321 35 <a> <b> <x> <a> <b> . 1322 36 <a\ b> <x> <a\ b> . 1323 37 <a b> <x> <c d> . 1324 38 xay / x'a'y . 1325 39 x' / x' . 1326 40 < b c> . 1327--- 1328name: expand-unglob-dblq 1329description: 1330 Check that regular "${foo+bar}" constructs are parsed correctly 1331stdin: 1332 u=x 1333 tl_norm() { 1334 v=$2 1335 test x"$v" = x"-" && unset v 1336 (echo "$1 plus norm foo ${v+'bar'} baz") 1337 (echo "$1 dash norm foo ${v-'bar'} baz") 1338 (echo "$1 eqal norm foo ${v='bar'} baz") 1339 (echo "$1 qstn norm foo ${v?'bar'} baz") 2>/dev/null || \ 1340 echo "$1 qstn norm -> error" 1341 (echo "$1 PLUS norm foo ${v:+'bar'} baz") 1342 (echo "$1 DASH norm foo ${v:-'bar'} baz") 1343 (echo "$1 EQAL norm foo ${v:='bar'} baz") 1344 (echo "$1 QSTN norm foo ${v:?'bar'} baz") 2>/dev/null || \ 1345 echo "$1 QSTN norm -> error" 1346 } 1347 tl_paren() { 1348 v=$2 1349 test x"$v" = x"-" && unset v 1350 (echo "$1 plus parn foo ${v+(bar)} baz") 1351 (echo "$1 dash parn foo ${v-(bar)} baz") 1352 (echo "$1 eqal parn foo ${v=(bar)} baz") 1353 (echo "$1 qstn parn foo ${v?(bar)} baz") 2>/dev/null || \ 1354 echo "$1 qstn parn -> error" 1355 (echo "$1 PLUS parn foo ${v:+(bar)} baz") 1356 (echo "$1 DASH parn foo ${v:-(bar)} baz") 1357 (echo "$1 EQAL parn foo ${v:=(bar)} baz") 1358 (echo "$1 QSTN parn foo ${v:?(bar)} baz") 2>/dev/null || \ 1359 echo "$1 QSTN parn -> error" 1360 } 1361 tl_brace() { 1362 v=$2 1363 test x"$v" = x"-" && unset v 1364 (echo "$1 plus brac foo ${v+a$u{{{\}b} c ${v+d{}} baz") 1365 (echo "$1 dash brac foo ${v-a$u{{{\}b} c ${v-d{}} baz") 1366 (echo "$1 eqal brac foo ${v=a$u{{{\}b} c ${v=d{}} baz") 1367 (echo "$1 qstn brac foo ${v?a$u{{{\}b} c ${v?d{}} baz") 2>/dev/null || \ 1368 echo "$1 qstn brac -> error" 1369 (echo "$1 PLUS brac foo ${v:+a$u{{{\}b} c ${v:+d{}} baz") 1370 (echo "$1 DASH brac foo ${v:-a$u{{{\}b} c ${v:-d{}} baz") 1371 (echo "$1 EQAL brac foo ${v:=a$u{{{\}b} c ${v:=d{}} baz") 1372 (echo "$1 QSTN brac foo ${v:?a$u{{{\}b} c ${v:?d{}} baz") 2>/dev/null || \ 1373 echo "$1 QSTN brac -> error" 1374 } 1375 tl_norm 1 - 1376 tl_norm 2 '' 1377 tl_norm 3 x 1378 tl_paren 4 - 1379 tl_paren 5 '' 1380 tl_paren 6 x 1381 tl_brace 7 - 1382 tl_brace 8 '' 1383 tl_brace 9 x 1384expected-stdout: 1385 1 plus norm foo baz 1386 1 dash norm foo 'bar' baz 1387 1 eqal norm foo 'bar' baz 1388 1 qstn norm -> error 1389 1 PLUS norm foo baz 1390 1 DASH norm foo 'bar' baz 1391 1 EQAL norm foo 'bar' baz 1392 1 QSTN norm -> error 1393 2 plus norm foo 'bar' baz 1394 2 dash norm foo baz 1395 2 eqal norm foo baz 1396 2 qstn norm foo baz 1397 2 PLUS norm foo baz 1398 2 DASH norm foo 'bar' baz 1399 2 EQAL norm foo 'bar' baz 1400 2 QSTN norm -> error 1401 3 plus norm foo 'bar' baz 1402 3 dash norm foo x baz 1403 3 eqal norm foo x baz 1404 3 qstn norm foo x baz 1405 3 PLUS norm foo 'bar' baz 1406 3 DASH norm foo x baz 1407 3 EQAL norm foo x baz 1408 3 QSTN norm foo x baz 1409 4 plus parn foo baz 1410 4 dash parn foo (bar) baz 1411 4 eqal parn foo (bar) baz 1412 4 qstn parn -> error 1413 4 PLUS parn foo baz 1414 4 DASH parn foo (bar) baz 1415 4 EQAL parn foo (bar) baz 1416 4 QSTN parn -> error 1417 5 plus parn foo (bar) baz 1418 5 dash parn foo baz 1419 5 eqal parn foo baz 1420 5 qstn parn foo baz 1421 5 PLUS parn foo baz 1422 5 DASH parn foo (bar) baz 1423 5 EQAL parn foo (bar) baz 1424 5 QSTN parn -> error 1425 6 plus parn foo (bar) baz 1426 6 dash parn foo x baz 1427 6 eqal parn foo x baz 1428 6 qstn parn foo x baz 1429 6 PLUS parn foo (bar) baz 1430 6 DASH parn foo x baz 1431 6 EQAL parn foo x baz 1432 6 QSTN parn foo x baz 1433 7 plus brac foo c } baz 1434 7 dash brac foo ax{{{}b c d{} baz 1435 7 eqal brac foo ax{{{}b c ax{{{}b} baz 1436 7 qstn brac -> error 1437 7 PLUS brac foo c } baz 1438 7 DASH brac foo ax{{{}b c d{} baz 1439 7 EQAL brac foo ax{{{}b c ax{{{}b} baz 1440 7 QSTN brac -> error 1441 8 plus brac foo ax{{{}b c d{} baz 1442 8 dash brac foo c } baz 1443 8 eqal brac foo c } baz 1444 8 qstn brac foo c } baz 1445 8 PLUS brac foo c } baz 1446 8 DASH brac foo ax{{{}b c d{} baz 1447 8 EQAL brac foo ax{{{}b c ax{{{}b} baz 1448 8 QSTN brac -> error 1449 9 plus brac foo ax{{{}b c d{} baz 1450 9 dash brac foo x c x} baz 1451 9 eqal brac foo x c x} baz 1452 9 qstn brac foo x c x} baz 1453 9 PLUS brac foo ax{{{}b c d{} baz 1454 9 DASH brac foo x c x} baz 1455 9 EQAL brac foo x c x} baz 1456 9 QSTN brac foo x c x} baz 1457--- 1458name: expand-unglob-unq 1459description: 1460 Check that regular ${foo+bar} constructs are parsed correctly 1461stdin: 1462 u=x 1463 tl_norm() { 1464 v=$2 1465 test x"$v" = x"-" && unset v 1466 (echo $1 plus norm foo ${v+'bar'} baz) 1467 (echo $1 dash norm foo ${v-'bar'} baz) 1468 (echo $1 eqal norm foo ${v='bar'} baz) 1469 (echo $1 qstn norm foo ${v?'bar'} baz) 2>/dev/null || \ 1470 echo "$1 qstn norm -> error" 1471 (echo $1 PLUS norm foo ${v:+'bar'} baz) 1472 (echo $1 DASH norm foo ${v:-'bar'} baz) 1473 (echo $1 EQAL norm foo ${v:='bar'} baz) 1474 (echo $1 QSTN norm foo ${v:?'bar'} baz) 2>/dev/null || \ 1475 echo "$1 QSTN norm -> error" 1476 } 1477 tl_paren() { 1478 v=$2 1479 test x"$v" = x"-" && unset v 1480 (echo $1 plus parn foo ${v+\(bar')'} baz) 1481 (echo $1 dash parn foo ${v-\(bar')'} baz) 1482 (echo $1 eqal parn foo ${v=\(bar')'} baz) 1483 (echo $1 qstn parn foo ${v?\(bar')'} baz) 2>/dev/null || \ 1484 echo "$1 qstn parn -> error" 1485 (echo $1 PLUS parn foo ${v:+\(bar')'} baz) 1486 (echo $1 DASH parn foo ${v:-\(bar')'} baz) 1487 (echo $1 EQAL parn foo ${v:=\(bar')'} baz) 1488 (echo $1 QSTN parn foo ${v:?\(bar')'} baz) 2>/dev/null || \ 1489 echo "$1 QSTN parn -> error" 1490 } 1491 tl_brace() { 1492 v=$2 1493 test x"$v" = x"-" && unset v 1494 (echo $1 plus brac foo ${v+a$u{{{\}b} c ${v+d{}} baz) 1495 (echo $1 dash brac foo ${v-a$u{{{\}b} c ${v-d{}} baz) 1496 (echo $1 eqal brac foo ${v=a$u{{{\}b} c ${v=d{}} baz) 1497 (echo $1 qstn brac foo ${v?a$u{{{\}b} c ${v?d{}} baz) 2>/dev/null || \ 1498 echo "$1 qstn brac -> error" 1499 (echo $1 PLUS brac foo ${v:+a$u{{{\}b} c ${v:+d{}} baz) 1500 (echo $1 DASH brac foo ${v:-a$u{{{\}b} c ${v:-d{}} baz) 1501 (echo $1 EQAL brac foo ${v:=a$u{{{\}b} c ${v:=d{}} baz) 1502 (echo $1 QSTN brac foo ${v:?a$u{{{\}b} c ${v:?d{}} baz) 2>/dev/null || \ 1503 echo "$1 QSTN brac -> error" 1504 } 1505 tl_norm 1 - 1506 tl_norm 2 '' 1507 tl_norm 3 x 1508 tl_paren 4 - 1509 tl_paren 5 '' 1510 tl_paren 6 x 1511 tl_brace 7 - 1512 tl_brace 8 '' 1513 tl_brace 9 x 1514expected-stdout: 1515 1 plus norm foo baz 1516 1 dash norm foo bar baz 1517 1 eqal norm foo bar baz 1518 1 qstn norm -> error 1519 1 PLUS norm foo baz 1520 1 DASH norm foo bar baz 1521 1 EQAL norm foo bar baz 1522 1 QSTN norm -> error 1523 2 plus norm foo bar baz 1524 2 dash norm foo baz 1525 2 eqal norm foo baz 1526 2 qstn norm foo baz 1527 2 PLUS norm foo baz 1528 2 DASH norm foo bar baz 1529 2 EQAL norm foo bar baz 1530 2 QSTN norm -> error 1531 3 plus norm foo bar baz 1532 3 dash norm foo x baz 1533 3 eqal norm foo x baz 1534 3 qstn norm foo x baz 1535 3 PLUS norm foo bar baz 1536 3 DASH norm foo x baz 1537 3 EQAL norm foo x baz 1538 3 QSTN norm foo x baz 1539 4 plus parn foo baz 1540 4 dash parn foo (bar) baz 1541 4 eqal parn foo (bar) baz 1542 4 qstn parn -> error 1543 4 PLUS parn foo baz 1544 4 DASH parn foo (bar) baz 1545 4 EQAL parn foo (bar) baz 1546 4 QSTN parn -> error 1547 5 plus parn foo (bar) baz 1548 5 dash parn foo baz 1549 5 eqal parn foo baz 1550 5 qstn parn foo baz 1551 5 PLUS parn foo baz 1552 5 DASH parn foo (bar) baz 1553 5 EQAL parn foo (bar) baz 1554 5 QSTN parn -> error 1555 6 plus parn foo (bar) baz 1556 6 dash parn foo x baz 1557 6 eqal parn foo x baz 1558 6 qstn parn foo x baz 1559 6 PLUS parn foo (bar) baz 1560 6 DASH parn foo x baz 1561 6 EQAL parn foo x baz 1562 6 QSTN parn foo x baz 1563 7 plus brac foo c } baz 1564 7 dash brac foo ax{{{}b c d{} baz 1565 7 eqal brac foo ax{{{}b c ax{{{}b} baz 1566 7 qstn brac -> error 1567 7 PLUS brac foo c } baz 1568 7 DASH brac foo ax{{{}b c d{} baz 1569 7 EQAL brac foo ax{{{}b c ax{{{}b} baz 1570 7 QSTN brac -> error 1571 8 plus brac foo ax{{{}b c d{} baz 1572 8 dash brac foo c } baz 1573 8 eqal brac foo c } baz 1574 8 qstn brac foo c } baz 1575 8 PLUS brac foo c } baz 1576 8 DASH brac foo ax{{{}b c d{} baz 1577 8 EQAL brac foo ax{{{}b c ax{{{}b} baz 1578 8 QSTN brac -> error 1579 9 plus brac foo ax{{{}b c d{} baz 1580 9 dash brac foo x c x} baz 1581 9 eqal brac foo x c x} baz 1582 9 qstn brac foo x c x} baz 1583 9 PLUS brac foo ax{{{}b c d{} baz 1584 9 DASH brac foo x c x} baz 1585 9 EQAL brac foo x c x} baz 1586 9 QSTN brac foo x c x} baz 1587--- 1588name: expand-threecolons-dblq 1589description: 1590 Check for a particular thing that used to segfault 1591stdin: 1592 TEST=1234 1593 echo "${TEST:1:2:3}" 1594 echo $? but still living 1595expected-stderr-pattern: 1596 /bad substitution/ 1597expected-exit: 1 1598--- 1599name: expand-threecolons-unq 1600description: 1601 Check for a particular thing that used to not error out 1602stdin: 1603 TEST=1234 1604 echo ${TEST:1:2:3} 1605 echo $? but still living 1606expected-stderr-pattern: 1607 /bad substitution/ 1608expected-exit: 1 1609--- 1610name: expand-weird-1 1611description: 1612 Check corner case of trim expansion vs. $# vs. ${#var} 1613stdin: 1614 set 1 2 3 4 5 6 7 8 9 10 11 1615 echo ${#} # value of $# 1616 echo ${##} # length of $# 1617 echo ${##1} # $# trimmed 1 1618 set 1 2 3 4 5 6 7 8 9 10 11 12 1619 echo ${##1} 1620expected-stdout: 1621 11 1622 2 1623 1 1624 2 1625--- 1626name: expand-weird-2 1627description: 1628 Check corner case of ${var?} vs. ${#var} 1629stdin: 1630 (exit 0) 1631 echo $? = ${#?} . 1632 (exit 111) 1633 echo $? = ${#?} . 1634expected-stdout: 1635 0 = 1 . 1636 111 = 3 . 1637--- 1638name: expand-weird-3 1639description: 1640 Check that trimming works with positional parameters (Debian #48453) 1641stdin: 1642 A=9999-02 1643 B=9999 1644 echo 1=${A#$B?}. 1645 set -- $A $B 1646 echo 2=${1#$2?}. 1647expected-stdout: 1648 1=02. 1649 2=02. 1650--- 1651name: expand-number-1 1652description: 1653 Check that positional arguments do not overflow 1654stdin: 1655 echo "1 ${12345678901234567890} ." 1656expected-stdout: 1657 1 . 1658--- 1659name: eglob-bad-1 1660description: 1661 Check that globbing isn't done when glob has syntax error 1662file-setup: file 644 "abcx" 1663file-setup: file 644 "abcz" 1664file-setup: file 644 "bbc" 1665stdin: 1666 echo !([*)* 1667 echo +(a|b[)* 1668expected-stdout: 1669 !([*)* 1670 +(a|b[)* 1671--- 1672name: eglob-bad-2 1673description: 1674 Check that globbing isn't done when glob has syntax error 1675 (AT&T ksh fails this test) 1676file-setup: file 644 "abcx" 1677file-setup: file 644 "abcz" 1678file-setup: file 644 "bbc" 1679stdin: 1680 echo [a*(]*)z 1681expected-stdout: 1682 [a*(]*)z 1683--- 1684name: eglob-infinite-plus 1685description: 1686 Check that shell doesn't go into infinite loop expanding +(...) 1687 expressions. 1688file-setup: file 644 "abc" 1689time-limit: 3 1690stdin: 1691 echo +()c 1692 echo +()x 1693 echo +(*)c 1694 echo +(*)x 1695expected-stdout: 1696 +()c 1697 +()x 1698 abc 1699 +(*)x 1700--- 1701name: eglob-subst-1 1702description: 1703 Check that eglobbing isn't done on substitution results 1704file-setup: file 644 "abc" 1705stdin: 1706 x='@(*)' 1707 echo $x 1708expected-stdout: 1709 @(*) 1710--- 1711name: eglob-nomatch-1 1712description: 1713 Check that the pattern doesn't match 1714stdin: 1715 echo 1: no-file+(a|b)stuff 1716 echo 2: no-file+(a*(c)|b)stuff 1717 echo 3: no-file+((((c)))|b)stuff 1718expected-stdout: 1719 1: no-file+(a|b)stuff 1720 2: no-file+(a*(c)|b)stuff 1721 3: no-file+((((c)))|b)stuff 1722--- 1723name: eglob-match-1 1724description: 1725 Check that the pattern matches correctly 1726file-setup: file 644 "abd" 1727file-setup: file 644 "acd" 1728file-setup: file 644 "abac" 1729stdin: 1730 echo 1: a+(b|c)d 1731 echo 2: a!(@(b|B))d 1732 echo 3: *(a(b|c)) # (...|...) can be used within X(..) 1733 echo 4: a[b*(foo|bar)]d # patterns not special inside [...] 1734expected-stdout: 1735 1: abd acd 1736 2: acd 1737 3: abac 1738 4: abd 1739--- 1740name: eglob-case-1 1741description: 1742 Simple negation tests 1743stdin: 1744 case foo in !(foo|bar)) echo yes;; *) echo no;; esac 1745 case bar in !(foo|bar)) echo yes;; *) echo no;; esac 1746expected-stdout: 1747 no 1748 no 1749--- 1750name: eglob-case-2 1751description: 1752 Simple kleene tests 1753stdin: 1754 case foo in *(a|b[)) echo yes;; *) echo no;; esac 1755 case foo in *(a|b[)|f*) echo yes;; *) echo no;; esac 1756 case '*(a|b[)' in *(a|b[)) echo yes;; *) echo no;; esac 1757expected-stdout: 1758 no 1759 yes 1760 yes 1761--- 1762name: eglob-trim-1 1763description: 1764 Eglobbing in trim expressions... 1765 (AT&T ksh fails this - docs say # matches shortest string, ## matches 1766 longest...) 1767stdin: 1768 x=abcdef 1769 echo 1: ${x#a|abc} 1770 echo 2: ${x##a|abc} 1771 echo 3: ${x%def|f} 1772 echo 4: ${x%%f|def} 1773expected-stdout: 1774 1: bcdef 1775 2: def 1776 3: abcde 1777 4: abc 1778--- 1779name: eglob-trim-2 1780description: 1781 Check eglobbing works in trims... 1782stdin: 1783 x=abcdef 1784 echo 1: ${x#*(a|b)cd} 1785 echo 2: "${x#*(a|b)cd}" 1786 echo 3: ${x#"*(a|b)cd"} 1787 echo 4: ${x#a(b|c)} 1788expected-stdout: 1789 1: ef 1790 2: ef 1791 3: abcdef 1792 4: cdef 1793--- 1794name: eglob-trim-3 1795description: 1796 Check eglobbing works in trims, for Korn Shell 1797 Ensure eglobbing does not work for reduced-feature /bin/sh 1798stdin: 1799 set +o sh 1800 x=foobar 1801 y=foobaz 1802 z=fooba\? 1803 echo "<${x%bar|baz},${y%bar|baz},${z%\?}>" 1804 echo "<${x%ba(r|z)},${y%ba(r|z)}>" 1805 set -o sh 1806 echo "<${x%bar|baz},${y%bar|baz},${z%\?}>" 1807 z='foo(bar' 1808 echo "<${z%(*}>" 1809expected-stdout: 1810 <foo,foo,fooba> 1811 <foo,foo> 1812 <foobar,foobaz,fooba> 1813 <foo> 1814--- 1815name: eglob-substrpl-1 1816description: 1817 Check eglobbing works in substs... and they work at all 1818stdin: 1819 [[ -n $BASH_VERSION ]] && shopt -s extglob 1820 x=1222321_ab/cde_b/c_1221 1821 y=xyz 1822 echo 1: ${x/2} 1823 echo 2: ${x//2} 1824 echo 3: ${x/+(2)} 1825 echo 4: ${x//+(2)} 1826 echo 5: ${x/2/4} 1827 echo 6: ${x//2/4} 1828 echo 7: ${x/+(2)/4} 1829 echo 8: ${x//+(2)/4} 1830 echo 9: ${x/b/c/e/f} 1831 echo 10: ${x/b\/c/e/f} 1832 echo 11: ${x/b\/c/e\/f} 1833 echo 12: ${x/b\/c/e\\/f} 1834 echo 13: ${x/b\\/c/e\\/f} 1835 echo 14: ${x//b/c/e/f} 1836 echo 15: ${x//b\/c/e/f} 1837 echo 16: ${x//b\/c/e\/f} 1838 echo 17: ${x//b\/c/e\\/f} 1839 echo 18: ${x//b\\/c/e\\/f} 1840 echo 19: ${x/b\/*\/c/x} 1841 echo 20: ${x/\//.} 1842 echo 21: ${x//\//.} 1843 echo 22: ${x///.} 1844 echo 23: ${x//#1/9} 1845 echo 24: ${x//%1/9} 1846 echo 25: ${x//\%1/9} 1847 echo 26: ${x//\\%1/9} 1848 echo 27: ${x//\a/9} 1849 echo 28: ${x//\\a/9} 1850 echo 29: ${x/2/$y} 1851expected-stdout: 1852 1: 122321_ab/cde_b/c_1221 1853 2: 131_ab/cde_b/c_11 1854 3: 1321_ab/cde_b/c_1221 1855 4: 131_ab/cde_b/c_11 1856 5: 1422321_ab/cde_b/c_1221 1857 6: 1444341_ab/cde_b/c_1441 1858 7: 14321_ab/cde_b/c_1221 1859 8: 14341_ab/cde_b/c_141 1860 9: 1222321_ac/e/f/cde_b/c_1221 1861 10: 1222321_ae/fde_b/c_1221 1862 11: 1222321_ae/fde_b/c_1221 1863 12: 1222321_ae\/fde_b/c_1221 1864 13: 1222321_ab/cde_b/c_1221 1865 14: 1222321_ac/e/f/cde_c/e/f/c_1221 1866 15: 1222321_ae/fde_e/f_1221 1867 16: 1222321_ae/fde_e/f_1221 1868 17: 1222321_ae\/fde_e\/f_1221 1869 18: 1222321_ab/cde_b/c_1221 1870 19: 1222321_ax_1221 1871 20: 1222321_ab.cde_b/c_1221 1872 21: 1222321_ab.cde_b.c_1221 1873 22: 1222321_ab/cde_b/c_1221 1874 23: 9222321_ab/cde_b/c_1221 1875 24: 1222321_ab/cde_b/c_1229 1876 25: 1222321_ab/cde_b/c_1229 1877 26: 1222321_ab/cde_b/c_1221 1878 27: 1222321_9b/cde_b/c_1221 1879 28: 1222321_9b/cde_b/c_1221 1880 29: 1xyz22321_ab/cde_b/c_1221 1881--- 1882name: eglob-substrpl-2 1883description: 1884 Check anchored substring replacement works, corner cases 1885stdin: 1886 foo=123 1887 echo 1: ${foo/#/x} 1888 echo 2: ${foo/%/x} 1889 echo 3: ${foo/#/} 1890 echo 4: ${foo/#} 1891 echo 5: ${foo/%/} 1892 echo 6: ${foo/%} 1893expected-stdout: 1894 1: x123 1895 2: 123x 1896 3: 123 1897 4: 123 1898 5: 123 1899 6: 123 1900--- 1901name: eglob-substrpl-3a 1902description: 1903 Check substring replacement works with variables and slashes, too 1904stdin: 1905 pfx=/home/user 1906 wd=/home/user/tmp 1907 echo "${wd/#$pfx/~}" 1908 echo "${wd/#\$pfx/~}" 1909 echo "${wd/#"$pfx"/~}" 1910 echo "${wd/#'$pfx'/~}" 1911 echo "${wd/#"\$pfx"/~}" 1912 echo "${wd/#'\$pfx'/~}" 1913expected-stdout: 1914 ~/tmp 1915 /home/user/tmp 1916 ~/tmp 1917 /home/user/tmp 1918 /home/user/tmp 1919 /home/user/tmp 1920--- 1921name: eglob-substrpl-3b 1922description: 1923 More of this, bash fails it (bash4 passes) 1924stdin: 1925 pfx=/home/user 1926 wd=/home/user/tmp 1927 echo "${wd/#$(echo /home/user)/~}" 1928 echo "${wd/#"$(echo /home/user)"/~}" 1929 echo "${wd/#'$(echo /home/user)'/~}" 1930expected-stdout: 1931 ~/tmp 1932 ~/tmp 1933 /home/user/tmp 1934--- 1935name: eglob-substrpl-3c 1936description: 1937 Even more weird cases 1938stdin: 1939 pfx=/home/user 1940 wd='$pfx/tmp' 1941 echo 1: ${wd/#$pfx/~} 1942 echo 2: ${wd/#\$pfx/~} 1943 echo 3: ${wd/#"$pfx"/~} 1944 echo 4: ${wd/#'$pfx'/~} 1945 echo 5: ${wd/#"\$pfx"/~} 1946 echo 6: ${wd/#'\$pfx'/~} 1947 ts='a/ba/b$tp$tp_a/b$tp_*(a/b)_*($tp)' 1948 tp=a/b 1949 tr=c/d 1950 [[ -n $BASH_VERSION ]] && shopt -s extglob 1951 echo 7: ${ts/a\/b/$tr} 1952 echo 8: ${ts/a\/b/\$tr} 1953 echo 9: ${ts/$tp/$tr} 1954 echo 10: ${ts/\$tp/$tr} 1955 echo 11: ${ts/\\$tp/$tr} 1956 echo 12: ${ts/$tp/c/d} 1957 echo 13: ${ts/$tp/c\/d} 1958 echo 14: ${ts/$tp/c\\/d} 1959 echo 15: ${ts/+(a\/b)/$tr} 1960 echo 16: ${ts/+(a\/b)/\$tr} 1961 echo 17: ${ts/+($tp)/$tr} 1962 echo 18: ${ts/+($tp)/c/d} 1963 echo 19: ${ts/+($tp)/c\/d} 1964 echo 25: ${ts//a\/b/$tr} 1965 echo 26: ${ts//a\/b/\$tr} 1966 echo 27: ${ts//$tp/$tr} 1967 echo 28: ${ts//$tp/c/d} 1968 echo 29: ${ts//$tp/c\/d} 1969 echo 30: ${ts//+(a\/b)/$tr} 1970 echo 31: ${ts//+(a\/b)/\$tr} 1971 echo 32: ${ts//+($tp)/$tr} 1972 echo 33: ${ts//+($tp)/c/d} 1973 echo 34: ${ts//+($tp)/c\/d} 1974 tp="+($tp)" 1975 echo 40: ${ts/$tp/$tr} 1976 echo 41: ${ts//$tp/$tr} 1977expected-stdout: 1978 1: $pfx/tmp 1979 2: ~/tmp 1980 3: $pfx/tmp 1981 4: ~/tmp 1982 5: ~/tmp 1983 6: ~/tmp 1984 7: c/da/b$tp$tp_a/b$tp_*(a/b)_*($tp) 1985 8: $tra/b$tp$tp_a/b$tp_*(a/b)_*($tp) 1986 9: c/da/b$tp$tp_a/b$tp_*(a/b)_*($tp) 1987 10: a/ba/bc/d$tp_a/b$tp_*(a/b)_*($tp) 1988 11: c/da/b$tp$tp_a/b$tp_*(a/b)_*($tp) 1989 12: c/da/b$tp$tp_a/b$tp_*(a/b)_*($tp) 1990 13: c/da/b$tp$tp_a/b$tp_*(a/b)_*($tp) 1991 14: c\/da/b$tp$tp_a/b$tp_*(a/b)_*($tp) 1992 15: c/d$tp$tp_a/b$tp_*(a/b)_*($tp) 1993 16: $tr$tp$tp_a/b$tp_*(a/b)_*($tp) 1994 17: c/d$tp$tp_a/b$tp_*(a/b)_*($tp) 1995 18: c/d$tp$tp_a/b$tp_*(a/b)_*($tp) 1996 19: c/d$tp$tp_a/b$tp_*(a/b)_*($tp) 1997 25: c/dc/d$tp$tp_c/d$tp_*(c/d)_*($tp) 1998 26: $tr$tr$tp$tp_$tr$tp_*($tr)_*($tp) 1999 27: c/dc/d$tp$tp_c/d$tp_*(c/d)_*($tp) 2000 28: c/dc/d$tp$tp_c/d$tp_*(c/d)_*($tp) 2001 29: c/dc/d$tp$tp_c/d$tp_*(c/d)_*($tp) 2002 30: c/d$tp$tp_c/d$tp_*(c/d)_*($tp) 2003 31: $tr$tp$tp_$tr$tp_*($tr)_*($tp) 2004 32: c/d$tp$tp_c/d$tp_*(c/d)_*($tp) 2005 33: c/d$tp$tp_c/d$tp_*(c/d)_*($tp) 2006 34: c/d$tp$tp_c/d$tp_*(c/d)_*($tp) 2007 40: a/ba/b$tp$tp_a/b$tp_*(a/b)_*($tp) 2008 41: a/ba/b$tp$tp_a/b$tp_*(a/b)_*($tp) 2009# This is what GNU bash does: 2010# 40: c/d$tp$tp_a/b$tp_*(a/b)_*($tp) 2011# 41: c/d$tp$tp_c/d$tp_*(c/d)_*($tp) 2012--- 2013name: eglob-utf8-1 2014description: 2015 UTF-8 mode differences for eglobbing 2016stdin: 2017 s=blöd 2018 set +U 2019 print 1: ${s%???} . 2020 print 2: ${s/b???d/x} . 2021 set -U 2022 print 3: ${s%???} . 2023 print 4: ${s/b??d/x} . 2024 x=nö 2025 print 5: ${x%?} ${x%%?} . 2026 x=äh 2027 print 6: ${x#?} ${x##?} . 2028 x=�� 2029 print 7: ${x%?} ${x%%?} . 2030 x=mä� 2031 print 8: ${x%?} ${x%%?} . 2032 x=何 2033 print 9: ${x%?} ${x%%?} . 2034expected-stdout: 2035 1: bl . 2036 2: x . 2037 3: b . 2038 4: x . 2039 5: n n . 2040 6: h h . 2041 7: � � . 2042 8: mä mä . 2043 9: . 2044--- 2045name: glob-bad-1 2046description: 2047 Check that globbing isn't done when glob has syntax error 2048file-setup: dir 755 "[x" 2049file-setup: file 644 "[x/foo" 2050stdin: 2051 echo [* 2052 echo *[x 2053 echo [x/* 2054expected-stdout: 2055 [* 2056 *[x 2057 [x/foo 2058--- 2059name: glob-bad-2 2060description: 2061 Check that symbolic links aren't stat()'d 2062# breaks on FreeMiNT (cannot unlink dangling symlinks) 2063# breaks on MSYS (does not support symlinks) 2064# breaks on Dell UNIX 4.0 R2.2 (SVR4) where unlink also fails 2065category: !os:mint,!os:msys,!os:svr4.0,!nosymlink 2066file-setup: dir 755 "dir" 2067file-setup: symlink 644 "dir/abc" 2068 non-existent-file 2069stdin: 2070 echo d*/* 2071 echo d*/abc 2072expected-stdout: 2073 dir/abc 2074 dir/abc 2075--- 2076name: glob-range-1 2077description: 2078 Test range matching 2079file-setup: file 644 ".bc" 2080file-setup: file 644 "abc" 2081file-setup: file 644 "bbc" 2082file-setup: file 644 "cbc" 2083file-setup: file 644 "-bc" 2084stdin: 2085 echo [ab-]* 2086 echo [-ab]* 2087 echo [!-ab]* 2088 echo [!ab]* 2089 echo []ab]* 2090 :>'./!bc' 2091 :>'./^bc' 2092 echo [^ab]* 2093 echo [!ab]* 2094expected-stdout: 2095 -bc abc bbc 2096 -bc abc bbc 2097 cbc 2098 -bc cbc 2099 abc bbc 2100 ^bc abc bbc 2101 !bc -bc ^bc cbc 2102--- 2103name: glob-range-2 2104description: 2105 Test range matching 2106 (AT&T ksh fails this; POSIX says invalid) 2107file-setup: file 644 "abc" 2108stdin: 2109 echo [a--]* 2110expected-stdout: 2111 [a--]* 2112--- 2113name: glob-range-3 2114description: 2115 Check that globbing matches the right things... 2116# breaks on Mac OSX (HFS+ non-standard Unicode canonical decomposition) 2117# breaks on Cygwin 1.7 (files are now UTF-16 or something) 2118# breaks on QNX 6.4.1 (says RT) 2119category: !os:cygwin,!os:darwin,!os:msys,!os:nto 2120need-pass: no 2121file-setup: file 644 "a�c" 2122stdin: 2123 echo a[�-�]* 2124expected-stdout: 2125 a�c 2126--- 2127name: glob-range-4 2128description: 2129 Results unspecified according to POSIX 2130file-setup: file 644 ".bc" 2131stdin: 2132 echo [a.]* 2133expected-stdout: 2134 [a.]* 2135--- 2136name: glob-range-5 2137description: 2138 Results unspecified according to POSIX 2139 (AT&T ksh treats this like [a-cc-e]*) 2140file-setup: file 644 "abc" 2141file-setup: file 644 "bbc" 2142file-setup: file 644 "cbc" 2143file-setup: file 644 "dbc" 2144file-setup: file 644 "ebc" 2145file-setup: file 644 "-bc" 2146stdin: 2147 echo [a-c-e]* 2148expected-stdout: 2149 -bc abc bbc cbc ebc 2150--- 2151name: glob-trim-1 2152description: 2153 Check against a regression from fixing IFS-subst-2 2154stdin: 2155 x='#foo' 2156 print -r "before='$x'" 2157 x=${x%%#*} 2158 print -r "after ='$x'" 2159expected-stdout: 2160 before='#foo' 2161 after ='' 2162--- 2163name: heredoc-1 2164description: 2165 Check ordering/content of redundent here documents. 2166stdin: 2167 cat << EOF1 << EOF2 2168 hi 2169 EOF1 2170 there 2171 EOF2 2172expected-stdout: 2173 there 2174--- 2175name: heredoc-2 2176description: 2177 Check quoted here-doc is protected. 2178stdin: 2179 a=foo 2180 cat << 'EOF' 2181 hi\ 2182 there$a 2183 stuff 2184 EO\ 2185 F 2186 EOF 2187expected-stdout: 2188 hi\ 2189 there$a 2190 stuff 2191 EO\ 2192 F 2193--- 2194name: heredoc-3 2195description: 2196 Check that newline isn't needed after heredoc-delimiter marker. 2197stdin: ! 2198 cat << EOF 2199 hi 2200 there 2201 EOF 2202expected-stdout: 2203 hi 2204 there 2205--- 2206name: heredoc-4 2207description: 2208 Check that an error occurs if the heredoc-delimiter is missing. 2209stdin: ! 2210 cat << EOF 2211 hi 2212 there 2213expected-exit: e > 0 2214expected-stderr-pattern: /.*/ 2215--- 2216name: heredoc-5 2217description: 2218 Check that backslash quotes a $, ` and \ and kills a \newline 2219stdin: 2220 a=BAD 2221 b=ok 2222 cat << EOF 2223 h\${a}i 2224 h\\${b}i 2225 th\`echo not-run\`ere 2226 th\\`echo is-run`ere 2227 fol\\ks 2228 more\\ 2229 last \ 2230 line 2231 EOF 2232expected-stdout: 2233 h${a}i 2234 h\oki 2235 th`echo not-run`ere 2236 th\is-runere 2237 fol\ks 2238 more\ 2239 last line 2240--- 2241name: heredoc-6 2242description: 2243 Check that \newline in initial here-delim word doesn't imply 2244 a quoted here-doc. 2245stdin: 2246 a=i 2247 cat << EO\ 2248 F 2249 h$a 2250 there 2251 EOF 2252expected-stdout: 2253 hi 2254 there 2255--- 2256name: heredoc-7 2257description: 2258 Check that double quoted $ expressions in here delimiters are 2259 not expanded and match the delimiter. 2260 POSIX says only quote removal is applied to the delimiter. 2261stdin: 2262 a=b 2263 cat << "E$a" 2264 hi 2265 h$a 2266 hb 2267 E$a 2268 echo done 2269expected-stdout: 2270 hi 2271 h$a 2272 hb 2273 done 2274--- 2275name: heredoc-8 2276description: 2277 Check that double quoted escaped $ expressions in here 2278 delimiters are not expanded and match the delimiter. 2279 POSIX says only quote removal is applied to the delimiter 2280 (\ counts as a quote). 2281stdin: 2282 a=b 2283 cat << "E\$a" 2284 hi 2285 h$a 2286 h\$a 2287 hb 2288 h\b 2289 E$a 2290 echo done 2291expected-stdout: 2292 hi 2293 h$a 2294 h\$a 2295 hb 2296 h\b 2297 done 2298--- 2299name: heredoc-9a 2300description: 2301 Check that here strings work. 2302stdin: 2303 bar="bar 2304 baz" 2305 tr abcdefghijklmnopqrstuvwxyz nopqrstuvwxyzabcdefghijklm <<<foo 2306 "$__progname" -c "tr abcdefghijklmnopqrstuvwxyz nopqrstuvwxyzabcdefghijklm <<<foo" 2307 tr abcdefghijklmnopqrstuvwxyz nopqrstuvwxyzabcdefghijklm <<<"$bar" 2308 tr abcdefghijklmnopqrstuvwxyz nopqrstuvwxyzabcdefghijklm <<<'$bar' 2309 tr abcdefghijklmnopqrstuvwxyz nopqrstuvwxyzabcdefghijklm <<<\$bar 2310 tr abcdefghijklmnopqrstuvwxyz nopqrstuvwxyzabcdefghijklm <<<-foo 2311 tr abcdefghijklmnopqrstuvwxyz nopqrstuvwxyzabcdefghijklm <<<"$(echo "foo bar")" 2312expected-stdout: 2313 sbb 2314 sbb 2315 one 2316 onm 2317 $one 2318 $one 2319 -sbb 2320 sbb one 2321--- 2322name: heredoc-9b 2323description: 2324 Check that a corner case of here strings works like bash 2325stdin: 2326 fnord=42 2327 bar="bar 2328 \$fnord baz" 2329 tr abcdefghijklmnopqrstuvwxyz nopqrstuvwxyzabcdefghijklm <<<$bar 2330expected-stdout: 2331 one $sabeq onm 2332category: bash 2333--- 2334name: heredoc-9c 2335description: 2336 Check that a corner case of here strings works like ksh93, zsh 2337stdin: 2338 fnord=42 2339 bar="bar 2340 \$fnord baz" 2341 tr abcdefghijklmnopqrstuvwxyz nopqrstuvwxyzabcdefghijklm <<<$bar 2342expected-stdout: 2343 one 2344 $sabeq onm 2345--- 2346name: heredoc-9d 2347description: 2348 Check another corner case of here strings 2349stdin: 2350 tr abcdefghijklmnopqrstuvwxyz nopqrstuvwxyzabcdefghijklm <<< bar 2351expected-stdout: 2352 one 2353--- 2354name: heredoc-9e 2355description: 2356 Check here string related regression with multiple iops 2357stdin: 2358 echo $(tr r z <<<'bar' 2>/dev/null) 2359expected-stdout: 2360 baz 2361--- 2362name: heredoc-10 2363description: 2364 Check direct here document assignment 2365stdin: 2366 x=u 2367 va=<<EOF 2368 =a $x \x40= 2369 EOF 2370 vb=<<'EOF' 2371 =b $x \x40= 2372 EOF 2373 function foo { 2374 vc=<<-EOF 2375 =c $x \x40= 2376 EOF 2377 } 2378 fnd=$(typeset -f foo) 2379 print -r -- "$fnd" 2380 function foo { 2381 echo blub 2382 } 2383 foo 2384 eval "$fnd" 2385 foo 2386 # rather nonsensical, but… 2387 vd=<<<"=d $x \x40=" 2388 ve=<<<'=e $x \x40=' 2389 vf=<<<$'=f $x \x40=' 2390 # now check 2391 print -r -- "| va={$va} vb={$vb} vc={$vc} vd={$vd} ve={$ve} vf={$vf} |" 2392expected-stdout: 2393 function foo { 2394 vc=<<-EOF 2395 =c $x \x40= 2396 EOF 2397 2398 } 2399 blub 2400 | va={=a u \x40= 2401 } vb={=b $x \x40= 2402 } vc={=c u \x40= 2403 } vd={=d u \x40= 2404 } ve={=e $x \x40= 2405 } vf={=f $x @= 2406 } | 2407--- 2408name: heredoc-11 2409description: 2410 Check here documents with no or empty delimiter 2411stdin: 2412 x=u 2413 va=<< 2414 =a $x \x40= 2415 << 2416 vb=<<'' 2417 =b $x \x40= 2418 2419 function foo { 2420 vc=<<- 2421 =c $x \x40= 2422 << 2423 vd=<<-'' 2424 =d $x \x40= 2425 2426 } 2427 fnd=$(typeset -f foo) 2428 print -r -- "$fnd" 2429 function foo { 2430 echo blub 2431 } 2432 foo 2433 eval "$fnd" 2434 foo 2435 print -r -- "| va={$va} vb={$vb} vc={$vc} vd={$vd} |" 2436expected-stdout: 2437 function foo { 2438 vc=<<- 2439 =c $x \x40= 2440 << 2441 2442 vd=<<-"" 2443 =d $x \x40= 2444 2445 2446 } 2447 blub 2448 | va={=a u \x40= 2449 } vb={=b $x \x40= 2450 } vc={=c u \x40= 2451 } vd={=d $x \x40= 2452 } | 2453--- 2454name: heredoc-comsub-1 2455description: 2456 Tests for here documents in COMSUB, taken from Austin ML 2457stdin: 2458 text=$(cat <<EOF 2459 here is the text 2460 EOF) 2461 echo = $text = 2462expected-stdout: 2463 = here is the text = 2464--- 2465name: heredoc-comsub-2 2466description: 2467 Tests for here documents in COMSUB, taken from Austin ML 2468stdin: 2469 unbalanced=$(cat <<EOF 2470 this paren ) is a problem 2471 EOF) 2472 echo = $unbalanced = 2473expected-stdout: 2474 = this paren ) is a problem = 2475--- 2476name: heredoc-comsub-3 2477description: 2478 Tests for here documents in COMSUB, taken from Austin ML 2479stdin: 2480 balanced=$(cat <<EOF 2481 these parens ( ) are not a problem 2482 EOF) 2483 echo = $balanced = 2484expected-stdout: 2485 = these parens ( ) are not a problem = 2486--- 2487name: heredoc-comsub-4 2488description: 2489 Tests for here documents in COMSUB, taken from Austin ML 2490stdin: 2491 balanced=$(cat <<EOF 2492 these parens \( ) are a problem 2493 EOF) 2494 echo = $balanced = 2495expected-stdout: 2496 = these parens \( ) are a problem = 2497--- 2498name: heredoc-subshell-1 2499description: 2500 Tests for here documents in subshells, taken from Austin ML 2501stdin: 2502 (cat <<EOF 2503 some text 2504 EOF) 2505 echo end 2506expected-stdout: 2507 some text 2508 end 2509--- 2510name: heredoc-subshell-2 2511description: 2512 Tests for here documents in subshells, taken from Austin ML 2513stdin: 2514 (cat <<EOF 2515 some text 2516 EOF 2517 ) 2518 echo end 2519expected-stdout: 2520 some text 2521 end 2522--- 2523name: heredoc-subshell-3 2524description: 2525 Tests for here documents in subshells, taken from Austin ML 2526stdin: 2527 (cat <<EOF; ) 2528 some text 2529 EOF 2530 echo end 2531expected-stdout: 2532 some text 2533 end 2534--- 2535name: heredoc-weird-1 2536description: 2537 Tests for here documents, taken from Austin ML 2538 Documents current state in mksh, *NOT* necessarily correct! 2539stdin: 2540 cat <<END 2541 hello 2542 END\ 2543 END 2544 END 2545 echo end 2546expected-stdout: 2547 hello 2548 ENDEND 2549 end 2550--- 2551name: heredoc-weird-2 2552description: 2553 Tests for here documents, taken from Austin ML 2554stdin: 2555 cat <<' END ' 2556 hello 2557 END 2558 echo end 2559expected-stdout: 2560 hello 2561 end 2562--- 2563name: heredoc-weird-4 2564description: 2565 Tests for here documents, taken from Austin ML 2566 Documents current state in mksh, *NOT* necessarily correct! 2567stdin: 2568 cat <<END 2569 hello\ 2570 END 2571 END 2572 echo end 2573expected-stdout: 2574 helloEND 2575 end 2576--- 2577name: heredoc-weird-5 2578description: 2579 Tests for here documents, taken from Austin ML 2580 Documents current state in mksh, *NOT* necessarily correct! 2581stdin: 2582 cat <<END 2583 hello 2584 \END 2585 END 2586 echo end 2587expected-stdout: 2588 hello 2589 \END 2590 end 2591--- 2592name: heredoc-tmpfile-1 2593description: 2594 Check that heredoc temp files aren't removed too soon or too late. 2595 Heredoc in simple command. 2596stdin: 2597 TMPDIR=$PWD 2598 eval ' 2599 cat <<- EOF 2600 hi 2601 EOF 2602 for i in a b ; do 2603 cat <<- EOF 2604 more 2605 EOF 2606 done 2607 ' & 2608 sleep 1 2609 echo Left overs: * 2610expected-stdout: 2611 hi 2612 more 2613 more 2614 Left overs: * 2615--- 2616name: heredoc-tmpfile-2 2617description: 2618 Check that heredoc temp files aren't removed too soon or too late. 2619 Heredoc in function, multiple calls to function. 2620stdin: 2621 TMPDIR=$PWD 2622 eval ' 2623 foo() { 2624 cat <<- EOF 2625 hi 2626 EOF 2627 } 2628 foo 2629 foo 2630 ' & 2631 sleep 1 2632 echo Left overs: * 2633expected-stdout: 2634 hi 2635 hi 2636 Left overs: * 2637--- 2638name: heredoc-tmpfile-3 2639description: 2640 Check that heredoc temp files aren't removed too soon or too late. 2641 Heredoc in function in loop, multiple calls to function. 2642stdin: 2643 TMPDIR=$PWD 2644 eval ' 2645 foo() { 2646 cat <<- EOF 2647 hi 2648 EOF 2649 } 2650 for i in a b; do 2651 foo 2652 foo() { 2653 cat <<- EOF 2654 folks $i 2655 EOF 2656 } 2657 done 2658 foo 2659 ' & 2660 sleep 1 2661 echo Left overs: * 2662expected-stdout: 2663 hi 2664 folks b 2665 folks b 2666 Left overs: * 2667--- 2668name: heredoc-tmpfile-4 2669description: 2670 Check that heredoc temp files aren't removed too soon or too late. 2671 Backgrounded simple command with here doc 2672stdin: 2673 TMPDIR=$PWD 2674 eval ' 2675 cat <<- EOF & 2676 hi 2677 EOF 2678 ' & 2679 sleep 1 2680 echo Left overs: * 2681expected-stdout: 2682 hi 2683 Left overs: * 2684--- 2685name: heredoc-tmpfile-5 2686description: 2687 Check that heredoc temp files aren't removed too soon or too late. 2688 Backgrounded subshell command with here doc 2689stdin: 2690 TMPDIR=$PWD 2691 eval ' 2692 ( 2693 sleep 1 # so parent exits 2694 echo A 2695 cat <<- EOF 2696 hi 2697 EOF 2698 echo B 2699 ) & 2700 ' & 2701 sleep 2 2702 echo Left overs: * 2703expected-stdout: 2704 A 2705 hi 2706 B 2707 Left overs: * 2708--- 2709name: heredoc-tmpfile-6 2710description: 2711 Check that heredoc temp files aren't removed too soon or too late. 2712 Heredoc in pipeline. 2713stdin: 2714 TMPDIR=$PWD 2715 eval ' 2716 cat <<- EOF | sed "s/hi/HI/" 2717 hi 2718 EOF 2719 ' & 2720 sleep 1 2721 echo Left overs: * 2722expected-stdout: 2723 HI 2724 Left overs: * 2725--- 2726name: heredoc-tmpfile-7 2727description: 2728 Check that heredoc temp files aren't removed too soon or too late. 2729 Heredoc in backgrounded pipeline. 2730stdin: 2731 TMPDIR=$PWD 2732 eval ' 2733 cat <<- EOF | sed 's/hi/HI/' & 2734 hi 2735 EOF 2736 ' & 2737 sleep 1 2738 echo Left overs: * 2739expected-stdout: 2740 HI 2741 Left overs: * 2742--- 2743name: heredoc-tmpfile-8 2744description: 2745 Check that heredoc temp files aren't removed too soon or too 2746 late. Heredoc in function, backgrounded call to function. 2747 This check can fail on slow machines (<100 MHz), or Cygwin, 2748 that's normal. 2749need-pass: no 2750stdin: 2751 TMPDIR=$PWD 2752 # Background eval so main shell doesn't do parsing 2753 eval ' 2754 foo() { 2755 cat <<- EOF 2756 hi 2757 EOF 2758 } 2759 foo 2760 # sleep so eval can die 2761 (sleep 1; foo) & 2762 (sleep 1; foo) & 2763 foo 2764 ' & 2765 sleep 2 2766 echo Left overs: * 2767expected-stdout: 2768 hi 2769 hi 2770 hi 2771 hi 2772 Left overs: * 2773--- 2774name: heredoc-quoting-unsubst 2775description: 2776 Check for correct handling of quoted characters in 2777 here documents without substitution (marker is quoted). 2778stdin: 2779 foo=bar 2780 cat <<-'EOF' 2781 x " \" \ \\ $ \$ `echo baz` \`echo baz\` $foo \$foo x 2782 EOF 2783expected-stdout: 2784 x " \" \ \\ $ \$ `echo baz` \`echo baz\` $foo \$foo x 2785--- 2786name: heredoc-quoting-subst 2787description: 2788 Check for correct handling of quoted characters in 2789 here documents with substitution (marker is not quoted). 2790stdin: 2791 foo=bar 2792 cat <<-EOF 2793 x " \" \ \\ $ \$ `echo baz` \`echo baz\` $foo \$foo x 2794 EOF 2795expected-stdout: 2796 x " \" \ \ $ $ baz `echo baz` bar $foo x 2797--- 2798name: single-quotes-in-braces 2799description: 2800 Check that single quotes inside unquoted {} are treated as quotes 2801stdin: 2802 foo=1 2803 echo ${foo:+'blah $foo'} 2804expected-stdout: 2805 blah $foo 2806--- 2807name: single-quotes-in-quoted-braces 2808description: 2809 Check that single quotes inside quoted {} are treated as 2810 normal char 2811stdin: 2812 foo=1 2813 echo "${foo:+'blah $foo'}" 2814expected-stdout: 2815 'blah 1' 2816--- 2817name: single-quotes-in-braces-nested 2818description: 2819 Check that single quotes inside unquoted {} are treated as quotes, 2820 even if that's inside a double-quoted command expansion 2821stdin: 2822 foo=1 2823 echo "$( echo ${foo:+'blah $foo'})" 2824expected-stdout: 2825 blah $foo 2826--- 2827name: single-quotes-in-brace-pattern 2828description: 2829 Check that single quotes inside {} pattern are treated as quotes 2830stdin: 2831 foo=1234 2832 echo ${foo%'2'*} "${foo%'2'*}" ${foo%2'*'} "${foo%2'*'}" 2833expected-stdout: 2834 1 1 1234 1234 2835--- 2836name: single-quotes-in-heredoc-braces 2837description: 2838 Check that single quotes inside {} in heredoc are treated 2839 as normal char 2840stdin: 2841 foo=1 2842 cat <<EOM 2843 ${foo:+'blah $foo'} 2844 EOM 2845expected-stdout: 2846 'blah 1' 2847--- 2848name: single-quotes-in-nested-braces 2849description: 2850 Check that single quotes inside nested unquoted {} are 2851 treated as quotes 2852stdin: 2853 foo=1 2854 echo ${foo:+${foo:+'blah $foo'}} 2855expected-stdout: 2856 blah $foo 2857--- 2858name: single-quotes-in-nested-quoted-braces 2859description: 2860 Check that single quotes inside nested quoted {} are treated 2861 as normal char 2862stdin: 2863 foo=1 2864 echo "${foo:+${foo:+'blah $foo'}}" 2865expected-stdout: 2866 'blah 1' 2867--- 2868name: single-quotes-in-nested-braces-nested 2869description: 2870 Check that single quotes inside nested unquoted {} are treated 2871 as quotes, even if that's inside a double-quoted command expansion 2872stdin: 2873 foo=1 2874 echo "$( echo ${foo:+${foo:+'blah $foo'}})" 2875expected-stdout: 2876 blah $foo 2877--- 2878name: single-quotes-in-nested-brace-pattern 2879description: 2880 Check that single quotes inside nested {} pattern are treated as quotes 2881stdin: 2882 foo=1234 2883 echo ${foo:+${foo%'2'*}} "${foo:+${foo%'2'*}}" ${foo:+${foo%2'*'}} "${foo:+${foo%2'*'}}" 2884expected-stdout: 2885 1 1 1234 1234 2886--- 2887name: single-quotes-in-heredoc-nested-braces 2888description: 2889 Check that single quotes inside nested {} in heredoc are treated 2890 as normal char 2891stdin: 2892 foo=1 2893 cat <<EOM 2894 ${foo:+${foo:+'blah $foo'}} 2895 EOM 2896expected-stdout: 2897 'blah 1' 2898--- 2899name: history-basic 2900description: 2901 See if we can test history at all 2902need-ctty: yes 2903arguments: !-i! 2904env-setup: !ENV=./Env!HISTFILE=hist.file! 2905file-setup: file 644 "Env" 2906 PS1=X 2907stdin: 2908 echo hi 2909 fc -l 2910expected-stdout: 2911 hi 2912 1 echo hi 2913expected-stderr-pattern: 2914 /^X*$/ 2915--- 2916name: history-dups 2917description: 2918 Verify duplicates and spaces are not entered 2919need-ctty: yes 2920arguments: !-i! 2921env-setup: !ENV=./Env!HISTFILE=hist.file! 2922file-setup: file 644 "Env" 2923 PS1=X 2924stdin: 2925 echo hi 2926 echo yo 2927 echo hi 2928 fc -l 2929expected-stdout: 2930 hi 2931 yo 2932 hi 2933 1 echo hi 2934expected-stderr-pattern: 2935 /^X*$/ 2936--- 2937name: history-unlink 2938description: 2939 Check if broken HISTFILEs do not cause trouble 2940need-ctty: yes 2941arguments: !-i! 2942env-setup: !ENV=./Env!HISTFILE=foo/hist.file! 2943file-setup: file 644 "Env" 2944 PS1=X 2945file-setup: dir 755 "foo" 2946file-setup: file 644 "foo/hist.file" 2947 sometext 2948time-limit: 5 2949perl-setup: chmod(0555, "foo"); 2950stdin: 2951 echo hi 2952 fc -l 2953 chmod 0755 foo 2954expected-stdout: 2955 hi 2956 1 echo hi 2957expected-stderr-pattern: 2958 /(.*can't unlink HISTFILE.*\n)?X*$/ 2959--- 2960name: history-e-minus-1 2961description: 2962 Check if more recent command is executed 2963need-ctty: yes 2964arguments: !-i! 2965env-setup: !ENV=./Env!HISTFILE=hist.file! 2966file-setup: file 644 "Env" 2967 PS1=X 2968stdin: 2969 echo hi 2970 echo there 2971 fc -e - 2972expected-stdout: 2973 hi 2974 there 2975 there 2976expected-stderr-pattern: 2977 /^X*echo there\nX*$/ 2978--- 2979name: history-e-minus-2 2980description: 2981 Check that repeated command is printed before command 2982 is re-executed. 2983need-ctty: yes 2984arguments: !-i! 2985env-setup: !ENV=./Env!HISTFILE=hist.file! 2986file-setup: file 644 "Env" 2987 PS1=X 2988stdin: 2989 exec 2>&1 2990 echo hi 2991 echo there 2992 fc -e - 2993expected-stdout-pattern: 2994 /X*hi\nX*there\nX*echo there\nthere\nX*/ 2995expected-stderr-pattern: 2996 /^X*$/ 2997--- 2998name: history-e-minus-3 2999description: 3000 fc -e - fails when there is no history 3001 (ksh93 has a bug that causes this to fail) 3002 (ksh88 loops on this) 3003need-ctty: yes 3004arguments: !-i! 3005env-setup: !ENV=./Env!HISTFILE=hist.file! 3006file-setup: file 644 "Env" 3007 PS1=X 3008stdin: 3009 fc -e - 3010 echo ok 3011expected-stdout: 3012 ok 3013expected-stderr-pattern: 3014 /^X*.*:.*history.*\nX*$/ 3015--- 3016name: history-e-minus-4 3017description: 3018 Check if "fc -e -" command output goes to stdout. 3019need-ctty: yes 3020arguments: !-i! 3021env-setup: !ENV=./Env!HISTFILE=hist.file! 3022file-setup: file 644 "Env" 3023 PS1=X 3024stdin: 3025 echo abc 3026 fc -e - | (read x; echo "A $x") 3027 echo ok 3028expected-stdout: 3029 abc 3030 A abc 3031 ok 3032expected-stderr-pattern: 3033 /^X*echo abc\nX*/ 3034--- 3035name: history-e-minus-5 3036description: 3037 fc is replaced in history by new command. 3038need-ctty: yes 3039arguments: !-i! 3040env-setup: !ENV=./Env!HISTFILE=hist.file! 3041file-setup: file 644 "Env" 3042 PS1=X 3043stdin: 3044 echo abc def 3045 echo ghi jkl 3046 : 3047 fc -e - echo 3048 fc -l 2 5 3049expected-stdout: 3050 abc def 3051 ghi jkl 3052 ghi jkl 3053 2 echo ghi jkl 3054 3 : 3055 4 echo ghi jkl 3056 5 fc -l 2 5 3057expected-stderr-pattern: 3058 /^X*echo ghi jkl\nX*$/ 3059--- 3060name: history-list-1 3061description: 3062 List lists correct range 3063 (ksh88 fails 'cause it lists the fc command) 3064need-ctty: yes 3065arguments: !-i! 3066env-setup: !ENV=./Env!HISTFILE=hist.file! 3067file-setup: file 644 "Env" 3068 PS1=X 3069stdin: 3070 echo line 1 3071 echo line 2 3072 echo line 3 3073 fc -l -- -2 3074expected-stdout: 3075 line 1 3076 line 2 3077 line 3 3078 2 echo line 2 3079 3 echo line 3 3080expected-stderr-pattern: 3081 /^X*$/ 3082--- 3083name: history-list-2 3084description: 3085 Lists oldest history if given pre-historic number 3086 (ksh93 has a bug that causes this to fail) 3087 (ksh88 fails 'cause it lists the fc command) 3088need-ctty: yes 3089arguments: !-i! 3090env-setup: !ENV=./Env!HISTFILE=hist.file! 3091file-setup: file 644 "Env" 3092 PS1=X 3093stdin: 3094 echo line 1 3095 echo line 2 3096 echo line 3 3097 fc -l -- -40 3098expected-stdout: 3099 line 1 3100 line 2 3101 line 3 3102 1 echo line 1 3103 2 echo line 2 3104 3 echo line 3 3105expected-stderr-pattern: 3106 /^X*$/ 3107--- 3108name: history-list-3 3109description: 3110 Can give number 'options' to fc 3111need-ctty: yes 3112arguments: !-i! 3113env-setup: !ENV=./Env!HISTFILE=hist.file! 3114file-setup: file 644 "Env" 3115 PS1=X 3116stdin: 3117 echo line 1 3118 echo line 2 3119 echo line 3 3120 echo line 4 3121 fc -l -3 -2 3122expected-stdout: 3123 line 1 3124 line 2 3125 line 3 3126 line 4 3127 2 echo line 2 3128 3 echo line 3 3129expected-stderr-pattern: 3130 /^X*$/ 3131--- 3132name: history-list-4 3133description: 3134 -1 refers to previous command 3135need-ctty: yes 3136arguments: !-i! 3137env-setup: !ENV=./Env!HISTFILE=hist.file! 3138file-setup: file 644 "Env" 3139 PS1=X 3140stdin: 3141 echo line 1 3142 echo line 2 3143 echo line 3 3144 echo line 4 3145 fc -l -1 -1 3146expected-stdout: 3147 line 1 3148 line 2 3149 line 3 3150 line 4 3151 4 echo line 4 3152expected-stderr-pattern: 3153 /^X*$/ 3154--- 3155name: history-list-5 3156description: 3157 List command stays in history 3158need-ctty: yes 3159arguments: !-i! 3160env-setup: !ENV=./Env!HISTFILE=hist.file! 3161file-setup: file 644 "Env" 3162 PS1=X 3163stdin: 3164 echo line 1 3165 echo line 2 3166 echo line 3 3167 echo line 4 3168 fc -l -1 -1 3169 fc -l -2 -1 3170expected-stdout: 3171 line 1 3172 line 2 3173 line 3 3174 line 4 3175 4 echo line 4 3176 4 echo line 4 3177 5 fc -l -1 -1 3178expected-stderr-pattern: 3179 /^X*$/ 3180--- 3181name: history-list-6 3182description: 3183 HISTSIZE limits about of history kept. 3184 (ksh88 fails 'cause it lists the fc command) 3185need-ctty: yes 3186arguments: !-i! 3187env-setup: !ENV=./Env!HISTFILE=hist.file!HISTSIZE=3! 3188file-setup: file 644 "Env" 3189 PS1=X 3190stdin: 3191 echo line 1 3192 echo line 2 3193 echo line 3 3194 echo line 4 3195 echo line 5 3196 fc -l 3197expected-stdout: 3198 line 1 3199 line 2 3200 line 3 3201 line 4 3202 line 5 3203 4 echo line 4 3204 5 echo line 5 3205expected-stderr-pattern: 3206 /^X*$/ 3207--- 3208name: history-list-7 3209description: 3210 fc allows too old/new errors in range specification 3211need-ctty: yes 3212arguments: !-i! 3213env-setup: !ENV=./Env!HISTFILE=hist.file!HISTSIZE=3! 3214file-setup: file 644 "Env" 3215 PS1=X 3216stdin: 3217 echo line 1 3218 echo line 2 3219 echo line 3 3220 echo line 4 3221 echo line 5 3222 fc -l 1 30 3223expected-stdout: 3224 line 1 3225 line 2 3226 line 3 3227 line 4 3228 line 5 3229 4 echo line 4 3230 5 echo line 5 3231 6 fc -l 1 30 3232expected-stderr-pattern: 3233 /^X*$/ 3234--- 3235name: history-list-r-1 3236description: 3237 test -r flag in history 3238need-ctty: yes 3239arguments: !-i! 3240env-setup: !ENV=./Env!HISTFILE=hist.file! 3241file-setup: file 644 "Env" 3242 PS1=X 3243stdin: 3244 echo line 1 3245 echo line 2 3246 echo line 3 3247 echo line 4 3248 echo line 5 3249 fc -l -r 2 4 3250expected-stdout: 3251 line 1 3252 line 2 3253 line 3 3254 line 4 3255 line 5 3256 4 echo line 4 3257 3 echo line 3 3258 2 echo line 2 3259expected-stderr-pattern: 3260 /^X*$/ 3261--- 3262name: history-list-r-2 3263description: 3264 If first is newer than last, -r is implied. 3265need-ctty: yes 3266arguments: !-i! 3267env-setup: !ENV=./Env!HISTFILE=hist.file! 3268file-setup: file 644 "Env" 3269 PS1=X 3270stdin: 3271 echo line 1 3272 echo line 2 3273 echo line 3 3274 echo line 4 3275 echo line 5 3276 fc -l 4 2 3277expected-stdout: 3278 line 1 3279 line 2 3280 line 3 3281 line 4 3282 line 5 3283 4 echo line 4 3284 3 echo line 3 3285 2 echo line 2 3286expected-stderr-pattern: 3287 /^X*$/ 3288--- 3289name: history-list-r-3 3290description: 3291 If first is newer than last, -r is cancelled. 3292need-ctty: yes 3293arguments: !-i! 3294env-setup: !ENV=./Env!HISTFILE=hist.file! 3295file-setup: file 644 "Env" 3296 PS1=X 3297stdin: 3298 echo line 1 3299 echo line 2 3300 echo line 3 3301 echo line 4 3302 echo line 5 3303 fc -l -r 4 2 3304expected-stdout: 3305 line 1 3306 line 2 3307 line 3 3308 line 4 3309 line 5 3310 2 echo line 2 3311 3 echo line 3 3312 4 echo line 4 3313expected-stderr-pattern: 3314 /^X*$/ 3315--- 3316name: history-subst-1 3317description: 3318 Basic substitution 3319need-ctty: yes 3320arguments: !-i! 3321env-setup: !ENV=./Env!HISTFILE=hist.file! 3322file-setup: file 644 "Env" 3323 PS1=X 3324stdin: 3325 echo abc def 3326 echo ghi jkl 3327 fc -e - abc=AB 'echo a' 3328expected-stdout: 3329 abc def 3330 ghi jkl 3331 AB def 3332expected-stderr-pattern: 3333 /^X*echo AB def\nX*$/ 3334--- 3335name: history-subst-2 3336description: 3337 Does subst find previous command? 3338need-ctty: yes 3339arguments: !-i! 3340env-setup: !ENV=./Env!HISTFILE=hist.file! 3341file-setup: file 644 "Env" 3342 PS1=X 3343stdin: 3344 echo abc def 3345 echo ghi jkl 3346 fc -e - jkl=XYZQRT 'echo g' 3347expected-stdout: 3348 abc def 3349 ghi jkl 3350 ghi XYZQRT 3351expected-stderr-pattern: 3352 /^X*echo ghi XYZQRT\nX*$/ 3353--- 3354name: history-subst-3 3355description: 3356 Does subst find previous command when no arguments given 3357need-ctty: yes 3358arguments: !-i! 3359env-setup: !ENV=./Env!HISTFILE=hist.file! 3360file-setup: file 644 "Env" 3361 PS1=X 3362stdin: 3363 echo abc def 3364 echo ghi jkl 3365 fc -e - jkl=XYZQRT 3366expected-stdout: 3367 abc def 3368 ghi jkl 3369 ghi XYZQRT 3370expected-stderr-pattern: 3371 /^X*echo ghi XYZQRT\nX*$/ 3372--- 3373name: history-subst-4 3374description: 3375 Global substitutions work 3376 (ksh88 and ksh93 do not have -g option) 3377need-ctty: yes 3378arguments: !-i! 3379env-setup: !ENV=./Env!HISTFILE=hist.file! 3380file-setup: file 644 "Env" 3381 PS1=X 3382stdin: 3383 echo abc def asjj sadjhasdjh asdjhasd 3384 fc -e - -g a=FooBAR 3385expected-stdout: 3386 abc def asjj sadjhasdjh asdjhasd 3387 FooBARbc def FooBARsjj sFooBARdjhFooBARsdjh FooBARsdjhFooBARsd 3388expected-stderr-pattern: 3389 /^X*echo FooBARbc def FooBARsjj sFooBARdjhFooBARsdjh FooBARsdjhFooBARsd\nX*$/ 3390--- 3391name: history-subst-5 3392description: 3393 Make sure searches don't find current (fc) command 3394 (ksh88/ksh93 don't have the ? prefix thing so they fail this test) 3395need-ctty: yes 3396arguments: !-i! 3397env-setup: !ENV=./Env!HISTFILE=hist.file! 3398file-setup: file 644 "Env" 3399 PS1=X 3400stdin: 3401 echo abc def 3402 echo ghi jkl 3403 fc -e - abc=AB \?abc 3404expected-stdout: 3405 abc def 3406 ghi jkl 3407 AB def 3408expected-stderr-pattern: 3409 /^X*echo AB def\nX*$/ 3410--- 3411name: history-ed-1-old 3412description: 3413 Basic (ed) editing works (assumes you have generic ed editor 3414 that prints no prompts). This is for oldish ed(1) which write 3415 the character count to stdout. 3416category: stdout-ed 3417need-ctty: yes 3418need-pass: no 3419arguments: !-i! 3420env-setup: !ENV=./Env!HISTFILE=hist.file! 3421file-setup: file 644 "Env" 3422 PS1=X 3423stdin: 3424 echo abc def 3425 fc echo 3426 s/abc/FOOBAR/ 3427 w 3428 q 3429expected-stdout: 3430 abc def 3431 13 3432 16 3433 FOOBAR def 3434expected-stderr-pattern: 3435 /^X*echo FOOBAR def\nX*$/ 3436--- 3437name: history-ed-2-old 3438description: 3439 Correct command is edited when number given 3440category: stdout-ed 3441need-ctty: yes 3442need-pass: no 3443arguments: !-i! 3444env-setup: !ENV=./Env!HISTFILE=hist.file! 3445file-setup: file 644 "Env" 3446 PS1=X 3447stdin: 3448 echo line 1 3449 echo line 2 is here 3450 echo line 3 3451 echo line 4 3452 fc 2 3453 s/is here/is changed/ 3454 w 3455 q 3456expected-stdout: 3457 line 1 3458 line 2 is here 3459 line 3 3460 line 4 3461 20 3462 23 3463 line 2 is changed 3464expected-stderr-pattern: 3465 /^X*echo line 2 is changed\nX*$/ 3466--- 3467name: history-ed-3-old 3468description: 3469 Newly created multi line commands show up as single command 3470 in history. 3471 (NOTE: adjusted for COMPLEX HISTORY compile time option) 3472 (ksh88 fails 'cause it lists the fc command) 3473category: stdout-ed 3474need-ctty: yes 3475need-pass: no 3476arguments: !-i! 3477env-setup: !ENV=./Env!HISTFILE=hist.file! 3478file-setup: file 644 "Env" 3479 PS1=X 3480stdin: 3481 echo abc def 3482 fc echo 3483 s/abc/FOOBAR/ 3484 $a 3485 echo a new line 3486 . 3487 w 3488 q 3489 fc -l 3490expected-stdout: 3491 abc def 3492 13 3493 32 3494 FOOBAR def 3495 a new line 3496 1 echo abc def 3497 2 echo FOOBAR def 3498 3 echo a new line 3499expected-stderr-pattern: 3500 /^X*echo FOOBAR def\necho a new line\nX*$/ 3501--- 3502name: history-ed-1 3503description: 3504 Basic (ed) editing works (assumes you have generic ed editor 3505 that prints no prompts). This is for newish ed(1) and stderr. 3506category: !no-stderr-ed 3507need-ctty: yes 3508need-pass: no 3509arguments: !-i! 3510env-setup: !ENV=./Env!HISTFILE=hist.file! 3511file-setup: file 644 "Env" 3512 PS1=X 3513stdin: 3514 echo abc def 3515 fc echo 3516 s/abc/FOOBAR/ 3517 w 3518 q 3519expected-stdout: 3520 abc def 3521 FOOBAR def 3522expected-stderr-pattern: 3523 /^X*13\n16\necho FOOBAR def\nX*$/ 3524--- 3525name: history-ed-2 3526description: 3527 Correct command is edited when number given 3528category: !no-stderr-ed 3529need-ctty: yes 3530need-pass: no 3531arguments: !-i! 3532env-setup: !ENV=./Env!HISTFILE=hist.file! 3533file-setup: file 644 "Env" 3534 PS1=X 3535stdin: 3536 echo line 1 3537 echo line 2 is here 3538 echo line 3 3539 echo line 4 3540 fc 2 3541 s/is here/is changed/ 3542 w 3543 q 3544expected-stdout: 3545 line 1 3546 line 2 is here 3547 line 3 3548 line 4 3549 line 2 is changed 3550expected-stderr-pattern: 3551 /^X*20\n23\necho line 2 is changed\nX*$/ 3552--- 3553name: history-ed-3 3554description: 3555 Newly created multi line commands show up as single command 3556 in history. 3557category: !no-stderr-ed 3558need-ctty: yes 3559need-pass: no 3560arguments: !-i! 3561env-setup: !ENV=./Env!HISTFILE=hist.file! 3562file-setup: file 644 "Env" 3563 PS1=X 3564stdin: 3565 echo abc def 3566 fc echo 3567 s/abc/FOOBAR/ 3568 $a 3569 echo a new line 3570 . 3571 w 3572 q 3573 fc -l 3574expected-stdout: 3575 abc def 3576 FOOBAR def 3577 a new line 3578 1 echo abc def 3579 2 echo FOOBAR def 3580 3 echo a new line 3581expected-stderr-pattern: 3582 /^X*13\n32\necho FOOBAR def\necho a new line\nX*$/ 3583--- 3584name: IFS-space-1 3585description: 3586 Simple test, default IFS 3587stdin: 3588 showargs() { for i; do echo -n " <$i>"; done; echo; } 3589 set -- A B C 3590 showargs 1 $* 3591 showargs 2 "$*" 3592 showargs 3 $@ 3593 showargs 4 "$@" 3594expected-stdout: 3595 <1> <A> <B> <C> 3596 <2> <A B C> 3597 <3> <A> <B> <C> 3598 <4> <A> <B> <C> 3599--- 3600name: IFS-colon-1 3601description: 3602 Simple test, IFS=: 3603stdin: 3604 showargs() { for i; do echo -n " <$i>"; done; echo; } 3605 IFS=: 3606 set -- A B C 3607 showargs 1 $* 3608 showargs 2 "$*" 3609 showargs 3 $@ 3610 showargs 4 "$@" 3611expected-stdout: 3612 <1> <A> <B> <C> 3613 <2> <A:B:C> 3614 <3> <A> <B> <C> 3615 <4> <A> <B> <C> 3616--- 3617name: IFS-null-1 3618description: 3619 Simple test, IFS="" 3620stdin: 3621 showargs() { for i; do echo -n " <$i>"; done; echo; } 3622 IFS="" 3623 set -- A B C 3624 showargs 1 $* 3625 showargs 2 "$*" 3626 showargs 3 $@ 3627 showargs 4 "$@" 3628expected-stdout: 3629 <1> <A> <B> <C> 3630 <2> <ABC> 3631 <3> <A> <B> <C> 3632 <4> <A> <B> <C> 3633--- 3634name: IFS-space-colon-1 3635description: 3636 Simple test, IFS=<white-space>: 3637stdin: 3638 showargs() { for i; do echo -n " <$i>"; done; echo; } 3639 IFS="$IFS:" 3640 set -- 3641 showargs 1 $* 3642 showargs 2 "$*" 3643 showargs 3 $@ 3644 showargs 4 "$@" 3645 showargs 5 : "$@" 3646expected-stdout: 3647 <1> 3648 <2> <> 3649 <3> 3650 <4> 3651 <5> <:> 3652--- 3653name: IFS-space-colon-2 3654description: 3655 Simple test, IFS=<white-space>: 3656 AT&T ksh fails this, POSIX says the test is correct. 3657stdin: 3658 showargs() { for i; do echo -n " <$i>"; done; echo; } 3659 IFS="$IFS:" 3660 set -- 3661 showargs :"$@" 3662expected-stdout: 3663 <:> 3664--- 3665name: IFS-space-colon-4 3666description: 3667 Simple test, IFS=<white-space>: 3668stdin: 3669 showargs() { for i; do echo -n " <$i>"; done; echo; } 3670 IFS="$IFS:" 3671 set -- 3672 showargs "$@$@" 3673expected-stdout: 3674 3675--- 3676name: IFS-space-colon-5 3677description: 3678 Simple test, IFS=<white-space>: 3679 Don't know what POSIX thinks of this. AT&T ksh does not do this. 3680stdin: 3681 showargs() { for i; do echo -n " <$i>"; done; echo; } 3682 IFS="$IFS:" 3683 set -- 3684 showargs "${@:-}" 3685expected-stdout: 3686 <> 3687--- 3688name: IFS-subst-1 3689description: 3690 Simple test, IFS=<white-space>: 3691stdin: 3692 showargs() { for i; do echo -n " <$i>"; done; echo; } 3693 IFS="$IFS:" 3694 x=":b: :" 3695 echo -n '1:'; for i in $x ; do echo -n " [$i]" ; done ; echo 3696 echo -n '2:'; for i in :b:: ; do echo -n " [$i]" ; done ; echo 3697 showargs 3 $x 3698 showargs 4 :b:: 3699 x="a:b:" 3700 echo -n '5:'; for i in $x ; do echo -n " [$i]" ; done ; echo 3701 showargs 6 $x 3702 x="a::c" 3703 echo -n '7:'; for i in $x ; do echo -n " [$i]" ; done ; echo 3704 showargs 8 $x 3705 echo -n '9:'; for i in ${FOO-`echo -n h:i`th:ere} ; do echo -n " [$i]" ; done ; echo 3706 showargs 10 ${FOO-`echo -n h:i`th:ere} 3707 showargs 11 "${FOO-`echo -n h:i`th:ere}" 3708 x=" A : B::D" 3709 echo -n '12:'; for i in $x ; do echo -n " [$i]" ; done ; echo 3710 showargs 13 $x 3711expected-stdout: 3712 1: [] [b] [] 3713 2: [:b::] 3714 <3> <> <b> <> 3715 <4> <:b::> 3716 5: [a] [b] 3717 <6> <a> <b> 3718 7: [a] [] [c] 3719 <8> <a> <> <c> 3720 9: [h] [ith] [ere] 3721 <10> <h> <ith> <ere> 3722 <11> <h:ith:ere> 3723 12: [A] [B] [] [D] 3724 <13> <A> <B> <> <D> 3725--- 3726name: IFS-subst-2 3727description: 3728 Check leading whitespace after trim does not make a field 3729stdin: 3730 showargs() { for i; do echo -n " <$i>"; done; echo; } 3731 x="X 1 2" 3732 showargs 1 shift ${x#X} 3733expected-stdout: 3734 <1> <shift> <1> <2> 3735--- 3736name: IFS-subst-3 3737description: 3738 Check leading IFS non-whitespace after trim does make a field 3739 but leading IFS whitespace does not, nor empty replacements 3740stdin: 3741 showargs() { for i; do echo -n " <$i>"; done; echo; } 3742 showargs 0 ${-+} 3743 IFS=: 3744 showargs 1 ${-+:foo:bar} 3745 IFS=' ' 3746 showargs 2 ${-+ foo bar} 3747expected-stdout: 3748 <0> 3749 <1> <> <foo> <bar> 3750 <2> <foo> <bar> 3751--- 3752name: IFS-subst-4-1 3753description: 3754 reported by mikeserv 3755stdin: 3756 a='space divded argument 3757 here' 3758 IFS=\ ; set -- $a 3759 IFS= ; q="$*" ; nq=$* 3760 printf '<%s>\n' "$*" $* "$q" "$nq" 3761 [ "$q" = "$nq" ] && echo =true || echo =false 3762expected-stdout: 3763 <spacedivdedargument 3764 here> 3765 <space> 3766 <divded> 3767 <argument 3768 here> 3769 <spacedivdedargument 3770 here> 3771 <spacedivdedargument 3772 here> 3773 =true 3774--- 3775name: IFS-subst-4-2 3776description: 3777 extended testsuite based on problem by mikeserv 3778stdin: 3779 a='space divded argument 3780 here' 3781 IFS=\ ; set -- $a 3782 IFS= ; q="$@" ; nq=$@ 3783 printf '<%s>\n' "$*" $* "$q" "$nq" 3784 [ "$q" = "$nq" ] && echo =true || echo =false 3785expected-stdout: 3786 <spacedivdedargument 3787 here> 3788 <space> 3789 <divded> 3790 <argument 3791 here> 3792 <space divded argument 3793 here> 3794 <space divded argument 3795 here> 3796 =true 3797--- 3798name: IFS-subst-4-3 3799description: 3800 extended testsuite based on problem by mikeserv 3801stdin: 3802 a='space divded argument 3803 here' 3804 IFS=\ ; set -- $a; IFS= 3805 qs="$*" 3806 nqs=$* 3807 qk="$@" 3808 nqk=$@ 3809 printf '= qs '; printf '<%s>\n' "$qs" 3810 printf '=nqs '; printf '<%s>\n' "$nqs" 3811 printf '= qk '; printf '<%s>\n' "$qk" 3812 printf '=nqk '; printf '<%s>\n' "$nqk" 3813 printf '~ qs '; printf '<%s>\n' "$*" 3814 printf '~nqs '; printf '<%s>\n' $* 3815 printf '~ qk '; printf '<%s>\n' "$@" 3816 printf '~nqk '; printf '<%s>\n' $@ 3817expected-stdout: 3818 = qs <spacedivdedargument 3819 here> 3820 =nqs <spacedivdedargument 3821 here> 3822 = qk <space divded argument 3823 here> 3824 =nqk <space divded argument 3825 here> 3826 ~ qs <spacedivdedargument 3827 here> 3828 ~nqs <space> 3829 <divded> 3830 <argument 3831 here> 3832 ~ qk <space> 3833 <divded> 3834 <argument 3835 here> 3836 ~nqk <space> 3837 <divded> 3838 <argument 3839 here> 3840--- 3841name: IFS-subst-4-4 3842description: 3843 extended testsuite based on problem by mikeserv 3844stdin: 3845 a='space divded argument 3846 here' 3847 IFS=\ ; set -- $a; IFS= 3848 qs="$*" 3849 printf '= qs '; printf '<%s>\n' "$qs" 3850 printf '~ qs '; printf '<%s>\n' "$*" 3851 nqs=$* 3852 printf '=nqs '; printf '<%s>\n' "$nqs" 3853 printf '~nqs '; printf '<%s>\n' $* 3854 qk="$@" 3855 printf '= qk '; printf '<%s>\n' "$qk" 3856 printf '~ qk '; printf '<%s>\n' "$@" 3857 nqk=$@ 3858 printf '=nqk '; printf '<%s>\n' "$nqk" 3859 printf '~nqk '; printf '<%s>\n' $@ 3860expected-stdout: 3861 = qs <spacedivdedargument 3862 here> 3863 ~ qs <spacedivdedargument 3864 here> 3865 =nqs <spacedivdedargument 3866 here> 3867 ~nqs <space> 3868 <divded> 3869 <argument 3870 here> 3871 = qk <space divded argument 3872 here> 3873 ~ qk <space> 3874 <divded> 3875 <argument 3876 here> 3877 =nqk <space divded argument 3878 here> 3879 ~nqk <space> 3880 <divded> 3881 <argument 3882 here> 3883--- 3884name: IFS-subst-4-4p 3885description: 3886 extended testsuite based on problem by mikeserv 3887stdin: 3888 a='space divded argument 3889 here' 3890 IFS=\ ; set -- $a; IFS= 3891 unset v 3892 qs=${v:-"$*"} 3893 printf '= qs '; printf '<%s>\n' "$qs" 3894 printf '~ qs '; printf '<%s>\n' ${v:-"$*"} 3895 nqs=${v:-$*} 3896 printf '=nqs '; printf '<%s>\n' "$nqs" 3897 printf '~nqs '; printf '<%s>\n' ${v:-$*} 3898 qk=${v:-"$@"} 3899 printf '= qk '; printf '<%s>\n' "$qk" 3900 printf '~ qk '; printf '<%s>\n' ${v:-"$@"} 3901 nqk=${v:-$@} 3902 printf '=nqk '; printf '<%s>\n' "$nqk" 3903 printf '~nqk '; printf '<%s>\n' ${v:-$@} 3904expected-stdout: 3905 = qs <spacedivdedargument 3906 here> 3907 ~ qs <spacedivdedargument 3908 here> 3909 =nqs <spacedivdedargument 3910 here> 3911 ~nqs <space> 3912 <divded> 3913 <argument 3914 here> 3915 = qk <space divded argument 3916 here> 3917 ~ qk <space> 3918 <divded> 3919 <argument 3920 here> 3921 =nqk <space divded argument 3922 here> 3923 ~nqk <space> 3924 <divded> 3925 <argument 3926 here> 3927--- 3928name: IFS-subst-4-5 3929description: 3930 extended testsuite based on problem by mikeserv 3931stdin: 3932 a='space divded argument 3933 here' 3934 IFS=\ ; set -- $a; IFS=, 3935 qs="$*" 3936 printf '= qs '; printf '<%s>\n' "$qs" 3937 printf '~ qs '; printf '<%s>\n' "$*" 3938 nqs=$* 3939 printf '=nqs '; printf '<%s>\n' "$nqs" 3940 printf '~nqs '; printf '<%s>\n' $* 3941 qk="$@" 3942 printf '= qk '; printf '<%s>\n' "$qk" 3943 printf '~ qk '; printf '<%s>\n' "$@" 3944 nqk=$@ 3945 printf '=nqk '; printf '<%s>\n' "$nqk" 3946 printf '~nqk '; printf '<%s>\n' $@ 3947expected-stdout: 3948 = qs <space,divded,argument 3949 here> 3950 ~ qs <space,divded,argument 3951 here> 3952 =nqs <space,divded,argument 3953 here> 3954 ~nqs <space> 3955 <divded> 3956 <argument 3957 here> 3958 = qk <space divded argument 3959 here> 3960 ~ qk <space> 3961 <divded> 3962 <argument 3963 here> 3964 =nqk <space divded argument 3965 here> 3966 ~nqk <space> 3967 <divded> 3968 <argument 3969 here> 3970--- 3971name: IFS-subst-4-5p 3972description: 3973 extended testsuite based on problem by mikeserv 3974stdin: 3975 a='space divded argument 3976 here' 3977 IFS=\ ; set -- $a; IFS=, 3978 unset v 3979 qs=${v:-"$*"} 3980 printf '= qs '; printf '<%s>\n' "$qs" 3981 printf '~ qs '; printf '<%s>\n' ${v:-"$*"} 3982 nqs=${v:-$*} 3983 printf '=nqs '; printf '<%s>\n' "$nqs" 3984 printf '~nqs '; printf '<%s>\n' ${v:-$*} 3985 qk=${v:-"$@"} 3986 printf '= qk '; printf '<%s>\n' "$qk" 3987 printf '~ qk '; printf '<%s>\n' ${v:-"$@"} 3988 nqk=${v:-$@} 3989 printf '=nqk '; printf '<%s>\n' "$nqk" 3990 printf '~nqk '; printf '<%s>\n' ${v:-$@} 3991expected-stdout: 3992 = qs <space,divded,argument 3993 here> 3994 ~ qs <space,divded,argument 3995 here> 3996 =nqs <space,divded,argument 3997 here> 3998 ~nqs <space> 3999 <divded> 4000 <argument 4001 here> 4002 = qk <space divded argument 4003 here> 4004 ~ qk <space> 4005 <divded> 4006 <argument 4007 here> 4008 =nqk <space divded argument 4009 here> 4010 ~nqk <space> 4011 <divded> 4012 <argument 4013 here> 4014--- 4015name: IFS-subst-5 4016description: 4017 extended testsuite based on IFS-subst-3 4018 differs slightly from ksh93: 4019 - omit trailing field in a3zna, a7ina (unquoted $@ expansion) 4020 - has extra middle fields in b5ins, b7ina (IFS_NWS unquoted expansion) 4021 differs slightly from bash: 4022 - omit leading field in a5ins, a7ina (IFS_NWS unquoted expansion) 4023 differs slightly from zsh: 4024 - differs in assignment, not expansion; probably zsh bug 4025 - has extra middle fields in b5ins, b7ina (IFS_NWS unquoted expansion) 4026 'emulate sh' zsh has extra fields in 4027 - a5ins (IFS_NWS unquoted $*) 4028 - b5ins, matching mksh’s 4029stdin: 4030 "$__progname" -c 'IFS=; set -- "" 2 ""; printf "[%s]\n" $*; x=$*; printf "<%s>\n" "$x"' 4031 echo '=a1zns' 4032 "$__progname" -c 'IFS=; set -- "" 2 ""; printf "[%s]\n" "$*"; x="$*"; printf "<%s>\n" "$x"' 4033 echo '=a2zqs' 4034 "$__progname" -c 'IFS=; set -- "" 2 ""; printf "[%s]\n" $@; x=$@; printf "<%s>\n" "$x"' 4035 echo '=a3zna' 4036 "$__progname" -c 'IFS=; set -- "" 2 ""; printf "[%s]\n" "$@"; x="$@"; printf "<%s>\n" "$x"' 4037 echo '=a4zqa' 4038 "$__progname" -c 'IFS=,; set -- "" 2 ""; printf "[%s]\n" $*; x=$*; printf "<%s>\n" "$x"' 4039 echo '=a5ins' 4040 "$__progname" -c 'IFS=,; set -- "" 2 ""; printf "[%s]\n" "$*"; x="$*"; printf "<%s>\n" "$x"' 4041 echo '=a6iqs' 4042 "$__progname" -c 'IFS=,; set -- "" 2 ""; printf "[%s]\n" $@; x=$@; printf "<%s>\n" "$x"' 4043 echo '=a7ina' 4044 "$__progname" -c 'IFS=,; set -- "" 2 ""; printf "[%s]\n" "$@"; x="$@"; printf "<%s>\n" "$x"' 4045 echo '=a8iqa' 4046 "$__progname" -c 'IFS=; set -- A B "" "" C; printf "[%s]\n" $*; x=$*; printf "<%s>\n" "$x"' 4047 echo '=b1zns' 4048 "$__progname" -c 'IFS=; set -- A B "" "" C; printf "[%s]\n" "$*"; x="$*"; printf "<%s>\n" "$x"' 4049 echo '=b2zqs' 4050 "$__progname" -c 'IFS=; set -- A B "" "" C; printf "[%s]\n" $@; x=$@; printf "<%s>\n" "$x"' 4051 echo '=b3zna' 4052 "$__progname" -c 'IFS=; set -- A B "" "" C; printf "[%s]\n" "$@"; x="$@"; printf "<%s>\n" "$x"' 4053 echo '=b4zqa' 4054 "$__progname" -c 'IFS=,; set -- A B "" "" C; printf "[%s]\n" $*; x=$*; printf "<%s>\n" "$x"' 4055 echo '=b5ins' 4056 "$__progname" -c 'IFS=,; set -- A B "" "" C; printf "[%s]\n" "$*"; x="$*"; printf "<%s>\n" "$x"' 4057 echo '=b6iqs' 4058 "$__progname" -c 'IFS=,; set -- A B "" "" C; printf "[%s]\n" $@; x=$@; printf "<%s>\n" "$x"' 4059 echo '=b7ina' 4060 "$__progname" -c 'IFS=,; set -- A B "" "" C; printf "[%s]\n" "$@"; x="$@"; printf "<%s>\n" "$x"' 4061 echo '=b8iqa' 4062expected-stdout: 4063 [2] 4064 <2> 4065 =a1zns 4066 [2] 4067 <2> 4068 =a2zqs 4069 [2] 4070 < 2 > 4071 =a3zna 4072 [] 4073 [2] 4074 [] 4075 < 2 > 4076 =a4zqa 4077 [2] 4078 <,2,> 4079 =a5ins 4080 [,2,] 4081 <,2,> 4082 =a6iqs 4083 [2] 4084 < 2 > 4085 =a7ina 4086 [] 4087 [2] 4088 [] 4089 < 2 > 4090 =a8iqa 4091 [A] 4092 [B] 4093 [C] 4094 <ABC> 4095 =b1zns 4096 [ABC] 4097 <ABC> 4098 =b2zqs 4099 [A] 4100 [B] 4101 [C] 4102 <A B C> 4103 =b3zna 4104 [A] 4105 [B] 4106 [] 4107 [] 4108 [C] 4109 <A B C> 4110 =b4zqa 4111 [A] 4112 [B] 4113 [] 4114 [] 4115 [C] 4116 <A,B,,,C> 4117 =b5ins 4118 [A,B,,,C] 4119 <A,B,,,C> 4120 =b6iqs 4121 [A] 4122 [B] 4123 [] 4124 [] 4125 [C] 4126 <A B C> 4127 =b7ina 4128 [A] 4129 [B] 4130 [] 4131 [] 4132 [C] 4133 <A B C> 4134 =b8iqa 4135--- 4136name: IFS-arith-1 4137description: 4138 http://austingroupbugs.net/view.php?id=832 4139stdin: 4140 ${ZSH_VERSION+false} || emulate sh 4141 ${BASH_VERSION+set -o posix} 4142 showargs() { for x in "$@"; do echo -n "<$x> "; done; echo .; } 4143 IFS=0 4144 showargs $((1230456)) 4145expected-stdout: 4146 <123> <456> . 4147--- 4148name: integer-base-err-1 4149description: 4150 Can't have 0 base (causes shell to exit) 4151expected-exit: e != 0 4152stdin: 4153 typeset -i i 4154 i=3 4155 i=0#4 4156 echo $i 4157expected-stderr-pattern: 4158 /^.*:.*0#4.*\n$/ 4159--- 4160name: integer-base-err-2 4161description: 4162 Can't have multiple bases in a 'constant' (causes shell to exit) 4163 (ksh88 fails this test) 4164expected-exit: e != 0 4165stdin: 4166 typeset -i i 4167 i=3 4168 i=2#110#11 4169 echo $i 4170expected-stderr-pattern: 4171 /^.*:.*2#110#11.*\n$/ 4172--- 4173name: integer-base-err-3 4174description: 4175 Syntax errors in expressions and effects on bases 4176 (interactive so errors don't cause exits) 4177 (ksh88 fails this test - shell exits, even with -i) 4178need-ctty: yes 4179arguments: !-i! 4180stdin: 4181 PS1= # minimise prompt hassles 4182 typeset -i4 a=10 4183 typeset -i a=2+ 4184 echo $a 4185 typeset -i4 a=10 4186 typeset -i2 a=2+ 4187 echo $a 4188expected-stderr-pattern: 4189 /^([#\$] )?.*:.*2+.*\n.*:.*2+.*\n$/ 4190expected-stdout: 4191 4#22 4192 4#22 4193--- 4194name: integer-base-err-4 4195description: 4196 Are invalid digits (according to base) errors? 4197 (ksh93 fails this test) 4198expected-exit: e != 0 4199stdin: 4200 typeset -i i; 4201 i=3#4 4202expected-stderr-pattern: 4203 /^([#\$] )?.*:.*3#4.*\n$/ 4204--- 4205name: integer-base-1 4206description: 4207 Missing number after base is treated as 0. 4208stdin: 4209 typeset -i i 4210 i=3 4211 i=2# 4212 echo $i 4213expected-stdout: 4214 0 4215--- 4216name: integer-base-2 4217description: 4218 Check 'stickyness' of base in various situations 4219stdin: 4220 typeset -i i=8 4221 echo $i 4222 echo ---------- A 4223 typeset -i4 j=8 4224 echo $j 4225 echo ---------- B 4226 typeset -i k=8 4227 typeset -i4 k=8 4228 echo $k 4229 echo ---------- C 4230 typeset -i4 l 4231 l=3#10 4232 echo $l 4233 echo ---------- D 4234 typeset -i m 4235 m=3#10 4236 echo $m 4237 echo ---------- E 4238 n=2#11 4239 typeset -i n 4240 echo $n 4241 n=10 4242 echo $n 4243 echo ---------- F 4244 typeset -i8 o=12 4245 typeset -i4 o 4246 echo $o 4247 echo ---------- G 4248 typeset -i p 4249 let p=8#12 4250 echo $p 4251expected-stdout: 4252 8 4253 ---------- A 4254 4#20 4255 ---------- B 4256 4#20 4257 ---------- C 4258 4#3 4259 ---------- D 4260 3#10 4261 ---------- E 4262 2#11 4263 2#1010 4264 ---------- F 4265 4#30 4266 ---------- G 4267 8#12 4268--- 4269name: integer-base-3 4270description: 4271 More base parsing (hmm doesn't test much..) 4272stdin: 4273 typeset -i aa 4274 aa=1+12#10+2 4275 echo $aa 4276 typeset -i bb 4277 bb=1+$aa 4278 echo $bb 4279 typeset -i bb 4280 bb=$aa 4281 echo $bb 4282 typeset -i cc 4283 cc=$aa 4284 echo $cc 4285expected-stdout: 4286 15 4287 16 4288 15 4289 15 4290--- 4291name: integer-base-4 4292description: 4293 Check that things not declared as integers are not made integers, 4294 also, check if base is not reset by -i with no arguments. 4295 (ksh93 fails - prints 10#20 - go figure) 4296stdin: 4297 xx=20 4298 let xx=10 4299 typeset -i | grep '^xx=' 4300 typeset -i4 a=10 4301 typeset -i a=20 4302 echo $a 4303expected-stdout: 4304 4#110 4305--- 4306name: integer-base-5 4307description: 4308 More base stuff 4309stdin: 4310 typeset -i4 a=3#10 4311 echo $a 4312 echo -- 4313 typeset -i j=3 4314 j='~3' 4315 echo $j 4316 echo -- 4317 typeset -i k=1 4318 x[k=k+1]=3 4319 echo $k 4320 echo -- 4321 typeset -i l 4322 for l in 1 2+3 4; do echo $l; done 4323expected-stdout: 4324 4#3 4325 -- 4326 -4 4327 -- 4328 2 4329 -- 4330 1 4331 5 4332 4 4333--- 4334name: integer-base-6 4335description: 4336 Even more base stuff 4337 (ksh93 fails this test - prints 0) 4338stdin: 4339 typeset -i7 i 4340 i= 4341 echo $i 4342expected-stdout: 4343 7#0 4344--- 4345name: integer-base-7 4346description: 4347 Check that non-integer parameters don't get bases assigned 4348stdin: 4349 echo $(( zz = 8#100 )) 4350 echo $zz 4351expected-stdout: 4352 64 4353 64 4354--- 4355name: integer-base-check-flat 4356description: 4357 Check behaviour does not match POSuX (except if set -o posix), 4358 because a not type-safe scripting language has *no* business 4359 interpreting the string "010" as octal numer eight (dangerous). 4360stdin: 4361 echo 1 "$("$__progname" -c 'echo :$((10))/$((010)),$((0x10)):')" . 4362 echo 2 "$("$__progname" -o posix -c 'echo :$((10))/$((010)),$((0x10)):')" . 4363 echo 3 "$("$__progname" -o sh -c 'echo :$((10))/$((010)),$((0x10)):')" . 4364expected-stdout: 4365 1 :10/10,16: . 4366 2 :10/8,16: . 4367 3 :10/10,16: . 4368--- 4369name: integer-base-check-numeric-from 4370description: 4371 Check behaviour for base one to 36, and that 37 errors out 4372stdin: 4373 echo 1:$((1#1))0. 4374 i=1 4375 while (( ++i <= 36 )); do 4376 eval 'echo '$i':$(('$i'#10)).' 4377 done 4378 echo 37:$($__progname -c 'echo $((37#10))').$?: 4379expected-stdout: 4380 1:490. 4381 2:2. 4382 3:3. 4383 4:4. 4384 5:5. 4385 6:6. 4386 7:7. 4387 8:8. 4388 9:9. 4389 10:10. 4390 11:11. 4391 12:12. 4392 13:13. 4393 14:14. 4394 15:15. 4395 16:16. 4396 17:17. 4397 18:18. 4398 19:19. 4399 20:20. 4400 21:21. 4401 22:22. 4402 23:23. 4403 24:24. 4404 25:25. 4405 26:26. 4406 27:27. 4407 28:28. 4408 29:29. 4409 30:30. 4410 31:31. 4411 32:32. 4412 33:33. 4413 34:34. 4414 35:35. 4415 36:36. 4416 37:.0: 4417expected-stderr-pattern: 4418 /.*bad number '37#10'/ 4419--- 4420name: integer-base-check-numeric-to 4421description: 4422 Check behaviour for base one to 36, and that 37 errors out 4423stdin: 4424 i=0 4425 while (( ++i <= 37 )); do 4426 typeset -Uui$i x=0x40 4427 eval "typeset -i10 y=$x" 4428 print $i:$x.$y. 4429 done 4430expected-stdout: 4431 1:1#@.64. 4432 2:2#1000000.64. 4433 3:3#2101.64. 4434 4:4#1000.64. 4435 5:5#224.64. 4436 6:6#144.64. 4437 7:7#121.64. 4438 8:8#100.64. 4439 9:9#71.64. 4440 10:64.64. 4441 11:11#59.64. 4442 12:12#54.64. 4443 13:13#4C.64. 4444 14:14#48.64. 4445 15:15#44.64. 4446 16:16#40.64. 4447 17:17#3D.64. 4448 18:18#3A.64. 4449 19:19#37.64. 4450 20:20#34.64. 4451 21:21#31.64. 4452 22:22#2K.64. 4453 23:23#2I.64. 4454 24:24#2G.64. 4455 25:25#2E.64. 4456 26:26#2C.64. 4457 27:27#2A.64. 4458 28:28#28.64. 4459 29:29#26.64. 4460 30:30#24.64. 4461 31:31#22.64. 4462 32:32#20.64. 4463 33:33#1V.64. 4464 34:34#1U.64. 4465 35:35#1T.64. 4466 36:36#1S.64. 4467 37:36#1S.64. 4468expected-stderr-pattern: 4469 /.*bad integer base: 37/ 4470--- 4471name: integer-arithmetic-span 4472description: 4473 Check wraparound and size that is defined in mksh 4474category: int:32 4475stdin: 4476 echo s:$((2147483647+1)).$(((2147483647*2)+1)).$(((2147483647*2)+2)). 4477 echo u:$((#2147483647+1)).$((#(2147483647*2)+1)).$((#(2147483647*2)+2)). 4478expected-stdout: 4479 s:-2147483648.-1.0. 4480 u:2147483648.4294967295.0. 4481--- 4482name: integer-arithmetic-span-64 4483description: 4484 Check wraparound and size that is defined in mksh 4485category: int:64 4486stdin: 4487 echo s:$((9223372036854775807+1)).$(((9223372036854775807*2)+1)).$(((9223372036854775807*2)+2)). 4488 echo u:$((#9223372036854775807+1)).$((#(9223372036854775807*2)+1)).$((#(9223372036854775807*2)+2)). 4489expected-stdout: 4490 s:-9223372036854775808.-1.0. 4491 u:9223372036854775808.18446744073709551615.0. 4492--- 4493name: integer-size-FAIL-to-detect 4494description: 4495 Notify the user that their ints are not 32 or 64 bit 4496category: int:u 4497stdin: 4498 : 4499--- 4500name: lineno-stdin 4501description: 4502 See if $LINENO is updated and can be modified. 4503stdin: 4504 echo A $LINENO 4505 echo B $LINENO 4506 LINENO=20 4507 echo C $LINENO 4508expected-stdout: 4509 A 1 4510 B 2 4511 C 20 4512--- 4513name: lineno-inc 4514description: 4515 See if $LINENO is set for .'d files. 4516file-setup: file 644 "dotfile" 4517 echo dot A $LINENO 4518 echo dot B $LINENO 4519 LINENO=20 4520 echo dot C $LINENO 4521stdin: 4522 echo A $LINENO 4523 echo B $LINENO 4524 . ./dotfile 4525expected-stdout: 4526 A 1 4527 B 2 4528 dot A 1 4529 dot B 2 4530 dot C 20 4531--- 4532name: lineno-func 4533description: 4534 See if $LINENO is set for commands in a function. 4535stdin: 4536 echo A $LINENO 4537 echo B $LINENO 4538 bar() { 4539 echo func A $LINENO 4540 echo func B $LINENO 4541 } 4542 bar 4543 echo C $LINENO 4544expected-stdout: 4545 A 1 4546 B 2 4547 func A 4 4548 func B 5 4549 C 8 4550--- 4551name: lineno-unset 4552description: 4553 See if unsetting LINENO makes it non-magic. 4554file-setup: file 644 "dotfile" 4555 echo dot A $LINENO 4556 echo dot B $LINENO 4557stdin: 4558 unset LINENO 4559 echo A $LINENO 4560 echo B $LINENO 4561 bar() { 4562 echo func A $LINENO 4563 echo func B $LINENO 4564 } 4565 bar 4566 . ./dotfile 4567 echo C $LINENO 4568expected-stdout: 4569 A 4570 B 4571 func A 4572 func B 4573 dot A 4574 dot B 4575 C 4576--- 4577name: lineno-unset-use 4578description: 4579 See if unsetting LINENO makes it non-magic even 4580 when it is re-used. 4581file-setup: file 644 "dotfile" 4582 echo dot A $LINENO 4583 echo dot B $LINENO 4584stdin: 4585 unset LINENO 4586 LINENO=3 4587 echo A $LINENO 4588 echo B $LINENO 4589 bar() { 4590 echo func A $LINENO 4591 echo func B $LINENO 4592 } 4593 bar 4594 . ./dotfile 4595 echo C $LINENO 4596expected-stdout: 4597 A 3 4598 B 3 4599 func A 3 4600 func B 3 4601 dot A 3 4602 dot B 3 4603 C 3 4604--- 4605name: lineno-trap 4606description: 4607 Check if LINENO is tracked in traps 4608stdin: 4609 fail() { 4610 echo "line <$1>" 4611 exit 1 4612 } 4613 trap 'fail $LINENO' INT ERR 4614 false 4615expected-stdout: 4616 line <6> 4617expected-exit: 1 4618--- 4619name: unknown-trap 4620description: 4621 Ensure unknown traps are not a syntax error 4622stdin: 4623 ( 4624 trap "echo trap 1 executed" UNKNOWNSIGNAL || echo "foo" 4625 echo =1 4626 trap "echo trap 2 executed" UNKNOWNSIGNAL EXIT 999999 FNORD 4627 echo = $? 4628 ) 2>&1 | sed "s^${__progname%.exe}\.*e*x*e*: <stdin>\[[0-9]*]PROG" 4629expected-stdout: 4630 PROG: trap: bad signal 'UNKNOWNSIGNAL' 4631 foo 4632 =1 4633 PROG: trap: bad signal 'UNKNOWNSIGNAL' 4634 PROG: trap: bad signal '999999' 4635 PROG: trap: bad signal 'FNORD' 4636 = 3 4637 trap 2 executed 4638--- 4639name: read-IFS-1 4640description: 4641 Simple test, default IFS 4642stdin: 4643 echo "A B " > IN 4644 unset x y z 4645 read x y z < IN 4646 echo 1: "x[$x] y[$y] z[$z]" 4647 echo 1a: ${z-z not set} 4648 read x < IN 4649 echo 2: "x[$x]" 4650expected-stdout: 4651 1: x[A] y[B] z[] 4652 1a: 4653 2: x[A B] 4654--- 4655name: read-ksh-1 4656description: 4657 If no var specified, REPLY is used 4658stdin: 4659 echo "abc" > IN 4660 read < IN 4661 echo "[$REPLY]"; 4662expected-stdout: 4663 [abc] 4664--- 4665name: read-regress-1 4666description: 4667 Check a regression of read 4668file-setup: file 644 "foo" 4669 foo bar 4670 baz 4671 blah 4672stdin: 4673 while read a b c; do 4674 read d 4675 break 4676 done <foo 4677 echo "<$a|$b|$c><$d>" 4678expected-stdout: 4679 <foo|bar|><baz> 4680--- 4681name: read-delim-1 4682description: 4683 Check read with delimiters 4684stdin: 4685 emit() { 4686 print -n 'foo bar\tbaz\nblah \0blub\tblech\nmyok meck \0' 4687 } 4688 emit | while IFS= read -d "" foo; do print -r -- "<$foo>"; done 4689 emit | while read -d "" foo; do print -r -- "<$foo>"; done 4690 emit | while read -d "eh?" foo; do print -r -- "<$foo>"; done 4691expected-stdout: 4692 <foo bar baz 4693 blah > 4694 <blub blech 4695 myok meck > 4696 <foo bar baz 4697 blah> 4698 <blub blech 4699 myok meck> 4700 <foo bar baz 4701 blah blub bl> 4702 <ch 4703 myok m> 4704--- 4705name: read-ext-1 4706description: 4707 Check read with number of bytes specified, and -A 4708stdin: 4709 print 'foo\nbar' >x1 4710 print -n x >x2 4711 print 'foo\\ bar baz' >x3 4712 x1a=u; read x1a <x1 4713 x1b=u; read -N-1 x1b <x1 4714 x2a=u; read x2a <x2; r2a=$? 4715 x2b=u; read -N2 x2c <x2; r2b=$? 4716 x2c=u; read -n2 x2c <x2; r2c=$? 4717 x3a=u; read -A x3a <x3 4718 print -r "x1a=<$x1a>" 4719 print -r "x1b=<$x1b>" 4720 print -r "x2a=$r2a<$x2a>" 4721 print -r "x2b=$r2b<$x2b>" 4722 print -r "x2c=$r2c<$x2c>" 4723 print -r "x3a=<${x3a[0]}|${x3a[1]}|${x3a[2]}>" 4724expected-stdout: 4725 x1a=<foo> 4726 x1b=<foo 4727 bar> 4728 x2a=1<x> 4729 x2b=1<u> 4730 x2c=0<x> 4731 x3a=<foo bar|baz|> 4732--- 4733name: regression-1 4734description: 4735 Lex array code had problems with this. 4736stdin: 4737 echo foo[ 4738 n=bar 4739 echo "hi[ $n ]=1" 4740expected-stdout: 4741 foo[ 4742 hi[ bar ]=1 4743--- 4744name: regression-2 4745description: 4746 When PATH is set before running a command, the new path is 4747 not used in doing the path search 4748 $ echo echo hi > /tmp/q ; chmod a+rx /tmp/q 4749 $ PATH=/tmp q 4750 q: not found 4751 $ 4752 in comexec() the two lines 4753 while (*vp != NULL) 4754 (void) typeset(*vp++, xxx, 0); 4755 need to be moved out of the switch to before findcom() is 4756 called - I don't know what this will break. 4757stdin: 4758 : ${PWD:-`pwd 2> /dev/null`} 4759 : ${PWD:?"PWD not set - can't do test"} 4760 mkdir Y 4761 cat > Y/xxxscript << EOF 4762 #!/bin/sh 4763 # Need to restore path so echo can be found (some shells don't have 4764 # it as a built-in) 4765 PATH=\$OLDPATH 4766 echo hi 4767 exit 0 4768 EOF 4769 chmod a+rx Y/xxxscript 4770 export OLDPATH="$PATH" 4771 PATH=$PWD/Y xxxscript 4772 exit $? 4773expected-stdout: 4774 hi 4775--- 4776name: regression-6 4777description: 4778 Parsing of $(..) expressions is non-optimal. It is 4779 impossible to have any parentheses inside the expression. 4780 I.e., 4781 $ ksh -c 'echo $(echo \( )' 4782 no closing quote 4783 $ ksh -c 'echo $(echo "(" )' 4784 no closing quote 4785 $ 4786 The solution is to hack the parsing clode in lex.c, the 4787 question is how to hack it: should any parentheses be 4788 escaped by a backslash, or should recursive parsing be done 4789 (so quotes could also be used to hide hem). The former is 4790 easier, the later better... 4791stdin: 4792 echo $(echo \( ) 4793 echo $(echo "(" ) 4794expected-stdout: 4795 ( 4796 ( 4797--- 4798name: regression-9 4799description: 4800 Continue in a for loop does not work right: 4801 for i in a b c ; do 4802 if [ $i = b ] ; then 4803 continue 4804 fi 4805 echo $i 4806 done 4807 Prints a forever... 4808stdin: 4809 first=yes 4810 for i in a b c ; do 4811 if [ $i = b ] ; then 4812 if [ $first = no ] ; then 4813 echo 'continue in for loop broken' 4814 break # hope break isn't broken too :-) 4815 fi 4816 first=no 4817 continue 4818 fi 4819 done 4820 echo bye 4821expected-stdout: 4822 bye 4823--- 4824name: regression-10 4825description: 4826 The following: 4827 set -- `false` 4828 echo $? 4829 should print 0 according to POSIX (dash, bash, ksh93, posh) 4830 but not 0 according to the getopt(1) manual page, ksh88, and 4831 Bourne sh (such as /bin/sh on Solaris). 4832 We honour POSIX except when -o sh is set. 4833category: shell:legacy-no 4834stdin: 4835 showf() { 4836 [[ -o posix ]]; FPOSIX=$((1-$?)) 4837 [[ -o sh ]]; FSH=$((1-$?)) 4838 echo -n "FPOSIX=$FPOSIX FSH=$FSH " 4839 } 4840 set +o posix +o sh 4841 showf 4842 set -- `false` 4843 echo rv=$? 4844 set -o sh 4845 showf 4846 set -- `false` 4847 echo rv=$? 4848 set -o posix 4849 showf 4850 set -- `false` 4851 echo rv=$? 4852 set -o posix -o sh 4853 showf 4854 set -- `false` 4855 echo rv=$? 4856expected-stdout: 4857 FPOSIX=0 FSH=0 rv=0 4858 FPOSIX=0 FSH=1 rv=1 4859 FPOSIX=1 FSH=0 rv=0 4860 FPOSIX=1 FSH=1 rv=0 4861--- 4862name: regression-10-legacy 4863description: 4864 The following: 4865 set -- `false` 4866 echo $? 4867 should print 0 according to POSIX (dash, bash, ksh93, posh) 4868 but not 0 according to the getopt(1) manual page, ksh88, and 4869 Bourne sh (such as /bin/sh on Solaris). 4870category: shell:legacy-yes 4871stdin: 4872 showf() { 4873 [[ -o posix ]]; FPOSIX=$((1-$?)) 4874 [[ -o sh ]]; FSH=$((1-$?)) 4875 echo -n "FPOSIX=$FPOSIX FSH=$FSH " 4876 } 4877 set +o posix +o sh 4878 showf 4879 set -- `false` 4880 echo rv=$? 4881 set -o sh 4882 showf 4883 set -- `false` 4884 echo rv=$? 4885 set -o posix 4886 showf 4887 set -- `false` 4888 echo rv=$? 4889 set -o posix -o sh 4890 showf 4891 set -- `false` 4892 echo rv=$? 4893expected-stdout: 4894 FPOSIX=0 FSH=0 rv=1 4895 FPOSIX=0 FSH=1 rv=1 4896 FPOSIX=1 FSH=0 rv=0 4897 FPOSIX=1 FSH=1 rv=0 4898--- 4899name: regression-11 4900description: 4901 The following: 4902 x=/foo/bar/blah 4903 echo ${x##*/} 4904 should echo blah but on some machines echos /foo/bar/blah. 4905stdin: 4906 x=/foo/bar/blah 4907 echo ${x##*/} 4908expected-stdout: 4909 blah 4910--- 4911name: regression-12 4912description: 4913 Both of the following echos produce the same output under sh/ksh.att: 4914 #!/bin/sh 4915 x="foo bar" 4916 echo "`echo \"$x\"`" 4917 echo "`echo "$x"`" 4918 pdksh produces different output for the former (foo instead of foo\tbar) 4919stdin: 4920 x="foo bar" 4921 echo "`echo \"$x\"`" 4922 echo "`echo "$x"`" 4923expected-stdout: 4924 foo bar 4925 foo bar 4926--- 4927name: regression-13 4928description: 4929 The following command hangs forever: 4930 $ (: ; cat /etc/termcap) | sleep 2 4931 This is because the shell forks a shell to run the (..) command 4932 and this shell has the pipe open. When the sleep dies, the cat 4933 doesn't get a SIGPIPE 'cause a process (ie, the second shell) 4934 still has the pipe open. 4935 4936 NOTE: this test provokes a bizarre bug in ksh93 (shell starts reading 4937 commands from /etc/termcap..) 4938time-limit: 10 4939stdin: 4940 echo A line of text that will be duplicated quite a number of times.> t1 4941 cat t1 t1 t1 t1 t1 t1 t1 t1 t1 t1 t1 t1 t1 t1 t1 t1 > t2 4942 cat t2 t2 t2 t2 t2 t2 t2 t2 t2 t2 t2 t2 t2 t2 t2 t2 > t1 4943 cat t1 t1 t1 t1 > t2 4944 (: ; cat t2 2>/dev/null) | sleep 1 4945--- 4946name: regression-14 4947description: 4948 The command 4949 $ (foobar) 2> /dev/null 4950 generates no output under /bin/sh, but pdksh produces the error 4951 foobar: not found 4952 Also, the command 4953 $ foobar 2> /dev/null 4954 generates an error under /bin/sh and pdksh, but AT&T ksh88 produces 4955 no error (redirected to /dev/null). 4956stdin: 4957 (you/should/not/see/this/error/1) 2> /dev/null 4958 you/should/not/see/this/error/2 2> /dev/null 4959 true 4960--- 4961name: regression-15 4962description: 4963 The command 4964 $ whence foobar 4965 generates a blank line under pdksh and sets the exit status to 0. 4966 AT&T ksh88 generates no output and sets the exit status to 1. Also, 4967 the command 4968 $ whence foobar cat 4969 generates no output under AT&T ksh88 (pdksh generates a blank line 4970 and /bin/cat). 4971stdin: 4972 whence does/not/exist > /dev/null 4973 echo 1: $? 4974 echo 2: $(whence does/not/exist | wc -l) 4975 echo 3: $(whence does/not/exist cat | wc -l) 4976expected-stdout: 4977 1: 1 4978 2: 0 4979 3: 0 4980--- 4981name: regression-16 4982description: 4983 ${var%%expr} seems to be broken in many places. On the mips 4984 the commands 4985 $ read line < /etc/passwd 4986 $ echo $line 4987 root:0:1:... 4988 $ echo ${line%%:*} 4989 root 4990 $ echo $line 4991 root 4992 $ 4993 change the value of line. On sun4s & pas, the echo ${line%%:*} doesn't 4994 work. Haven't checked elsewhere... 4995script: 4996 read x 4997 y=$x 4998 echo ${x%%:*} 4999 echo $x 5000stdin: 5001 root:asdjhasdasjhs:0:1:Root:/:/bin/sh 5002expected-stdout: 5003 root 5004 root:asdjhasdasjhs:0:1:Root:/:/bin/sh 5005--- 5006name: regression-17 5007description: 5008 The command 5009 . /foo/bar 5010 should set the exit status to non-zero (sh and AT&T ksh88 do). 5011 XXX doting a non existent file is a fatal error for a script 5012stdin: 5013 . does/not/exist 5014expected-exit: e != 0 5015expected-stderr-pattern: /.?/ 5016--- 5017name: regression-19 5018description: 5019 Both of the following echos should produce the same thing, but don't: 5020 $ x=foo/bar 5021 $ echo ${x%/*} 5022 foo 5023 $ echo "${x%/*}" 5024 foo/bar 5025stdin: 5026 x=foo/bar 5027 echo "${x%/*}" 5028expected-stdout: 5029 foo 5030--- 5031name: regression-21 5032description: 5033 backslash does not work as expected in case labels: 5034 $ x='-x' 5035 $ case $x in 5036 -\?) echo hi 5037 esac 5038 hi 5039 $ x='-?' 5040 $ case $x in 5041 -\\?) echo hi 5042 esac 5043 hi 5044 $ 5045stdin: 5046 case -x in 5047 -\?) echo fail 5048 esac 5049--- 5050name: regression-22 5051description: 5052 Quoting backquotes inside backquotes doesn't work: 5053 $ echo `echo hi \`echo there\` folks` 5054 asks for more info. sh and AT&T ksh88 both echo 5055 hi there folks 5056stdin: 5057 echo `echo hi \`echo there\` folks` 5058expected-stdout: 5059 hi there folks 5060--- 5061name: regression-23 5062description: 5063 )) is not treated `correctly': 5064 $ (echo hi ; (echo there ; echo folks)) 5065 missing (( 5066 $ 5067 instead of (as sh and ksh.att) 5068 $ (echo hi ; (echo there ; echo folks)) 5069 hi 5070 there 5071 folks 5072 $ 5073stdin: 5074 ( : ; ( : ; echo hi)) 5075expected-stdout: 5076 hi 5077--- 5078name: regression-25 5079description: 5080 Check reading stdin in a while loop. The read should only read 5081 a single line, not a whole stdio buffer; the cat should get 5082 the rest. 5083stdin: 5084 (echo a; echo b) | while read x ; do 5085 echo $x 5086 cat > /dev/null 5087 done 5088expected-stdout: 5089 a 5090--- 5091name: regression-26 5092description: 5093 Check reading stdin in a while loop. The read should read both 5094 lines, not just the first. 5095script: 5096 a= 5097 while [ "$a" != xxx ] ; do 5098 last=$x 5099 read x 5100 cat /dev/null | sed 's/x/y/' 5101 a=x$a 5102 done 5103 echo $last 5104stdin: 5105 a 5106 b 5107expected-stdout: 5108 b 5109--- 5110name: regression-27 5111description: 5112 The command 5113 . /does/not/exist 5114 should cause a script to exit. 5115stdin: 5116 . does/not/exist 5117 echo hi 5118expected-exit: e != 0 5119expected-stderr-pattern: /does\/not\/exist/ 5120--- 5121name: regression-28 5122description: 5123 variable assignements not detected well 5124stdin: 5125 a.x=1 echo hi 5126expected-exit: e != 0 5127expected-stderr-pattern: /a\.x=1/ 5128--- 5129name: regression-29 5130description: 5131 alias expansion different from AT&T ksh88 5132stdin: 5133 alias a='for ' b='i in' 5134 a b hi ; do echo $i ; done 5135expected-stdout: 5136 hi 5137--- 5138name: regression-30 5139description: 5140 strange characters allowed inside ${...} 5141stdin: 5142 echo ${a{b}} 5143expected-exit: e != 0 5144expected-stderr-pattern: /.?/ 5145--- 5146name: regression-31 5147description: 5148 Does read handle partial lines correctly 5149script: 5150 a= ret= 5151 while [ "$a" != xxx ] ; do 5152 read x y z 5153 ret=$? 5154 a=x$a 5155 done 5156 echo "[$x]" 5157 echo $ret 5158stdin: ! 5159 a A aA 5160 b B Bb 5161 c 5162expected-stdout: 5163 [c] 5164 1 5165--- 5166name: regression-32 5167description: 5168 Does read set variables to null at eof? 5169script: 5170 a= 5171 while [ "$a" != xxx ] ; do 5172 read x y z 5173 a=x$a 5174 done 5175 echo 1: ${x-x not set} ${y-y not set} ${z-z not set} 5176 echo 2: ${x:+x not null} ${y:+y not null} ${z:+z not null} 5177stdin: 5178 a A Aa 5179 b B Bb 5180expected-stdout: 5181 1: 5182 2: 5183--- 5184name: regression-33 5185description: 5186 Does umask print a leading 0 when umask is 3 digits? 5187stdin: 5188 # on MiNT, the first umask call seems to fail 5189 umask 022 5190 # now, the test proper 5191 umask 222 5192 umask 5193expected-stdout: 5194 0222 5195--- 5196name: regression-35 5197description: 5198 Tempory files used for here-docs in functions get trashed after 5199 the function is parsed (before it is executed) 5200stdin: 5201 f1() { 5202 cat <<- EOF 5203 F1 5204 EOF 5205 f2() { 5206 cat <<- EOF 5207 F2 5208 EOF 5209 } 5210 } 5211 f1 5212 f2 5213 unset -f f1 5214 f2 5215expected-stdout: 5216 F1 5217 F2 5218 F2 5219--- 5220name: regression-36 5221description: 5222 Command substitution breaks reading in while loop 5223 (test from <sjg@void.zen.oz.au>) 5224stdin: 5225 (echo abcdef; echo; echo 123) | 5226 while read line 5227 do 5228 # the following line breaks it 5229 c=`echo $line | wc -c` 5230 echo $c 5231 done 5232expected-stdout: 5233 7 5234 1 5235 4 5236--- 5237name: regression-37 5238description: 5239 Machines with broken times() (reported by <sjg@void.zen.oz.au>) 5240 time does not report correct real time 5241stdin: 5242 time sleep 1 5243expected-stderr-pattern: !/^\s*0\.0[\s\d]+real|^\s*real[\s]+0+\.0/ 5244--- 5245name: regression-38 5246description: 5247 set -e doesn't ignore exit codes for if/while/until/&&/||/!. 5248arguments: !-e! 5249stdin: 5250 if false; then echo hi ; fi 5251 false || true 5252 false && true 5253 while false; do echo hi; done 5254 echo ok 5255expected-stdout: 5256 ok 5257--- 5258name: regression-39 5259description: 5260 Only posh and oksh(2013-07) say “hi” below; FreeBSD sh, 5261 GNU bash in POSIX mode, dash, ksh93, mksh don’t. All of 5262 them exit 0. The POSIX behaviour is needed by BSD make. 5263stdin: 5264 set -e 5265 echo `false; echo hi` $(<this-file-does-not-exist) 5266 echo $? 5267expected-stdout: 5268 5269 0 5270expected-stderr-pattern: /this-file-does-not-exist/ 5271--- 5272name: regression-40 5273description: 5274 This used to cause a core dump 5275env-setup: !RANDOM=12! 5276stdin: 5277 echo hi 5278expected-stdout: 5279 hi 5280--- 5281name: regression-41 5282description: 5283 foo should be set to bar (should not be empty) 5284stdin: 5285 foo=` 5286 echo bar` 5287 echo "($foo)" 5288expected-stdout: 5289 (bar) 5290--- 5291name: regression-42 5292description: 5293 Can't use command line assignments to assign readonly parameters. 5294stdin: 5295 print '#!'"$__progname"'\nunset RANDOM\nexport | while IFS= read -r' \ 5296 'RANDOM; do eval '\''print -r -- "$RANDOM=$'\''"$RANDOM"'\'\"\'\; \ 5297 done >env; chmod +x env; PATH=.:$PATH 5298 foo=bar 5299 readonly foo 5300 foo=stuff env | grep '^foo' 5301expected-exit: e != 0 5302expected-stderr-pattern: 5303 /read-only/ 5304--- 5305name: regression-43 5306description: 5307 Can subshells be prefixed by redirections (historical shells allow 5308 this) 5309stdin: 5310 < /dev/null (sed 's/^/X/') 5311--- 5312name: regression-45 5313description: 5314 Parameter assignments with [] recognised correctly 5315stdin: 5316 FOO=*[12] 5317 BAR=abc[ 5318 MORE=[abc] 5319 JUNK=a[bc 5320 echo "<$FOO>" 5321 echo "<$BAR>" 5322 echo "<$MORE>" 5323 echo "<$JUNK>" 5324expected-stdout: 5325 <*[12]> 5326 <abc[> 5327 <[abc]> 5328 <a[bc> 5329--- 5330name: regression-46 5331description: 5332 Check that alias expansion works in command substitutions and 5333 at the end of file. 5334stdin: 5335 alias x='echo hi' 5336 FOO="`x` " 5337 echo "[$FOO]" 5338 x 5339expected-stdout: 5340 [hi ] 5341 hi 5342--- 5343name: regression-47 5344description: 5345 Check that aliases are fully read. 5346stdin: 5347 alias x='echo hi; 5348 echo there' 5349 x 5350 echo done 5351expected-stdout: 5352 hi 5353 there 5354 done 5355--- 5356name: regression-48 5357description: 5358 Check that (here doc) temp files are not left behind after an exec. 5359stdin: 5360 mkdir foo || exit 1 5361 TMPDIR=$PWD/foo "$__progname" <<- 'EOF' 5362 x() { 5363 sed 's/^/X /' << E_O_F 5364 hi 5365 there 5366 folks 5367 E_O_F 5368 echo "done ($?)" 5369 } 5370 echo=echo; [ -x /bin/echo ] && echo=/bin/echo 5371 exec $echo subtest-1 hi 5372 EOF 5373 echo subtest-1 foo/* 5374 TMPDIR=$PWD/foo "$__progname" <<- 'EOF' 5375 echo=echo; [ -x /bin/echo ] && echo=/bin/echo 5376 sed 's/^/X /' << E_O_F; exec $echo subtest-2 hi 5377 a 5378 few 5379 lines 5380 E_O_F 5381 EOF 5382 echo subtest-2 foo/* 5383expected-stdout: 5384 subtest-1 hi 5385 subtest-1 foo/* 5386 X a 5387 X few 5388 X lines 5389 subtest-2 hi 5390 subtest-2 foo/* 5391--- 5392name: regression-49 5393description: 5394 Check that unset params with attributes are reported by set, those 5395 sans attributes are not. 5396stdin: 5397 unset FOO BAR 5398 echo X$FOO 5399 export BAR 5400 typeset -i BLAH 5401 set | grep FOO 5402 set | grep BAR 5403 set | grep BLAH 5404expected-stdout: 5405 X 5406 BAR 5407 BLAH 5408--- 5409name: regression-50 5410description: 5411 Check that aliases do not use continuation prompt after trailing 5412 semi-colon. 5413file-setup: file 644 "envf" 5414 PS1=Y 5415 PS2=X 5416env-setup: !ENV=./envf! 5417need-ctty: yes 5418arguments: !-i! 5419stdin: 5420 alias foo='echo hi ; ' 5421 foo 5422 foo echo there 5423expected-stdout: 5424 hi 5425 hi 5426 there 5427expected-stderr: ! 5428 YYYY 5429--- 5430name: regression-51 5431description: 5432 Check that set allows both +o and -o options on same command line. 5433stdin: 5434 set a b c 5435 set -o noglob +o allexport 5436 echo A: $*, * 5437expected-stdout: 5438 A: a b c, * 5439--- 5440name: regression-52 5441description: 5442 Check that globbing works in pipelined commands 5443file-setup: file 644 "envf" 5444 PS1=P 5445file-setup: file 644 "abc" 5446 stuff 5447env-setup: !ENV=./envf! 5448need-ctty: yes 5449arguments: !-i! 5450stdin: 5451 sed 's/^/X /' < ab* 5452 echo mark 1 5453 sed 's/^/X /' < ab* | sed 's/^/Y /' 5454 echo mark 2 5455expected-stdout: 5456 X stuff 5457 mark 1 5458 Y X stuff 5459 mark 2 5460expected-stderr: ! 5461 PPPPP 5462--- 5463name: regression-53 5464description: 5465 Check that getopts works in functions 5466stdin: 5467 bfunc() { 5468 echo bfunc: enter "(args: $*; OPTIND=$OPTIND)" 5469 while getopts B oc; do 5470 case $oc in 5471 (B) 5472 echo bfunc: B option 5473 ;; 5474 (*) 5475 echo bfunc: odd option "($oc)" 5476 ;; 5477 esac 5478 done 5479 echo bfunc: leave 5480 } 5481 5482 function kfunc { 5483 echo kfunc: enter "(args: $*; OPTIND=$OPTIND)" 5484 while getopts K oc; do 5485 case $oc in 5486 (K) 5487 echo kfunc: K option 5488 ;; 5489 (*) 5490 echo bfunc: odd option "($oc)" 5491 ;; 5492 esac 5493 done 5494 echo kfunc: leave 5495 } 5496 5497 set -- -f -b -k -l 5498 echo "line 1: OPTIND=$OPTIND" 5499 getopts kbfl optc 5500 echo "line 2: ret=$?, optc=$optc, OPTIND=$OPTIND" 5501 bfunc -BBB blah 5502 echo "line 3: OPTIND=$OPTIND" 5503 getopts kbfl optc 5504 echo "line 4: ret=$?, optc=$optc, OPTIND=$OPTIND" 5505 kfunc -KKK blah 5506 echo "line 5: OPTIND=$OPTIND" 5507 getopts kbfl optc 5508 echo "line 6: ret=$?, optc=$optc, OPTIND=$OPTIND" 5509 echo 5510 5511 OPTIND=1 5512 set -- -fbkl 5513 echo "line 10: OPTIND=$OPTIND" 5514 getopts kbfl optc 5515 echo "line 20: ret=$?, optc=$optc, OPTIND=$OPTIND" 5516 bfunc -BBB blah 5517 echo "line 30: OPTIND=$OPTIND" 5518 getopts kbfl optc 5519 echo "line 40: ret=$?, optc=$optc, OPTIND=$OPTIND" 5520 kfunc -KKK blah 5521 echo "line 50: OPTIND=$OPTIND" 5522 getopts kbfl optc 5523 echo "line 60: ret=$?, optc=$optc, OPTIND=$OPTIND" 5524expected-stdout: 5525 line 1: OPTIND=1 5526 line 2: ret=0, optc=f, OPTIND=2 5527 bfunc: enter (args: -BBB blah; OPTIND=2) 5528 bfunc: B option 5529 bfunc: B option 5530 bfunc: leave 5531 line 3: OPTIND=2 5532 line 4: ret=0, optc=b, OPTIND=3 5533 kfunc: enter (args: -KKK blah; OPTIND=1) 5534 kfunc: K option 5535 kfunc: K option 5536 kfunc: K option 5537 kfunc: leave 5538 line 5: OPTIND=3 5539 line 6: ret=0, optc=k, OPTIND=4 5540 5541 line 10: OPTIND=1 5542 line 20: ret=0, optc=f, OPTIND=2 5543 bfunc: enter (args: -BBB blah; OPTIND=2) 5544 bfunc: B option 5545 bfunc: B option 5546 bfunc: leave 5547 line 30: OPTIND=2 5548 line 40: ret=1, optc=?, OPTIND=2 5549 kfunc: enter (args: -KKK blah; OPTIND=1) 5550 kfunc: K option 5551 kfunc: K option 5552 kfunc: K option 5553 kfunc: leave 5554 line 50: OPTIND=2 5555 line 60: ret=1, optc=?, OPTIND=2 5556--- 5557name: regression-54 5558description: 5559 Check that ; is not required before the then in if (( ... )) then ... 5560stdin: 5561 if (( 1 )) then 5562 echo ok dparen 5563 fi 5564 if [[ -n 1 ]] then 5565 echo ok dbrackets 5566 fi 5567expected-stdout: 5568 ok dparen 5569 ok dbrackets 5570--- 5571name: regression-55 5572description: 5573 Check ${foo:%bar} is allowed (ksh88 allows it...) 5574stdin: 5575 x=fooXbarXblah 5576 echo 1 ${x%X*} 5577 echo 2 ${x:%X*} 5578 echo 3 ${x%%X*} 5579 echo 4 ${x:%%X*} 5580 echo 5 ${x#*X} 5581 echo 6 ${x:#*X} 5582 echo 7 ${x##*X} 5583 echo 8 ${x:##*X} 5584expected-stdout: 5585 1 fooXbar 5586 2 fooXbar 5587 3 foo 5588 4 foo 5589 5 barXblah 5590 6 barXblah 5591 7 blah 5592 8 blah 5593--- 5594name: regression-57 5595description: 5596 Check if typeset output is correct for 5597 uninitialised array elements. 5598stdin: 5599 typeset -i xxx[4] 5600 echo A 5601 typeset -i | grep xxx | sed 's/^/ /' 5602 echo B 5603 typeset | grep xxx | sed 's/^/ /' 5604 5605 xxx[1]=2+5 5606 echo M 5607 typeset -i | grep xxx | sed 's/^/ /' 5608 echo N 5609 typeset | grep xxx | sed 's/^/ /' 5610expected-stdout: 5611 A 5612 xxx 5613 B 5614 typeset -i xxx 5615 M 5616 xxx[1]=7 5617 N 5618 set -A xxx 5619 typeset -i xxx[1] 5620--- 5621name: regression-58 5622description: 5623 Check if trap exit is ok (exit not mistaken for signal name) 5624stdin: 5625 trap 'echo hi' exit 5626 trap exit 1 5627expected-stdout: 5628 hi 5629--- 5630name: regression-59 5631description: 5632 Check if ${#array[*]} is calculated correctly. 5633stdin: 5634 a[12]=hi 5635 a[8]=there 5636 echo ${#a[*]} 5637expected-stdout: 5638 2 5639--- 5640name: regression-60 5641description: 5642 Check if default exit status is previous command 5643stdin: 5644 (true; exit) 5645 echo A $? 5646 (false; exit) 5647 echo B $? 5648 ( (exit 103) ; exit) 5649 echo C $? 5650expected-stdout: 5651 A 0 5652 B 1 5653 C 103 5654--- 5655name: regression-61 5656description: 5657 Check if EXIT trap is executed for sub shells. 5658stdin: 5659 trap 'echo parent exit' EXIT 5660 echo start 5661 (echo A; echo A last) 5662 echo B 5663 (echo C; trap 'echo sub exit' EXIT; echo C last) 5664 echo parent last 5665expected-stdout: 5666 start 5667 A 5668 A last 5669 B 5670 C 5671 C last 5672 sub exit 5673 parent last 5674 parent exit 5675--- 5676name: regression-62 5677description: 5678 Check if test -nt/-ot succeeds if second(first) file is missing. 5679stdin: 5680 touch a 5681 test a -nt b && echo nt OK || echo nt BAD 5682 test b -ot a && echo ot OK || echo ot BAD 5683expected-stdout: 5684 nt OK 5685 ot OK 5686--- 5687name: regression-63 5688description: 5689 Check if typeset, export, and readonly work 5690stdin: 5691 { 5692 echo FNORD-0 5693 FNORD_A=1 5694 FNORD_B=2 5695 FNORD_C=3 5696 FNORD_D=4 5697 FNORD_E=5 5698 FNORD_F=6 5699 FNORD_G=7 5700 FNORD_H=8 5701 integer FNORD_E FNORD_F FNORD_G FNORD_H 5702 export FNORD_C FNORD_D FNORD_G FNORD_H 5703 readonly FNORD_B FNORD_D FNORD_F FNORD_H 5704 echo FNORD-1 5705 export 5706 echo FNORD-2 5707 export -p 5708 echo FNORD-3 5709 readonly 5710 echo FNORD-4 5711 readonly -p 5712 echo FNORD-5 5713 typeset 5714 echo FNORD-6 5715 typeset -p 5716 echo FNORD-7 5717 typeset - 5718 echo FNORD-8 5719 } | fgrep FNORD 5720 fnord=(42 23) 5721 typeset -p fnord 5722 echo FNORD-9 5723expected-stdout: 5724 FNORD-0 5725 FNORD-1 5726 FNORD_C 5727 FNORD_D 5728 FNORD_G 5729 FNORD_H 5730 FNORD-2 5731 export FNORD_C=3 5732 export FNORD_D=4 5733 export FNORD_G=7 5734 export FNORD_H=8 5735 FNORD-3 5736 FNORD_B 5737 FNORD_D 5738 FNORD_F 5739 FNORD_H 5740 FNORD-4 5741 readonly FNORD_B=2 5742 readonly FNORD_D=4 5743 readonly FNORD_F=6 5744 readonly FNORD_H=8 5745 FNORD-5 5746 typeset FNORD_A 5747 typeset -r FNORD_B 5748 typeset -x FNORD_C 5749 typeset -x -r FNORD_D 5750 typeset -i FNORD_E 5751 typeset -i -r FNORD_F 5752 typeset -i -x FNORD_G 5753 typeset -i -x -r FNORD_H 5754 FNORD-6 5755 typeset FNORD_A=1 5756 typeset -r FNORD_B=2 5757 typeset -x FNORD_C=3 5758 typeset -x -r FNORD_D=4 5759 typeset -i FNORD_E=5 5760 typeset -i -r FNORD_F=6 5761 typeset -i -x FNORD_G=7 5762 typeset -i -x -r FNORD_H=8 5763 FNORD-7 5764 FNORD_A=1 5765 FNORD_B=2 5766 FNORD_C=3 5767 FNORD_D=4 5768 FNORD_E=5 5769 FNORD_F=6 5770 FNORD_G=7 5771 FNORD_H=8 5772 FNORD-8 5773 set -A fnord 5774 typeset fnord[0]=42 5775 typeset fnord[1]=23 5776 FNORD-9 5777--- 5778name: regression-64 5779description: 5780 Check that we can redefine functions calling time builtin 5781stdin: 5782 t() { 5783 time >/dev/null 5784 } 5785 t 2>/dev/null 5786 t() { 5787 time 5788 } 5789--- 5790name: regression-65 5791description: 5792 check for a regression with sleep builtin and signal mask 5793category: !nojsig 5794time-limit: 3 5795stdin: 5796 sleep 1 5797 echo blub |& 5798 while read -p line; do :; done 5799 echo ok 5800expected-stdout: 5801 ok 5802--- 5803name: regression-66 5804description: 5805 Check that quoting is sane 5806category: !nojsig 5807stdin: 5808 ac_space=' ' 5809 ac_newline=' 5810 ' 5811 set | grep ^ac_ |& 5812 set -A lines 5813 while IFS= read -pr line; do 5814 if [[ $line = *space* ]]; then 5815 lines[0]=$line 5816 else 5817 lines[1]=$line 5818 fi 5819 done 5820 for line in "${lines[@]}"; do 5821 print -r -- "$line" 5822 done 5823expected-stdout: 5824 ac_space=' ' 5825 ac_newline=$'\n' 5826--- 5827name: readonly-0 5828description: 5829 Ensure readonly is honoured for assignments and unset 5830stdin: 5831 "$__progname" -c 'u=x; echo $? $u .' || echo aborted, $? 5832 echo = 5833 "$__progname" -c 'readonly u; u=x; echo $? $u .' || echo aborted, $? 5834 echo = 5835 "$__progname" -c 'u=x; readonly u; unset u; echo $? $u .' || echo aborted, $? 5836expected-stdout: 5837 0 x . 5838 = 5839 aborted, 2 5840 = 5841 1 x . 5842expected-stderr-pattern: 5843 /read-only/ 5844--- 5845name: readonly-1 5846description: 5847 http://austingroupbugs.net/view.php?id=367 for export 5848stdin: 5849 "$__progname" -c 'readonly foo; export foo=a; echo $?' || echo aborted, $? 5850expected-stdout: 5851 aborted, 2 5852expected-stderr-pattern: 5853 /read-only/ 5854--- 5855name: readonly-2a 5856description: 5857 Check that getopts works as intended, for readonly-2b to be valid 5858stdin: 5859 "$__progname" -c 'set -- -a b; getopts a c; echo $? $c .; getopts a c; echo $? $c .' || echo aborted, $? 5860expected-stdout: 5861 0 a . 5862 1 ? . 5863--- 5864name: readonly-2b 5865description: 5866 http://austingroupbugs.net/view.php?id=367 for getopts 5867stdin: 5868 "$__progname" -c 'readonly c; set -- -a b; getopts a c; echo $? $c .' || echo aborted, $? 5869expected-stdout: 5870 2 . 5871expected-stderr-pattern: 5872 /read-only/ 5873--- 5874name: readonly-3 5875description: 5876 http://austingroupbugs.net/view.php?id=367 for read 5877stdin: 5878 echo x | "$__progname" -c 'read s; echo $? $s .' || echo aborted, $? 5879 echo y | "$__progname" -c 'readonly s; read s; echo $? $s .' || echo aborted, $? 5880expected-stdout: 5881 0 x . 5882 2 . 5883expected-stderr-pattern: 5884 /read-only/ 5885--- 5886name: readonly-4 5887description: 5888 Do not permit bypassing readonly for first array item 5889stdin: 5890 set -A arr -- foo bar 5891 readonly arr 5892 arr=baz 5893 print -r -- "${arr[@]}" 5894expected-exit: e != 0 5895expected-stderr-pattern: 5896 /read[ -]?only/ 5897--- 5898name: syntax-1 5899description: 5900 Check that lone ampersand is a syntax error 5901stdin: 5902 & 5903expected-exit: e != 0 5904expected-stderr-pattern: 5905 /syntax error/ 5906--- 5907name: xxx-quoted-newline-1 5908description: 5909 Check that \<newline> works inside of ${} 5910stdin: 5911 abc=2 5912 echo ${ab\ 5913 c} 5914expected-stdout: 5915 2 5916--- 5917name: xxx-quoted-newline-2 5918description: 5919 Check that \<newline> works at the start of a here document 5920stdin: 5921 cat << EO\ 5922 F 5923 hi 5924 EOF 5925expected-stdout: 5926 hi 5927--- 5928name: xxx-quoted-newline-3 5929description: 5930 Check that \<newline> works at the end of a here document 5931stdin: 5932 cat << EOF 5933 hi 5934 EO\ 5935 F 5936expected-stdout: 5937 hi 5938--- 5939name: xxx-multi-assignment-cmd 5940description: 5941 Check that assignments in a command affect subsequent assignments 5942 in the same command 5943stdin: 5944 FOO=abc 5945 FOO=123 BAR=$FOO 5946 echo $BAR 5947expected-stdout: 5948 123 5949--- 5950name: xxx-multi-assignment-posix-cmd 5951description: 5952 Check that the behaviour for multiple assignments with a 5953 command name matches POSIX. See: 5954 http://thread.gmane.org/gmane.comp.standards.posix.austin.general/1925 5955stdin: 5956 X=a Y=b; X=$Y Y=$X "$__progname" -c 'echo 1 $X $Y .'; echo 2 $X $Y . 5957 unset X Y Z 5958 X=a Y=${X=b} Z=$X "$__progname" -c 'echo 3 $Z .' 5959 unset X Y Z 5960 X=a Y=${X=b} Z=$X; echo 4 $Z . 5961expected-stdout: 5962 1 b a . 5963 2 a b . 5964 3 b . 5965 4 a . 5966--- 5967name: xxx-multi-assignment-posix-nocmd 5968description: 5969 Check that the behaviour for multiple assignments with no 5970 command name matches POSIX (Debian #334182). See: 5971 http://thread.gmane.org/gmane.comp.standards.posix.austin.general/1925 5972stdin: 5973 X=a Y=b; X=$Y Y=$X; echo 1 $X $Y . 5974expected-stdout: 5975 1 b b . 5976--- 5977name: xxx-multi-assignment-posix-subassign 5978description: 5979 Check that the behaviour for multiple assignments matches POSIX: 5980 - The assignment words shall be expanded in the current execution 5981 environment. 5982 - The assignments happen in the temporary execution environment. 5983stdin: 5984 unset X Y Z 5985 Z=a Y=${X:=b} sh -c 'echo +$X+ +$Y+ +$Z+' 5986 echo /$X/ 5987 # Now for the special case: 5988 unset X Y Z 5989 X= Y=${X:=b} sh -c 'echo +$X+ +$Y+' 5990 echo /$X/ 5991expected-stdout: 5992 ++ +b+ +a+ 5993 /b/ 5994 ++ +b+ 5995 /b/ 5996--- 5997name: xxx-exec-environment-1 5998description: 5999 Check to see if exec sets it's environment correctly 6000stdin: 6001 print '#!'"$__progname"'\nunset RANDOM\nexport | while IFS= read -r' \ 6002 'RANDOM; do eval '\''print -r -- "$RANDOM=$'\''"$RANDOM"'\'\"\'\; \ 6003 done >env; chmod +x env; PATH=.:$PATH 6004 FOO=bar exec env 6005expected-stdout-pattern: 6006 /(^|.*\n)FOO=bar\n/ 6007--- 6008name: xxx-exec-environment-2 6009description: 6010 Check to make sure exec doesn't change environment if a program 6011 isn't exec-ed 6012stdin: 6013 print '#!'"$__progname"'\nunset RANDOM\nexport | while IFS= read -r' \ 6014 'RANDOM; do eval '\''print -r -- "$RANDOM=$'\''"$RANDOM"'\'\"\'\; \ 6015 done >env; chmod +x env; PATH=.:$PATH 6016 env >bar1 6017 FOO=bar exec; env >bar2 6018 cmp -s bar1 bar2 6019--- 6020name: exec-function-environment-1 6021description: 6022 Check assignments in function calls and whether they affect 6023 the current execution environment (ksh93, SUSv4) 6024stdin: 6025 f() { a=2; }; g() { b=3; echo y$c-; }; a=1 f; b=2; c=1 g 6026 echo x$a-$b- z$c- 6027expected-stdout: 6028 y1- 6029 x2-3- z1- 6030--- 6031name: xxx-what-do-you-call-this-1 6032stdin: 6033 echo "${foo:-"a"}*" 6034expected-stdout: 6035 a* 6036--- 6037name: xxx-prefix-strip-1 6038stdin: 6039 foo='a cdef' 6040 echo ${foo#a c} 6041expected-stdout: 6042 def 6043--- 6044name: xxx-prefix-strip-2 6045stdin: 6046 set a c 6047 x='a cdef' 6048 echo ${x#$*} 6049expected-stdout: 6050 def 6051--- 6052name: xxx-variable-syntax-1 6053stdin: 6054 echo ${:} 6055expected-stderr-pattern: 6056 /bad substitution/ 6057expected-exit: 1 6058--- 6059name: xxx-variable-syntax-2 6060stdin: 6061 set 0 6062 echo ${*:0} 6063expected-stderr-pattern: 6064 /bad substitution/ 6065expected-exit: 1 6066--- 6067name: xxx-variable-syntax-3 6068stdin: 6069 set -A foo 0 6070 echo ${foo[*]:0} 6071expected-stderr-pattern: 6072 /bad substitution/ 6073expected-exit: 1 6074--- 6075name: xxx-substitution-eval-order 6076description: 6077 Check order of evaluation of expressions 6078stdin: 6079 i=1 x= y= 6080 set -A A abc def GHI j G k 6081 echo ${A[x=(i+=1)]#${A[y=(i+=2)]}} 6082 echo $x $y 6083expected-stdout: 6084 HI 6085 2 4 6086--- 6087name: xxx-set-option-1 6088description: 6089 Check option parsing in set 6090stdin: 6091 set -vsA foo -- A 1 3 2 6092 echo ${foo[*]} 6093expected-stderr: 6094 echo ${foo[*]} 6095expected-stdout: 6096 1 2 3 A 6097--- 6098name: xxx-exec-1 6099description: 6100 Check that exec exits for built-ins 6101need-ctty: yes 6102arguments: !-i! 6103stdin: 6104 exec echo hi 6105 echo still herre 6106expected-stdout: 6107 hi 6108expected-stderr-pattern: /.*/ 6109--- 6110name: xxx-while-1 6111description: 6112 Check the return value of while loops 6113 XXX need to do same for for/select/until loops 6114stdin: 6115 i=x 6116 while [ $i != xxx ] ; do 6117 i=x$i 6118 if [ $i = xxx ] ; then 6119 false 6120 continue 6121 fi 6122 done 6123 echo loop1=$? 6124 6125 i=x 6126 while [ $i != xxx ] ; do 6127 i=x$i 6128 if [ $i = xxx ] ; then 6129 false 6130 break 6131 fi 6132 done 6133 echo loop2=$? 6134 6135 i=x 6136 while [ $i != xxx ] ; do 6137 i=x$i 6138 false 6139 done 6140 echo loop3=$? 6141expected-stdout: 6142 loop1=0 6143 loop2=0 6144 loop3=1 6145--- 6146name: xxx-status-1 6147description: 6148 Check that blank lines don't clear $? 6149need-ctty: yes 6150arguments: !-i! 6151stdin: 6152 (exit 1) 6153 echo $? 6154 (exit 1) 6155 6156 echo $? 6157 true 6158expected-stdout: 6159 1 6160 1 6161expected-stderr-pattern: /.*/ 6162--- 6163name: xxx-status-2 6164description: 6165 Check that $? is preserved in subshells, includes, traps. 6166stdin: 6167 (exit 1) 6168 6169 echo blank: $? 6170 6171 (exit 2) 6172 (echo subshell: $?) 6173 6174 echo 'echo include: $?' > foo 6175 (exit 3) 6176 . ./foo 6177 6178 trap 'echo trap: $?' ERR 6179 (exit 4) 6180 echo exit: $? 6181expected-stdout: 6182 blank: 1 6183 subshell: 2 6184 include: 3 6185 trap: 4 6186 exit: 4 6187--- 6188name: xxx-clean-chars-1 6189description: 6190 Check MAGIC character is stuffed correctly 6191stdin: 6192 echo `echo [�` 6193expected-stdout: 6194 [� 6195--- 6196name: xxx-param-subst-qmark-1 6197description: 6198 Check suppresion of error message with null string. According to 6199 POSIX, it shouldn't print the error as 'word' isn't ommitted. 6200 ksh88/93, Solaris /bin/sh and /usr/xpg4/bin/sh all print the error, 6201 that's why the condition is reversed. 6202stdin: 6203 unset foo 6204 x= 6205 echo x${foo?$x} 6206expected-exit: 1 6207# POSIX 6208#expected-fail: yes 6209#expected-stderr-pattern: !/not set/ 6210# common use 6211expected-stderr-pattern: /parameter null or not set/ 6212--- 6213name: xxx-param-_-1 6214# fails due to weirdness of execv stuff 6215category: !os:uwin-nt 6216description: 6217 Check c flag is set. 6218arguments: !-c!echo "[$-]"! 6219expected-stdout-pattern: /^\[.*c.*\]$/ 6220--- 6221name: tilde-expand-1 6222description: 6223 Check tilde expansion after equal signs 6224env-setup: !HOME=/sweet! 6225stdin: 6226 echo ${A=a=}~ b=~ c=d~ ~ 6227 set +o braceexpand 6228 unset A 6229 echo ${A=a=}~ b=~ c=d~ ~ 6230expected-stdout: 6231 a=/sweet b=/sweet c=d~ /sweet 6232 a=~ b=~ c=d~ /sweet 6233--- 6234name: tilde-expand-2 6235description: 6236 Check tilde expansion works 6237env-setup: !HOME=/sweet! 6238stdin: 6239 wd=$PWD 6240 cd / 6241 plus=$(print -r -- ~+) 6242 minus=$(print -r -- ~-) 6243 nix=$(print -r -- ~) 6244 [[ $plus = / ]]; echo one $? . 6245 [[ $minus = "$wd" ]]; echo two $? . 6246 [[ $nix = /sweet ]]; echo nix $? . 6247expected-stdout: 6248 one 0 . 6249 two 0 . 6250 nix 0 . 6251--- 6252name: exit-err-1 6253description: 6254 Check some "exit on error" conditions 6255stdin: 6256 print '#!'"$__progname"'\nexec "$1"' >env 6257 print '#!'"$__progname"'\nexit 1' >false 6258 chmod +x env false 6259 PATH=.:$PATH 6260 set -ex 6261 env false && echo something 6262 echo END 6263expected-stdout: 6264 END 6265expected-stderr: 6266 + env false 6267 + echo END 6268--- 6269name: exit-err-2 6270description: 6271 Check some "exit on error" edge conditions (POSIXly) 6272stdin: 6273 print '#!'"$__progname"'\nexec "$1"' >env 6274 print '#!'"$__progname"'\nexit 1' >false 6275 print '#!'"$__progname"'\nexit 0' >true 6276 chmod +x env false 6277 PATH=.:$PATH 6278 set -ex 6279 if env true; then 6280 env false && echo something 6281 fi 6282 echo END 6283expected-stdout: 6284 END 6285expected-stderr: 6286 + env true 6287 + env false 6288 + echo END 6289--- 6290name: exit-err-3 6291description: 6292 pdksh regression which AT&T ksh does right 6293 TFM says: [set] -e | errexit 6294 Exit (after executing the ERR trap) ... 6295stdin: 6296 trap 'echo EXIT' EXIT 6297 trap 'echo ERR' ERR 6298 set -e 6299 cd /XXXXX 2>/dev/null 6300 echo DONE 6301 exit 0 6302expected-stdout: 6303 ERR 6304 EXIT 6305expected-exit: e != 0 6306--- 6307name: exit-err-4 6308description: 6309 "set -e" test suite (POSIX) 6310stdin: 6311 set -e 6312 echo pre 6313 if true ; then 6314 false && echo foo 6315 fi 6316 echo bar 6317expected-stdout: 6318 pre 6319 bar 6320--- 6321name: exit-err-5 6322description: 6323 "set -e" test suite (POSIX) 6324stdin: 6325 set -e 6326 foo() { 6327 while [ "$1" ]; do 6328 for E in $x; do 6329 [ "$1" = "$E" ] && { shift ; continue 2 ; } 6330 done 6331 x="$x $1" 6332 shift 6333 done 6334 echo $x 6335 } 6336 echo pre 6337 foo a b b c 6338 echo post 6339expected-stdout: 6340 pre 6341 a b c 6342 post 6343--- 6344name: exit-err-6 6345description: 6346 "set -e" test suite (BSD make) 6347category: os:mirbsd 6348stdin: 6349 mkdir zd zd/a zd/b 6350 print 'all:\n\t@echo eins\n\t@exit 42\n' >zd/a/Makefile 6351 print 'all:\n\t@echo zwei\n' >zd/b/Makefile 6352 wd=$(pwd) 6353 set -e 6354 for entry in a b; do ( set -e; if [[ -d $wd/zd/$entry.i386 ]]; then _newdir_="$entry.i386"; else _newdir_="$entry"; fi; if [[ -z $_THISDIR_ ]]; then _nextdir_="$_newdir_"; else _nextdir_="$_THISDIR_/$_newdir_"; fi; _makefile_spec_=; [[ ! -f $wd/zd/$_newdir_/Makefile.bsd-wrapper ]] || _makefile_spec_="-f Makefile.bsd-wrapper"; subskipdir=; for skipdir in ; do subentry=${skipdir#$entry}; if [[ $subentry != $skipdir ]]; then if [[ -z $subentry ]]; then echo "($_nextdir_ skipped)"; break; fi; subskipdir="$subskipdir ${subentry#/}"; fi; done; if [[ -z $skipdir || -n $subentry ]]; then echo "===> $_nextdir_"; cd $wd/zd/$_newdir_; make SKIPDIR="$subskipdir" $_makefile_spec_ _THISDIR_="$_nextdir_" all; fi; ) done 2>&1 | sed "s!$wd!WD!g" 6355expected-stdout: 6356 ===> a 6357 eins 6358 *** Error code 42 6359 6360 Stop in WD/zd/a (line 2 of Makefile). 6361--- 6362name: exit-err-7 6363description: 6364 "set -e" regression (LP#1104543) 6365stdin: 6366 set -e 6367 bla() { 6368 [ -x $PWD/nonexistant ] && $PWD/nonexistant 6369 } 6370 echo x 6371 bla 6372 echo y$? 6373expected-stdout: 6374 x 6375expected-exit: 1 6376--- 6377name: exit-err-8 6378description: 6379 "set -e" regression (Debian #700526) 6380stdin: 6381 set -e 6382 _db_cmd() { return $1; } 6383 db_input() { _db_cmd 30; } 6384 db_go() { _db_cmd 0; } 6385 db_input || : 6386 db_go 6387 exit 0 6388--- 6389name: exit-enoent-1 6390description: 6391 SUSv4 says that the shell should exit with 126/127 in some situations 6392stdin: 6393 i=0 6394 (echo; echo :) >x 6395 "$__progname" ./x >/dev/null 2>&1; r=$?; echo $((i++)) $r . 6396 "$__progname" -c ./x >/dev/null 2>&1; r=$?; echo $((i++)) $r . 6397 echo exit 42 >x 6398 "$__progname" ./x >/dev/null 2>&1; r=$?; echo $((i++)) $r . 6399 "$__progname" -c ./x >/dev/null 2>&1; r=$?; echo $((i++)) $r . 6400 rm -f x 6401 "$__progname" ./x >/dev/null 2>&1; r=$?; echo $((i++)) $r . 6402 "$__progname" -c ./x >/dev/null 2>&1; r=$?; echo $((i++)) $r . 6403expected-stdout: 6404 0 0 . 6405 1 126 . 6406 2 42 . 6407 3 126 . 6408 4 127 . 6409 5 127 . 6410--- 6411name: exit-eval-1 6412description: 6413 Check eval vs substitution exit codes (ksh93 alike) 6414stdin: 6415 (exit 12) 6416 eval $(false) 6417 echo A $? 6418 (exit 12) 6419 eval ' $(false)' 6420 echo B $? 6421 (exit 12) 6422 eval " $(false)" 6423 echo C $? 6424 (exit 12) 6425 eval "eval $(false)" 6426 echo D $? 6427 (exit 12) 6428 eval 'eval '"$(false)" 6429 echo E $? 6430 IFS="$IFS:" 6431 (exit 12) 6432 eval $(echo :; false) 6433 echo F $? 6434 echo -n "G " 6435 (exit 12) 6436 eval 'echo $?' 6437 echo H $? 6438expected-stdout: 6439 A 0 6440 B 1 6441 C 0 6442 D 0 6443 E 0 6444 F 0 6445 G 12 6446 H 0 6447--- 6448name: exit-trap-1 6449description: 6450 Check that "exit" with no arguments behaves SUSv4 conformant. 6451stdin: 6452 trap 'echo hi; exit' EXIT 6453 exit 9 6454expected-stdout: 6455 hi 6456expected-exit: 9 6457--- 6458name: exit-trap-2 6459description: 6460 Check that ERR and EXIT traps are run just like ksh93 does. 6461 GNU bash does not run ERtrap in ±e eval-undef but runs it 6462 twice (bug?) in +e eval-false, so does ksh93 (bug?), which 6463 also has a bug to continue execution (echoing "and out" and 6464 returning 0) in +e eval-undef. 6465file-setup: file 644 "x" 6466 v=; unset v 6467 trap 'echo EXtrap' EXIT 6468 trap 'echo ERtrap' ERR 6469 set $1 6470 echo "and run $2" 6471 eval $2 6472 echo and out 6473file-setup: file 644 "xt" 6474 v=; unset v 6475 trap 'echo EXtrap' EXIT 6476 trap 'echo ERtrap' ERR 6477 set $1 6478 echo 'and run true' 6479 true 6480 echo and out 6481file-setup: file 644 "xf" 6482 v=; unset v 6483 trap 'echo EXtrap' EXIT 6484 trap 'echo ERtrap' ERR 6485 set $1 6486 echo 'and run false' 6487 false 6488 echo and out 6489file-setup: file 644 "xu" 6490 v=; unset v 6491 trap 'echo EXtrap' EXIT 6492 trap 'echo ERtrap' ERR 6493 set $1 6494 echo 'and run ${v?}' 6495 ${v?} 6496 echo and out 6497stdin: 6498 runtest() { 6499 rm -f rc 6500 ( 6501 "$__progname" "$@" 6502 echo $? >rc 6503 ) 2>&1 | sed \ 6504 -e 's/parameter not set/parameter null or not set/' \ 6505 -e 's/[[]6]//' -e 's/: eval: line 1//' -e 's/: line 6//' \ 6506 -e "s^${__progname%.exe}\.*e*x*e*: <stdin>\[[0-9]*]PROG" 6507 } 6508 xe=-e 6509 echo : $xe 6510 runtest x $xe true 6511 echo = eval-true $(<rc) . 6512 runtest x $xe false 6513 echo = eval-false $(<rc) . 6514 runtest x $xe '${v?}' 6515 echo = eval-undef $(<rc) . 6516 runtest xt $xe 6517 echo = noeval-true $(<rc) . 6518 runtest xf $xe 6519 echo = noeval-false $(<rc) . 6520 runtest xu $xe 6521 echo = noeval-undef $(<rc) . 6522 xe=+e 6523 echo : $xe 6524 runtest x $xe true 6525 echo = eval-true $(<rc) . 6526 runtest x $xe false 6527 echo = eval-false $(<rc) . 6528 runtest x $xe '${v?}' 6529 echo = eval-undef $(<rc) . 6530 runtest xt $xe 6531 echo = noeval-true $(<rc) . 6532 runtest xf $xe 6533 echo = noeval-false $(<rc) . 6534 runtest xu $xe 6535 echo = noeval-undef $(<rc) . 6536expected-stdout: 6537 : -e 6538 and run true 6539 and out 6540 EXtrap 6541 = eval-true 0 . 6542 and run false 6543 ERtrap 6544 EXtrap 6545 = eval-false 1 . 6546 and run ${v?} 6547 x: v: parameter null or not set 6548 ERtrap 6549 EXtrap 6550 = eval-undef 1 . 6551 and run true 6552 and out 6553 EXtrap 6554 = noeval-true 0 . 6555 and run false 6556 ERtrap 6557 EXtrap 6558 = noeval-false 1 . 6559 and run ${v?} 6560 xu: v: parameter null or not set 6561 EXtrap 6562 = noeval-undef 1 . 6563 : +e 6564 and run true 6565 and out 6566 EXtrap 6567 = eval-true 0 . 6568 and run false 6569 ERtrap 6570 and out 6571 EXtrap 6572 = eval-false 0 . 6573 and run ${v?} 6574 x: v: parameter null or not set 6575 ERtrap 6576 EXtrap 6577 = eval-undef 1 . 6578 and run true 6579 and out 6580 EXtrap 6581 = noeval-true 0 . 6582 and run false 6583 ERtrap 6584 and out 6585 EXtrap 6586 = noeval-false 0 . 6587 and run ${v?} 6588 xu: v: parameter null or not set 6589 EXtrap 6590 = noeval-undef 1 . 6591--- 6592name: exit-trap-interactive 6593description: 6594 Check that interactive shell doesn't exit via EXIT trap on syntax error 6595arguments: !-i! 6596stdin: 6597 trap -- EXIT 6598 echo Syntax error < 6599 echo 'After error 1' 6600 trap 'echo Exit trap' EXIT 6601 echo Syntax error < 6602 echo 'After error 2' 6603 trap 'echo Exit trap' EXIT 6604 exit 6605 echo 'After exit' 6606expected-stdout: 6607 After error 1 6608 After error 2 6609 Exit trap 6610expected-stderr-pattern: 6611 /syntax error: 'newline' unexpected/ 6612--- 6613name: test-stlt-1 6614description: 6615 Check that test also can handle string1 < string2 etc. 6616stdin: 6617 test 2005/10/08 '<' 2005/08/21 && echo ja || echo nein 6618 test 2005/08/21 \< 2005/10/08 && echo ja || echo nein 6619 test 2005/10/08 '>' 2005/08/21 && echo ja || echo nein 6620 test 2005/08/21 \> 2005/10/08 && echo ja || echo nein 6621expected-stdout: 6622 nein 6623 ja 6624 ja 6625 nein 6626expected-stderr-pattern: !/unexpected op/ 6627--- 6628name: test-precedence-1 6629description: 6630 Check a weird precedence case (and POSIX echo) 6631stdin: 6632 test \( -f = -f \) 6633 rv=$? 6634 echo $rv 6635expected-stdout: 6636 0 6637--- 6638name: test-option-1 6639description: 6640 Test the test -o operator 6641stdin: 6642 runtest() { 6643 test -o $1; echo $? 6644 [ -o $1 ]; echo $? 6645 [[ -o $1 ]]; echo $? 6646 } 6647 if_test() { 6648 test -o $1 -o -o !$1; echo $? 6649 [ -o $1 -o -o !$1 ]; echo $? 6650 [[ -o $1 || -o !$1 ]]; echo $? 6651 test -o ?$1; echo $? 6652 } 6653 echo 0y $(if_test utf8-mode) = 6654 echo 0n $(if_test utf8-hack) = 6655 echo 1= $(runtest utf8-hack) = 6656 echo 2= $(runtest !utf8-hack) = 6657 echo 3= $(runtest ?utf8-hack) = 6658 set +U 6659 echo 1+ $(runtest utf8-mode) = 6660 echo 2+ $(runtest !utf8-mode) = 6661 echo 3+ $(runtest ?utf8-mode) = 6662 set -U 6663 echo 1- $(runtest utf8-mode) = 6664 echo 2- $(runtest !utf8-mode) = 6665 echo 3- $(runtest ?utf8-mode) = 6666 echo = short flags = 6667 echo 0y $(if_test -U) = 6668 echo 0y $(if_test +U) = 6669 echo 0n $(if_test -_) = 6670 echo 0n $(if_test -U-) = 6671 echo 1= $(runtest -_) = 6672 echo 2= $(runtest !-_) = 6673 echo 3= $(runtest ?-_) = 6674 set +U 6675 echo 1+ $(runtest -U) = 6676 echo 2+ $(runtest !-U) = 6677 echo 3+ $(runtest ?-U) = 6678 echo 1+ $(runtest +U) = 6679 echo 2+ $(runtest !+U) = 6680 echo 3+ $(runtest ?+U) = 6681 set -U 6682 echo 1- $(runtest -U) = 6683 echo 2- $(runtest !-U) = 6684 echo 3- $(runtest ?-U) = 6685 echo 1- $(runtest +U) = 6686 echo 2- $(runtest !+U) = 6687 echo 3- $(runtest ?+U) = 6688expected-stdout: 6689 0y 0 0 0 0 = 6690 0n 1 1 1 1 = 6691 1= 1 1 1 = 6692 2= 1 1 1 = 6693 3= 1 1 1 = 6694 1+ 1 1 1 = 6695 2+ 0 0 0 = 6696 3+ 0 0 0 = 6697 1- 0 0 0 = 6698 2- 1 1 1 = 6699 3- 0 0 0 = 6700 = short flags = 6701 0y 0 0 0 0 = 6702 0y 0 0 0 0 = 6703 0n 1 1 1 1 = 6704 0n 1 1 1 1 = 6705 1= 1 1 1 = 6706 2= 1 1 1 = 6707 3= 1 1 1 = 6708 1+ 1 1 1 = 6709 2+ 0 0 0 = 6710 3+ 0 0 0 = 6711 1+ 1 1 1 = 6712 2+ 0 0 0 = 6713 3+ 0 0 0 = 6714 1- 0 0 0 = 6715 2- 1 1 1 = 6716 3- 0 0 0 = 6717 1- 0 0 0 = 6718 2- 1 1 1 = 6719 3- 0 0 0 = 6720--- 6721name: mkshrc-1 6722description: 6723 Check that ~/.mkshrc works correctly. 6724 Part 1: verify user environment is not read (internal) 6725stdin: 6726 echo x $FNORD 6727expected-stdout: 6728 x 6729--- 6730name: mkshrc-2a 6731description: 6732 Check that ~/.mkshrc works correctly. 6733 Part 2: verify mkshrc is not read (non-interactive shells) 6734file-setup: file 644 ".mkshrc" 6735 FNORD=42 6736env-setup: !HOME=.!ENV=! 6737stdin: 6738 echo x $FNORD 6739expected-stdout: 6740 x 6741--- 6742name: mkshrc-2b 6743description: 6744 Check that ~/.mkshrc works correctly. 6745 Part 2: verify mkshrc can be read (interactive shells) 6746file-setup: file 644 ".mkshrc" 6747 FNORD=42 6748need-ctty: yes 6749arguments: !-i! 6750env-setup: !HOME=.!ENV=!PS1=! 6751stdin: 6752 echo x $FNORD 6753expected-stdout: 6754 x 42 6755expected-stderr-pattern: 6756 /(# )*/ 6757--- 6758name: mkshrc-3 6759description: 6760 Check that ~/.mkshrc works correctly. 6761 Part 3: verify mkshrc can be turned off 6762file-setup: file 644 ".mkshrc" 6763 FNORD=42 6764env-setup: !HOME=.!ENV=nonexistant! 6765stdin: 6766 echo x $FNORD 6767expected-stdout: 6768 x 6769--- 6770name: sh-mode-1 6771description: 6772 Check that sh mode turns braceexpand off 6773 and that that works correctly 6774stdin: 6775 set -o braceexpand 6776 set +o sh 6777 [[ $(set +o) == *@(-o sh)@(| *) ]] && echo sh || echo nosh 6778 [[ $(set +o) == *@(-o braceexpand)@(| *) ]] && echo brex || echo nobrex 6779 echo {a,b,c} 6780 set +o braceexpand 6781 echo {a,b,c} 6782 set -o braceexpand 6783 echo {a,b,c} 6784 set -o sh 6785 echo {a,b,c} 6786 [[ $(set +o) == *@(-o sh)@(| *) ]] && echo sh || echo nosh 6787 [[ $(set +o) == *@(-o braceexpand)@(| *) ]] && echo brex || echo nobrex 6788 set -o braceexpand 6789 echo {a,b,c} 6790 [[ $(set +o) == *@(-o sh)@(| *) ]] && echo sh || echo nosh 6791 [[ $(set +o) == *@(-o braceexpand)@(| *) ]] && echo brex || echo nobrex 6792expected-stdout: 6793 nosh 6794 brex 6795 a b c 6796 {a,b,c} 6797 a b c 6798 {a,b,c} 6799 sh 6800 nobrex 6801 a b c 6802 sh 6803 brex 6804--- 6805name: sh-mode-2a 6806description: 6807 Check that posix or sh mode is *not* automatically turned on 6808category: !binsh 6809stdin: 6810 ln -s "$__progname" ksh || cp "$__progname" ksh 6811 ln -s "$__progname" sh || cp "$__progname" sh 6812 ln -s "$__progname" ./-ksh || cp "$__progname" ./-ksh 6813 ln -s "$__progname" ./-sh || cp "$__progname" ./-sh 6814 for shell in {,-}{,k}sh; do 6815 print -- $shell $(./$shell +l -c \ 6816 '[[ $(set +o) == *"-o "@(sh|posix)@(| *) ]] && echo sh || echo nosh') 6817 done 6818expected-stdout: 6819 sh nosh 6820 ksh nosh 6821 -sh nosh 6822 -ksh nosh 6823--- 6824name: sh-mode-2b 6825description: 6826 Check that posix or sh mode *is* automatically turned on 6827category: binsh 6828stdin: 6829 ln -s "$__progname" ksh || cp "$__progname" ksh 6830 ln -s "$__progname" sh || cp "$__progname" sh 6831 ln -s "$__progname" ./-ksh || cp "$__progname" ./-ksh 6832 ln -s "$__progname" ./-sh || cp "$__progname" ./-sh 6833 for shell in {,-}{,k}sh; do 6834 print -- $shell $(./$shell +l -c \ 6835 '[[ $(set +o) == *"-o "@(sh|posix)@(| *) ]] && echo sh || echo nosh') 6836 done 6837expected-stdout: 6838 sh sh 6839 ksh nosh 6840 -sh sh 6841 -ksh nosh 6842--- 6843name: pipeline-1 6844description: 6845 pdksh bug: last command of a pipeline is executed in a 6846 subshell - make sure it still is, scripts depend on it 6847file-setup: file 644 "abcx" 6848file-setup: file 644 "abcy" 6849stdin: 6850 echo * 6851 echo a | while read d; do 6852 echo $d 6853 echo $d* 6854 echo * 6855 set -o noglob 6856 echo $d* 6857 echo * 6858 done 6859 echo * 6860expected-stdout: 6861 abcx abcy 6862 a 6863 abcx abcy 6864 abcx abcy 6865 a* 6866 * 6867 abcx abcy 6868--- 6869name: pipeline-2 6870description: 6871 check that co-processes work with TCOMs, TPIPEs and TPARENs 6872category: !nojsig 6873stdin: 6874 "$__progname" -c 'i=100; echo hi |& while read -p line; do echo "$((i++)) $line"; done' 6875 "$__progname" -c 'i=200; echo hi | cat |& while read -p line; do echo "$((i++)) $line"; done' 6876 "$__progname" -c 'i=300; (echo hi | cat) |& while read -p line; do echo "$((i++)) $line"; done' 6877expected-stdout: 6878 100 hi 6879 200 hi 6880 300 hi 6881--- 6882name: pipeline-3 6883description: 6884 Check that PIPESTATUS does what it's supposed to 6885stdin: 6886 echo 1 $PIPESTATUS . 6887 echo 2 ${PIPESTATUS[0]} . 6888 echo 3 ${PIPESTATUS[1]} . 6889 (echo x; exit 12) | (cat; exit 23) | (cat; exit 42) 6890 echo 5 $? , $PIPESTATUS , ${PIPESTATUS[0]} , ${PIPESTATUS[1]} , ${PIPESTATUS[2]} , ${PIPESTATUS[3]} . 6891 echo 6 ${PIPESTATUS[0]} . 6892 set | fgrep PIPESTATUS 6893 echo 8 $(set | fgrep PIPESTATUS) . 6894expected-stdout: 6895 1 0 . 6896 2 0 . 6897 3 . 6898 x 6899 5 42 , 12 , 12 , 23 , 42 , . 6900 6 0 . 6901 PIPESTATUS[0]=0 6902 8 PIPESTATUS[0]=0 PIPESTATUS[1]=0 . 6903--- 6904name: pipeline-4 6905description: 6906 Check that "set -o pipefail" does what it's supposed to 6907stdin: 6908 echo 1 "$("$__progname" -c '(exit 12) | (exit 23) | (exit 42); echo $?')" . 6909 echo 2 "$("$__progname" -c '! (exit 12) | (exit 23) | (exit 42); echo $?')" . 6910 echo 3 "$("$__progname" -o pipefail -c '(exit 12) | (exit 23) | (exit 42); echo $?')" . 6911 echo 4 "$("$__progname" -o pipefail -c '! (exit 12) | (exit 23) | (exit 42); echo $?')" . 6912 echo 5 "$("$__progname" -c '(exit 23) | (exit 42) | :; echo $?')" . 6913 echo 6 "$("$__progname" -c '! (exit 23) | (exit 42) | :; echo $?')" . 6914 echo 7 "$("$__progname" -o pipefail -c '(exit 23) | (exit 42) | :; echo $?')" . 6915 echo 8 "$("$__progname" -o pipefail -c '! (exit 23) | (exit 42) | :; echo $?')" . 6916 echo 9 "$("$__progname" -o pipefail -c 'x=$( (exit 23) | (exit 42) | :); echo $?')" . 6917expected-stdout: 6918 1 42 . 6919 2 0 . 6920 3 42 . 6921 4 0 . 6922 5 0 . 6923 6 1 . 6924 7 42 . 6925 8 0 . 6926 9 42 . 6927--- 6928name: persist-history-1 6929description: 6930 Check if persistent history saving works 6931category: !no-histfile 6932need-ctty: yes 6933arguments: !-i! 6934env-setup: !ENV=./Env!HISTFILE=hist.file! 6935file-setup: file 644 "Env" 6936 PS1=X 6937stdin: 6938 cat hist.file 6939expected-stdout-pattern: 6940 /cat hist.file/ 6941expected-stderr-pattern: 6942 /^X*$/ 6943--- 6944name: typeset-1 6945description: 6946 Check that global does what typeset is supposed to do 6947stdin: 6948 set -A arrfoo 65 6949 foo() { 6950 global -Uui16 arrfoo[*] 6951 } 6952 echo before ${arrfoo[0]} . 6953 foo 6954 echo after ${arrfoo[0]} . 6955 set -A arrbar 65 6956 bar() { 6957 echo inside before ${arrbar[0]} . 6958 arrbar[0]=97 6959 echo inside changed ${arrbar[0]} . 6960 global -Uui16 arrbar[*] 6961 echo inside typeset ${arrbar[0]} . 6962 arrbar[0]=48 6963 echo inside changed ${arrbar[0]} . 6964 } 6965 echo before ${arrbar[0]} . 6966 bar 6967 echo after ${arrbar[0]} . 6968expected-stdout: 6969 before 65 . 6970 after 16#41 . 6971 before 65 . 6972 inside before 65 . 6973 inside changed 97 . 6974 inside typeset 16#61 . 6975 inside changed 16#30 . 6976 after 16#30 . 6977--- 6978name: typeset-padding-1 6979description: 6980 Check if left/right justification works as per TFM 6981stdin: 6982 typeset -L10 ln=0hall0 6983 typeset -R10 rn=0hall0 6984 typeset -ZL10 lz=0hall0 6985 typeset -ZR10 rz=0hall0 6986 typeset -Z10 rx=" hallo " 6987 echo "<$ln> <$rn> <$lz> <$rz> <$rx>" 6988expected-stdout: 6989 <0hall0 > < 0hall0> <hall0 > <00000hall0> <0000 hallo> 6990--- 6991name: typeset-padding-2 6992description: 6993 Check if base-!10 integers are padded right 6994stdin: 6995 typeset -Uui16 -L9 ln=16#1 6996 typeset -Uui16 -R9 rn=16#1 6997 typeset -Uui16 -Z9 zn=16#1 6998 typeset -L9 ls=16#1 6999 typeset -R9 rs=16#1 7000 typeset -Z9 zs=16#1 7001 echo "<$ln> <$rn> <$zn> <$ls> <$rs> <$zs>" 7002expected-stdout: 7003 <16#1 > < 16#1> <16#000001> <16#1 > < 16#1> <0000016#1> 7004--- 7005name: utf8bom-1 7006description: 7007 Check that the UTF-8 Byte Order Mark is ignored as the first 7008 multibyte character of the shell input (with -c, from standard 7009 input, as file, or as eval argument), but nowhere else 7010# breaks on Mac OSX (HFS+ non-standard Unicode canonical decomposition) 7011category: !os:darwin 7012stdin: 7013 mkdir foo 7014 print '#!/bin/sh\necho ohne' >foo/fnord 7015 print '#!/bin/sh\necho mit' >foo/fnord 7016 print 'fnord\nfnord\nfnord\nfnord' >foo/bar 7017 print eval \''fnord\nfnord\nfnord\nfnord'\' >foo/zoo 7018 set -A anzahl -- foo/* 7019 echo got ${#anzahl[*]} files 7020 chmod +x foo/* 7021 export PATH=$(pwd)/foo:$PATH 7022 "$__progname" -c 'fnord' 7023 echo = 7024 "$__progname" -c 'fnord; fnord; fnord; fnord' 7025 echo = 7026 "$__progname" foo/bar 7027 echo = 7028 "$__progname" <foo/bar 7029 echo = 7030 "$__progname" foo/zoo 7031 echo = 7032 "$__progname" -c 'echo : $(fnord)' 7033 rm -rf foo 7034expected-stdout: 7035 got 4 files 7036 ohne 7037 = 7038 ohne 7039 ohne 7040 mit 7041 ohne 7042 = 7043 ohne 7044 ohne 7045 mit 7046 ohne 7047 = 7048 ohne 7049 ohne 7050 mit 7051 ohne 7052 = 7053 ohne 7054 ohne 7055 mit 7056 ohne 7057 = 7058 : ohne 7059--- 7060name: utf8bom-2 7061description: 7062 Check that we can execute BOM-shebangs (failures not fatal) 7063 XXX if the OS can already execute them, we lose 7064 note: cygwin execve(2) doesn't return to us with ENOEXEC, we lose 7065 note: Ultrix perl5 t4 returns 65280 (exit-code 255) and no text 7066need-pass: no 7067category: !os:cygwin,!os:msys,!os:ultrix,!os:uwin-nt,!smksh 7068env-setup: !FOO=BAR! 7069stdin: 7070 print '#!'"$__progname"'\nprint "1 a=$ENV{FOO}";' >t1 7071 print '#!'"$__progname"'\nprint "2 a=$ENV{FOO}";' >t2 7072 print '#!'"$__perlname"'\nprint "3 a=$ENV{FOO}\n";' >t3 7073 print '#!'"$__perlname"'\nprint "4 a=$ENV{FOO}\n";' >t4 7074 chmod +x t? 7075 ./t1 7076 ./t2 7077 ./t3 7078 ./t4 7079expected-stdout: 7080 1 a=/nonexistant{FOO} 7081 2 a=/nonexistant{FOO} 7082 3 a=BAR 7083 4 a=BAR 7084expected-stderr-pattern: 7085 /(Unrecognized character .... ignored at \..t4 line 1)*/ 7086--- 7087name: utf8opt-1a 7088description: 7089 Check that the utf8-mode flag is not set at non-interactive startup 7090category: !os:hpux 7091env-setup: !PS1=!PS2=!LC_CTYPE=en_US.UTF-8! 7092stdin: 7093 if [[ $- = *U* ]]; then 7094 echo is set 7095 else 7096 echo is not set 7097 fi 7098expected-stdout: 7099 is not set 7100--- 7101name: utf8opt-1b 7102description: 7103 Check that the utf8-mode flag is not set at non-interactive startup 7104category: os:hpux 7105env-setup: !PS1=!PS2=!LC_CTYPE=en_US.utf8! 7106stdin: 7107 if [[ $- = *U* ]]; then 7108 echo is set 7109 else 7110 echo is not set 7111 fi 7112expected-stdout: 7113 is not set 7114--- 7115name: utf8opt-2a 7116description: 7117 Check that the utf8-mode flag is set at interactive startup. 7118 -DMKSH_ASSUME_UTF8=0 => expected failure, please ignore 7119 -DMKSH_ASSUME_UTF8=1 => not expected, please investigate 7120 -UMKSH_ASSUME_UTF8 => not expected, but if your OS is old, 7121 try passing HAVE_SETLOCALE_CTYPE=0 to Build.sh 7122need-pass: no 7123category: !os:hpux,!os:msys 7124need-ctty: yes 7125arguments: !-i! 7126env-setup: !PS1=!PS2=!LC_CTYPE=en_US.UTF-8! 7127stdin: 7128 if [[ $- = *U* ]]; then 7129 echo is set 7130 else 7131 echo is not set 7132 fi 7133expected-stdout: 7134 is set 7135expected-stderr-pattern: 7136 /(# )*/ 7137--- 7138name: utf8opt-2b 7139description: 7140 Check that the utf8-mode flag is set at interactive startup 7141 Expected failure if -DMKSH_ASSUME_UTF8=0 7142category: os:hpux 7143need-ctty: yes 7144arguments: !-i! 7145env-setup: !PS1=!PS2=!LC_CTYPE=en_US.utf8! 7146stdin: 7147 if [[ $- = *U* ]]; then 7148 echo is set 7149 else 7150 echo is not set 7151 fi 7152expected-stdout: 7153 is set 7154expected-stderr-pattern: 7155 /(# )*/ 7156--- 7157name: utf8opt-3a 7158description: 7159 Ensure ±U on the command line is honoured 7160 (these two tests may pass falsely depending on CPPFLAGS) 7161stdin: 7162 export i=0 7163 code='if [[ $- = *U* ]]; then echo $i on; else echo $i off; fi' 7164 let i++; "$__progname" -U -c "$code" 7165 let i++; "$__progname" +U -c "$code" 7166 echo $((++i)) done 7167expected-stdout: 7168 1 on 7169 2 off 7170 3 done 7171--- 7172name: utf8opt-3b 7173description: 7174 Ensure ±U on the command line is honoured, interactive shells 7175need-ctty: yes 7176stdin: 7177 export i=0 7178 code='if [[ $- = *U* ]]; then echo $i on; else echo $i off; fi' 7179 let i++; "$__progname" -U -ic "$code" 7180 let i++; "$__progname" +U -ic "$code" 7181 echo $((++i)) done 7182expected-stdout: 7183 1 on 7184 2 off 7185 3 done 7186--- 7187name: aliases-1 7188description: 7189 Check if built-in shell aliases are okay 7190category: !android,!arge 7191stdin: 7192 alias 7193 typeset -f 7194expected-stdout: 7195 autoload='typeset -fu' 7196 functions='typeset -f' 7197 hash='alias -t' 7198 history='fc -l' 7199 integer='typeset -i' 7200 local=typeset 7201 login='exec login' 7202 nameref='typeset -n' 7203 nohup='nohup ' 7204 r='fc -e -' 7205 source='PATH=$PATH:. command .' 7206 stop='kill -STOP' 7207 type='whence -v' 7208--- 7209name: aliases-1-hartz4 7210description: 7211 Check if built-in shell aliases are okay 7212category: android,arge 7213stdin: 7214 alias 7215 typeset -f 7216expected-stdout: 7217 autoload='typeset -fu' 7218 functions='typeset -f' 7219 hash='alias -t' 7220 history='fc -l' 7221 integer='typeset -i' 7222 local=typeset 7223 login='exec login' 7224 nameref='typeset -n' 7225 nohup='nohup ' 7226 r='fc -e -' 7227 source='PATH=$PATH:. command .' 7228 type='whence -v' 7229--- 7230name: aliases-2a 7231description: 7232 Check if “set -o sh” disables built-in aliases (except a few) 7233category: disabled 7234arguments: !-o!sh! 7235stdin: 7236 alias 7237 typeset -f 7238expected-stdout: 7239 integer='typeset -i' 7240 local=typeset 7241--- 7242name: aliases-3a 7243description: 7244 Check if running as sh disables built-in aliases (except a few) 7245category: disabled 7246stdin: 7247 cp "$__progname" sh 7248 ./sh -c 'alias; typeset -f' 7249 rm -f sh 7250expected-stdout: 7251 integer='typeset -i' 7252 local=typeset 7253--- 7254name: aliases-2b 7255description: 7256 Check if “set -o sh” does not influence built-in aliases 7257category: !android,!arge 7258arguments: !-o!sh! 7259stdin: 7260 alias 7261 typeset -f 7262expected-stdout: 7263 autoload='typeset -fu' 7264 functions='typeset -f' 7265 hash='alias -t' 7266 history='fc -l' 7267 integer='typeset -i' 7268 local=typeset 7269 login='exec login' 7270 nameref='typeset -n' 7271 nohup='nohup ' 7272 r='fc -e -' 7273 source='PATH=$PATH:. command .' 7274 stop='kill -STOP' 7275 type='whence -v' 7276--- 7277name: aliases-3b 7278description: 7279 Check if running as sh does not influence built-in aliases 7280category: !android,!arge 7281stdin: 7282 cp "$__progname" sh 7283 ./sh -c 'alias; typeset -f' 7284 rm -f sh 7285expected-stdout: 7286 autoload='typeset -fu' 7287 functions='typeset -f' 7288 hash='alias -t' 7289 history='fc -l' 7290 integer='typeset -i' 7291 local=typeset 7292 login='exec login' 7293 nameref='typeset -n' 7294 nohup='nohup ' 7295 r='fc -e -' 7296 source='PATH=$PATH:. command .' 7297 stop='kill -STOP' 7298 type='whence -v' 7299--- 7300name: aliases-2b-hartz4 7301description: 7302 Check if “set -o sh” does not influence built-in aliases 7303category: android,arge 7304arguments: !-o!sh! 7305stdin: 7306 alias 7307 typeset -f 7308expected-stdout: 7309 autoload='typeset -fu' 7310 functions='typeset -f' 7311 hash='alias -t' 7312 history='fc -l' 7313 integer='typeset -i' 7314 local=typeset 7315 login='exec login' 7316 nameref='typeset -n' 7317 nohup='nohup ' 7318 r='fc -e -' 7319 source='PATH=$PATH:. command .' 7320 type='whence -v' 7321--- 7322name: aliases-3b-hartz4 7323description: 7324 Check if running as sh does not influence built-in aliases 7325category: android,arge 7326stdin: 7327 cp "$__progname" sh 7328 ./sh -c 'alias; typeset -f' 7329 rm -f sh 7330expected-stdout: 7331 autoload='typeset -fu' 7332 functions='typeset -f' 7333 hash='alias -t' 7334 history='fc -l' 7335 integer='typeset -i' 7336 local=typeset 7337 login='exec login' 7338 nameref='typeset -n' 7339 nohup='nohup ' 7340 r='fc -e -' 7341 source='PATH=$PATH:. command .' 7342 type='whence -v' 7343--- 7344name: aliases-cmdline 7345description: 7346 Check that aliases work from the command line (Debian #517009) 7347 Note that due to the nature of the lexing process, defining 7348 aliases in COMSUBs then immediately using them, and things 7349 like 'alias foo=bar && foo', still fail. 7350stdin: 7351 "$__progname" -c $'alias a="echo OK"\na' 7352expected-stdout: 7353 OK 7354--- 7355name: aliases-funcdef-1 7356description: 7357 Check if POSIX functions take precedences over aliases 7358stdin: 7359 alias foo='echo makro' 7360 foo() { 7361 echo funktion 7362 } 7363 foo 7364expected-stdout: 7365 funktion 7366--- 7367name: aliases-funcdef-2 7368description: 7369 Check if POSIX functions take precedences over aliases 7370stdin: 7371 alias foo='echo makro' 7372 foo () { 7373 echo funktion 7374 } 7375 foo 7376expected-stdout: 7377 funktion 7378--- 7379name: aliases-funcdef-3 7380description: 7381 Check if aliases take precedences over Korn functions 7382stdin: 7383 alias foo='echo makro' 7384 function foo { 7385 echo funktion 7386 } 7387 foo 7388expected-stdout: 7389 makro 7390--- 7391name: aliases-funcdef-4 7392description: 7393 Functions should only take over if actually being defined 7394stdin: 7395 alias local 7396 :|| local() { :; } 7397 alias local 7398expected-stdout: 7399 local=typeset 7400 local=typeset 7401--- 7402name: arrays-1 7403description: 7404 Check if Korn Shell arrays work as expected 7405stdin: 7406 v="c d" 7407 set -A foo -- a \$v "$v" '$v' b 7408 echo "${#foo[*]}|${foo[0]}|${foo[1]}|${foo[2]}|${foo[3]}|${foo[4]}|" 7409expected-stdout: 7410 5|a|$v|c d|$v|b| 7411--- 7412name: arrays-2a 7413description: 7414 Check if bash-style arrays work as expected 7415stdin: 7416 v="c d" 7417 foo=(a \$v "$v" '$v' b) 7418 echo "${#foo[*]}|${foo[0]}|${foo[1]}|${foo[2]}|${foo[3]}|${foo[4]}|" 7419expected-stdout: 7420 5|a|$v|c d|$v|b| 7421--- 7422name: arrays-2b 7423description: 7424 Check if bash-style arrays work as expected, with newlines 7425stdin: 7426 print '#!'"$__progname"'\nfor x in "$@"; do print -nr -- "$x|"; done' >pfp 7427 chmod +x pfp 7428 test -n "$ZSH_VERSION" && setopt KSH_ARRAYS 7429 v="e f" 7430 foo=(a 7431 bc 7432 d \$v "$v" '$v' g 7433 ) 7434 ./pfp "${#foo[*]}" "${foo[0]}" "${foo[1]}" "${foo[2]}" "${foo[3]}" "${foo[4]}" "${foo[5]}" "${foo[6]}"; echo 7435 foo=(a\ 7436 bc 7437 d \$v "$v" '$v' g 7438 ) 7439 ./pfp "${#foo[*]}" "${foo[0]}" "${foo[1]}" "${foo[2]}" "${foo[3]}" "${foo[4]}" "${foo[5]}" "${foo[6]}"; echo 7440 foo=(a\ 7441 bc\\ 7442 d \$v "$v" '$v' 7443 g) 7444 ./pfp "${#foo[*]}" "${foo[0]}" "${foo[1]}" "${foo[2]}" "${foo[3]}" "${foo[4]}" "${foo[5]}" "${foo[6]}"; echo 7445expected-stdout: 7446 7|a|bc|d|$v|e f|$v|g| 7447 7|a|bc|d|$v|e f|$v|g| 7448 6|abc\|d|$v|e f|$v|g|| 7449--- 7450name: arrays-3 7451description: 7452 Check if array bounds are uint32_t 7453stdin: 7454 set -A foo a b c 7455 foo[4097]=d 7456 foo[2147483637]=e 7457 echo ${foo[*]} 7458 foo[-1]=f 7459 echo ${foo[4294967295]} g ${foo[*]} 7460expected-stdout: 7461 a b c d e 7462 f g a b c d e f 7463--- 7464name: arrays-4 7465description: 7466 Check if Korn Shell arrays with specified indices work as expected 7467stdin: 7468 v="c d" 7469 set -A foo -- [1]=\$v [2]="$v" [4]='$v' [0]=a [5]=b 7470 echo "${#foo[*]}|${foo[0]}|${foo[1]}|${foo[2]}|${foo[3]}|${foo[4]}|${foo[5]}|" 7471 # we don't want this at all: 7472 # 5|a|$v|c d||$v|b| 7473 set -A arr "[5]=meh" 7474 echo "<${arr[0]}><${arr[5]}>" 7475expected-stdout: 7476 5|[1]=$v|[2]=c d|[4]=$v|[0]=a|[5]=b|| 7477 <[5]=meh><> 7478--- 7479name: arrays-5 7480description: 7481 Check if bash-style arrays with specified indices work as expected 7482 (taken out temporarily to fix arrays-4; see also arrays-9a comment) 7483category: disabled 7484stdin: 7485 v="c d" 7486 foo=([1]=\$v [2]="$v" [4]='$v' [0]=a [5]=b) 7487 echo "${#foo[*]}|${foo[0]}|${foo[1]}|${foo[2]}|${foo[3]}|${foo[4]}|${foo[5]}|" 7488 x=([128]=foo bar baz) 7489 echo k= ${!x[*]} . 7490 echo v= ${x[*]} . 7491 # Check that we do not break this by globbing 7492 :>b=blah 7493 bleh=5 7494 typeset -a arr 7495 arr+=([bleh]=blah) 7496 echo "<${arr[0]}><${arr[5]}>" 7497expected-stdout: 7498 5|a|$v|c d||$v|b| 7499 k= 128 129 130 . 7500 v= foo bar baz . 7501 <><blah> 7502--- 7503name: arrays-6 7504description: 7505 Check if we can get the array keys (indices) for indexed arrays, 7506 Korn shell style 7507stdin: 7508 of() { 7509 i=0 7510 for x in "$@"; do 7511 echo -n "$((i++))<$x>" 7512 done 7513 echo 7514 } 7515 foo[1]=eins 7516 set | grep '^foo' 7517 echo = 7518 foo[0]=zwei 7519 foo[4]=drei 7520 set | grep '^foo' 7521 echo = 7522 echo a $(of ${foo[*]}) = $(of ${bar[*]}) a 7523 echo b $(of "${foo[*]}") = $(of "${bar[*]}") b 7524 echo c $(of ${foo[@]}) = $(of ${bar[@]}) c 7525 echo d $(of "${foo[@]}") = $(of "${bar[@]}") d 7526 echo e $(of ${!foo[*]}) = $(of ${!bar[*]}) e 7527 echo f $(of "${!foo[*]}") = $(of "${!bar[*]}") f 7528 echo g $(of ${!foo[@]}) = $(of ${!bar[@]}) g 7529 echo h $(of "${!foo[@]}") = $(of "${!bar[@]}") h 7530expected-stdout: 7531 foo[1]=eins 7532 = 7533 foo[0]=zwei 7534 foo[1]=eins 7535 foo[4]=drei 7536 = 7537 a 0<zwei>1<eins>2<drei> = a 7538 b 0<zwei eins drei> = 0<> b 7539 c 0<zwei>1<eins>2<drei> = c 7540 d 0<zwei>1<eins>2<drei> = d 7541 e 0<0>1<1>2<4> = e 7542 f 0<0 1 4> = 0<> f 7543 g 0<0>1<1>2<4> = g 7544 h 0<0>1<1>2<4> = h 7545--- 7546name: arrays-7 7547description: 7548 Check if we can get the array keys (indices) for indexed arrays, 7549 Korn shell style, in some corner cases 7550stdin: 7551 echo !arz: ${!arz} 7552 echo !arz[0]: ${!arz[0]} 7553 echo !arz[1]: ${!arz[1]} 7554 arz=foo 7555 echo !arz: ${!arz} 7556 echo !arz[0]: ${!arz[0]} 7557 echo !arz[1]: ${!arz[1]} 7558 unset arz 7559 echo !arz: ${!arz} 7560 echo !arz[0]: ${!arz[0]} 7561 echo !arz[1]: ${!arz[1]} 7562expected-stdout: 7563 !arz: arz 7564 !arz[0]: arz[0] 7565 !arz[1]: arz[1] 7566 !arz: arz 7567 !arz[0]: arz[0] 7568 !arz[1]: arz[1] 7569 !arz: arz 7570 !arz[0]: arz[0] 7571 !arz[1]: arz[1] 7572--- 7573name: arrays-8 7574description: 7575 Check some behavioural rules for arrays. 7576stdin: 7577 fna() { 7578 set -A aa 9 7579 } 7580 fnb() { 7581 typeset ab 7582 set -A ab 9 7583 } 7584 fnc() { 7585 typeset ac 7586 set -A ac 91 7587 unset ac 7588 set -A ac 92 7589 } 7590 fnd() { 7591 set +A ad 9 7592 } 7593 fne() { 7594 unset ae 7595 set +A ae 9 7596 } 7597 fnf() { 7598 unset af[0] 7599 set +A af 9 7600 } 7601 fng() { 7602 unset ag[*] 7603 set +A ag 9 7604 } 7605 set -A aa 1 2 7606 set -A ab 1 2 7607 set -A ac 1 2 7608 set -A ad 1 2 7609 set -A ae 1 2 7610 set -A af 1 2 7611 set -A ag 1 2 7612 set -A ah 1 2 7613 typeset -Z3 aa ab ac ad ae af ag 7614 print 1a ${aa[*]} . 7615 print 1b ${ab[*]} . 7616 print 1c ${ac[*]} . 7617 print 1d ${ad[*]} . 7618 print 1e ${ae[*]} . 7619 print 1f ${af[*]} . 7620 print 1g ${ag[*]} . 7621 print 1h ${ah[*]} . 7622 fna 7623 fnb 7624 fnc 7625 fnd 7626 fne 7627 fnf 7628 fng 7629 typeset -Z5 ah[*] 7630 print 2a ${aa[*]} . 7631 print 2b ${ab[*]} . 7632 print 2c ${ac[*]} . 7633 print 2d ${ad[*]} . 7634 print 2e ${ae[*]} . 7635 print 2f ${af[*]} . 7636 print 2g ${ag[*]} . 7637 print 2h ${ah[*]} . 7638expected-stdout: 7639 1a 001 002 . 7640 1b 001 002 . 7641 1c 001 002 . 7642 1d 001 002 . 7643 1e 001 002 . 7644 1f 001 002 . 7645 1g 001 002 . 7646 1h 1 2 . 7647 2a 9 . 7648 2b 001 002 . 7649 2c 92 . 7650 2d 009 002 . 7651 2e 9 . 7652 2f 9 002 . 7653 2g 009 . 7654 2h 00001 00002 . 7655--- 7656name: arrays-9a 7657description: 7658 Check that we can concatenate arrays 7659stdin: 7660 unset foo; foo=(bar); foo+=(baz); echo 1 ${!foo[*]} : ${foo[*]} . 7661 unset foo; foo=(foo bar); foo+=(baz); echo 2 ${!foo[*]} : ${foo[*]} . 7662# unset foo; foo=([2]=foo [0]=bar); foo+=(baz [5]=quux); echo 3 ${!foo[*]} : ${foo[*]} . 7663expected-stdout: 7664 1 0 1 : bar baz . 7665 2 0 1 2 : foo bar baz . 7666# 3 0 2 3 5 : bar foo baz quux . 7667--- 7668name: arrays-9b 7669description: 7670 Check that we can concatenate parameters too 7671stdin: 7672 unset foo; foo=bar; foo+=baz; echo 1 $foo . 7673 unset foo; typeset -i16 foo=10; foo+=20; echo 2 $foo . 7674expected-stdout: 7675 1 barbaz . 7676 2 16#a20 . 7677--- 7678name: arrassign-basic 7679description: 7680 Check basic whitespace conserving properties of wdarrassign 7681stdin: 7682 a=($(echo a b)) 7683 b=($(echo "a b")) 7684 c=("$(echo "a b")") 7685 d=("$(echo a b)") 7686 a+=($(echo c d)) 7687 b+=($(echo "c d")) 7688 c+=("$(echo "c d")") 7689 d+=("$(echo c d)") 7690 echo ".a:${a[0]}.${a[1]}.${a[2]}.${a[3]}:" 7691 echo ".b:${b[0]}.${b[1]}.${b[2]}.${b[3]}:" 7692 echo ".c:${c[0]}.${c[1]}.${c[2]}.${c[3]}:" 7693 echo ".d:${d[0]}.${d[1]}.${d[2]}.${d[3]}:" 7694expected-stdout: 7695 .a:a.b.c.d: 7696 .b:a.b.c.d: 7697 .c:a b.c d..: 7698 .d:a b.c d..: 7699--- 7700name: arrassign-fnc-none 7701description: 7702 Check locality of array access inside a function 7703stdin: 7704 function fn { 7705 x+=(f) 7706 echo ".fn:${x[0]}.${x[1]}.${x[2]}.${x[3]}:" 7707 } 7708 function rfn { 7709 if [[ -n $BASH_VERSION ]]; then 7710 y=() 7711 else 7712 set -A y 7713 fi 7714 y+=(f) 7715 echo ".rfn:${y[0]}.${y[1]}.${y[2]}.${y[3]}:" 7716 } 7717 x=(m m) 7718 y=(m m) 7719 echo ".f0:${x[0]}.${x[1]}.${x[2]}.${x[3]}:" 7720 fn 7721 echo ".f1:${x[0]}.${x[1]}.${x[2]}.${x[3]}:" 7722 fn 7723 echo ".f2:${x[0]}.${x[1]}.${x[2]}.${x[3]}:" 7724 echo ".rf0:${y[0]}.${y[1]}.${y[2]}.${y[3]}:" 7725 rfn 7726 echo ".rf1:${y[0]}.${y[1]}.${y[2]}.${y[3]}:" 7727 rfn 7728 echo ".rf2:${y[0]}.${y[1]}.${y[2]}.${y[3]}:" 7729expected-stdout: 7730 .f0:m.m..: 7731 .fn:m.m.f.: 7732 .f1:m.m.f.: 7733 .fn:m.m.f.f: 7734 .f2:m.m.f.f: 7735 .rf0:m.m..: 7736 .rfn:f...: 7737 .rf1:f...: 7738 .rfn:f...: 7739 .rf2:f...: 7740--- 7741name: arrassign-fnc-local 7742description: 7743 Check locality of array access inside a function 7744 with the bash/mksh/ksh93 local/typeset keyword 7745 (note: ksh93 has no local; typeset works only in FKSH) 7746stdin: 7747 function fn { 7748 typeset x 7749 x+=(f) 7750 echo ".fn:${x[0]}.${x[1]}.${x[2]}.${x[3]}:" 7751 } 7752 function rfn { 7753 if [[ -n $BASH_VERSION ]]; then 7754 y=() 7755 else 7756 set -A y 7757 fi 7758 typeset y 7759 y+=(f) 7760 echo ".rfn:${y[0]}.${y[1]}.${y[2]}.${y[3]}:" 7761 } 7762 function fnr { 7763 typeset z 7764 if [[ -n $BASH_VERSION ]]; then 7765 z=() 7766 else 7767 set -A z 7768 fi 7769 z+=(f) 7770 echo ".fnr:${z[0]}.${z[1]}.${z[2]}.${z[3]}:" 7771 } 7772 x=(m m) 7773 y=(m m) 7774 z=(m m) 7775 echo ".f0:${x[0]}.${x[1]}.${x[2]}.${x[3]}:" 7776 fn 7777 echo ".f1:${x[0]}.${x[1]}.${x[2]}.${x[3]}:" 7778 fn 7779 echo ".f2:${x[0]}.${x[1]}.${x[2]}.${x[3]}:" 7780 echo ".rf0:${y[0]}.${y[1]}.${y[2]}.${y[3]}:" 7781 rfn 7782 echo ".rf1:${y[0]}.${y[1]}.${y[2]}.${y[3]}:" 7783 rfn 7784 echo ".rf2:${y[0]}.${y[1]}.${y[2]}.${y[3]}:" 7785 echo ".f0r:${z[0]}.${z[1]}.${z[2]}.${z[3]}:" 7786 fnr 7787 echo ".f1r:${z[0]}.${z[1]}.${z[2]}.${z[3]}:" 7788 fnr 7789 echo ".f2r:${z[0]}.${z[1]}.${z[2]}.${z[3]}:" 7790expected-stdout: 7791 .f0:m.m..: 7792 .fn:f...: 7793 .f1:m.m..: 7794 .fn:f...: 7795 .f2:m.m..: 7796 .rf0:m.m..: 7797 .rfn:f...: 7798 .rf1:...: 7799 .rfn:f...: 7800 .rf2:...: 7801 .f0r:m.m..: 7802 .fnr:f...: 7803 .f1r:m.m..: 7804 .fnr:f...: 7805 .f2r:m.m..: 7806--- 7807name: arrassign-fnc-global 7808description: 7809 Check locality of array access inside a function 7810 with the mksh-specific global keyword 7811stdin: 7812 function fn { 7813 global x 7814 x+=(f) 7815 echo ".fn:${x[0]}.${x[1]}.${x[2]}.${x[3]}:" 7816 } 7817 function rfn { 7818 set -A y 7819 global y 7820 y+=(f) 7821 echo ".rfn:${y[0]}.${y[1]}.${y[2]}.${y[3]}:" 7822 } 7823 function fnr { 7824 global z 7825 set -A z 7826 z+=(f) 7827 echo ".fnr:${z[0]}.${z[1]}.${z[2]}.${z[3]}:" 7828 } 7829 x=(m m) 7830 y=(m m) 7831 z=(m m) 7832 echo ".f0:${x[0]}.${x[1]}.${x[2]}.${x[3]}:" 7833 fn 7834 echo ".f1:${x[0]}.${x[1]}.${x[2]}.${x[3]}:" 7835 fn 7836 echo ".f2:${x[0]}.${x[1]}.${x[2]}.${x[3]}:" 7837 echo ".rf0:${y[0]}.${y[1]}.${y[2]}.${y[3]}:" 7838 rfn 7839 echo ".rf1:${y[0]}.${y[1]}.${y[2]}.${y[3]}:" 7840 rfn 7841 echo ".rf2:${y[0]}.${y[1]}.${y[2]}.${y[3]}:" 7842 echo ".f0r:${z[0]}.${z[1]}.${z[2]}.${z[3]}:" 7843 fnr 7844 echo ".f1r:${z[0]}.${z[1]}.${z[2]}.${z[3]}:" 7845 fnr 7846 echo ".f2r:${z[0]}.${z[1]}.${z[2]}.${z[3]}:" 7847expected-stdout: 7848 .f0:m.m..: 7849 .fn:m.m.f.: 7850 .f1:m.m.f.: 7851 .fn:m.m.f.f: 7852 .f2:m.m.f.f: 7853 .rf0:m.m..: 7854 .rfn:f...: 7855 .rf1:f...: 7856 .rfn:f...: 7857 .rf2:f...: 7858 .f0r:m.m..: 7859 .fnr:f...: 7860 .f1r:f...: 7861 .fnr:f...: 7862 .f2r:f...: 7863--- 7864name: strassign-fnc-none 7865description: 7866 Check locality of string access inside a function 7867stdin: 7868 function fn { 7869 x+=f 7870 echo ".fn:$x:" 7871 } 7872 function rfn { 7873 y= 7874 y+=f 7875 echo ".rfn:$y:" 7876 } 7877 x=m 7878 y=m 7879 echo ".f0:$x:" 7880 fn 7881 echo ".f1:$x:" 7882 fn 7883 echo ".f2:$x:" 7884 echo ".rf0:$y:" 7885 rfn 7886 echo ".rf1:$y:" 7887 rfn 7888 echo ".rf2:$y:" 7889expected-stdout: 7890 .f0:m: 7891 .fn:mf: 7892 .f1:mf: 7893 .fn:mff: 7894 .f2:mff: 7895 .rf0:m: 7896 .rfn:f: 7897 .rf1:f: 7898 .rfn:f: 7899 .rf2:f: 7900--- 7901name: strassign-fnc-local 7902description: 7903 Check locality of string access inside a function 7904 with the bash/mksh/ksh93 local/typeset keyword 7905 (note: ksh93 has no local; typeset works only in FKSH) 7906stdin: 7907 function fn { 7908 typeset x 7909 x+=f 7910 echo ".fn:$x:" 7911 } 7912 function rfn { 7913 y= 7914 typeset y 7915 y+=f 7916 echo ".rfn:$y:" 7917 } 7918 function fnr { 7919 typeset z 7920 z= 7921 z+=f 7922 echo ".fnr:$z:" 7923 } 7924 x=m 7925 y=m 7926 z=m 7927 echo ".f0:$x:" 7928 fn 7929 echo ".f1:$x:" 7930 fn 7931 echo ".f2:$x:" 7932 echo ".rf0:$y:" 7933 rfn 7934 echo ".rf1:$y:" 7935 rfn 7936 echo ".rf2:$y:" 7937 echo ".f0r:$z:" 7938 fnr 7939 echo ".f1r:$z:" 7940 fnr 7941 echo ".f2r:$z:" 7942expected-stdout: 7943 .f0:m: 7944 .fn:f: 7945 .f1:m: 7946 .fn:f: 7947 .f2:m: 7948 .rf0:m: 7949 .rfn:f: 7950 .rf1:: 7951 .rfn:f: 7952 .rf2:: 7953 .f0r:m: 7954 .fnr:f: 7955 .f1r:m: 7956 .fnr:f: 7957 .f2r:m: 7958--- 7959name: strassign-fnc-global 7960description: 7961 Check locality of string access inside a function 7962 with the mksh-specific global keyword 7963stdin: 7964 function fn { 7965 global x 7966 x+=f 7967 echo ".fn:$x:" 7968 } 7969 function rfn { 7970 y= 7971 global y 7972 y+=f 7973 echo ".rfn:$y:" 7974 } 7975 function fnr { 7976 global z 7977 z= 7978 z+=f 7979 echo ".fnr:$z:" 7980 } 7981 x=m 7982 y=m 7983 z=m 7984 echo ".f0:$x:" 7985 fn 7986 echo ".f1:$x:" 7987 fn 7988 echo ".f2:$x:" 7989 echo ".rf0:$y:" 7990 rfn 7991 echo ".rf1:$y:" 7992 rfn 7993 echo ".rf2:$y:" 7994 echo ".f0r:$z:" 7995 fnr 7996 echo ".f1r:$z:" 7997 fnr 7998 echo ".f2r:$z:" 7999expected-stdout: 8000 .f0:m: 8001 .fn:mf: 8002 .f1:mf: 8003 .fn:mff: 8004 .f2:mff: 8005 .rf0:m: 8006 .rfn:f: 8007 .rf1:f: 8008 .rfn:f: 8009 .rf2:f: 8010 .f0r:m: 8011 .fnr:f: 8012 .f1r:f: 8013 .fnr:f: 8014 .f2r:f: 8015--- 8016name: varexpand-substr-1 8017description: 8018 Check if bash-style substring expansion works 8019 when using positive numerics 8020stdin: 8021 x=abcdefghi 8022 typeset -i y=123456789 8023 typeset -i 16 z=123456789 # 16#75bcd15 8024 echo a t${x:2:2} ${y:2:3} ${z:2:3} a 8025 echo b ${x::3} ${y::3} ${z::3} b 8026 echo c ${x:2:} ${y:2:} ${z:2:} c 8027 echo d ${x:2} ${y:2} ${z:2} d 8028 echo e ${x:2:6} ${y:2:6} ${z:2:7} e 8029 echo f ${x:2:7} ${y:2:7} ${z:2:8} f 8030 echo g ${x:2:8} ${y:2:8} ${z:2:9} g 8031expected-stdout: 8032 a tcd 345 #75 a 8033 b abc 123 16# b 8034 c c 8035 d cdefghi 3456789 #75bcd15 d 8036 e cdefgh 345678 #75bcd1 e 8037 f cdefghi 3456789 #75bcd15 f 8038 g cdefghi 3456789 #75bcd15 g 8039--- 8040name: varexpand-substr-2 8041description: 8042 Check if bash-style substring expansion works 8043 when using negative numerics or expressions 8044stdin: 8045 x=abcdefghi 8046 typeset -i y=123456789 8047 typeset -i 16 z=123456789 # 16#75bcd15 8048 n=2 8049 echo a ${x:$n:3} ${y:$n:3} ${z:$n:3} a 8050 echo b ${x:(n):3} ${y:(n):3} ${z:(n):3} b 8051 echo c ${x:(-2):1} ${y:(-2):1} ${z:(-2):1} c 8052 echo d t${x: n:2} ${y: n:3} ${z: n:3} d 8053expected-stdout: 8054 a cde 345 #75 a 8055 b cde 345 #75 b 8056 c h 8 1 c 8057 d tcd 345 #75 d 8058--- 8059name: varexpand-substr-3 8060description: 8061 Check that some things that work in bash fail. 8062 This is by design. And that some things fail in both. 8063stdin: 8064 export x=abcdefghi n=2 8065 "$__progname" -c 'echo v${x:(n)}x' 8066 "$__progname" -c 'echo w${x: n}x' 8067 "$__progname" -c 'echo x${x:n}x' 8068 "$__progname" -c 'echo y${x:}x' 8069 "$__progname" -c 'echo z${x}x' 8070 "$__progname" -c 'x=abcdef;y=123;echo ${x:${y:2:1}:2}' >/dev/null 2>&1; echo $? 8071expected-stdout: 8072 vcdefghix 8073 wcdefghix 8074 zabcdefghix 8075 1 8076expected-stderr-pattern: 8077 /x:n.*bad substitution.*\n.*bad substitution/ 8078--- 8079name: varexpand-substr-4 8080description: 8081 Check corner cases for substring expansion 8082stdin: 8083 x=abcdefghi 8084 integer y=2 8085 echo a ${x:(y == 1 ? 2 : 3):4} a 8086expected-stdout: 8087 a defg a 8088--- 8089name: varexpand-substr-5A 8090description: 8091 Check that substring expansions work on characters 8092stdin: 8093 set +U 8094 x=mäh 8095 echo a ${x::1} ${x: -1} a 8096 echo b ${x::3} ${x: -3} b 8097 echo c ${x:1:2} ${x: -3:2} c 8098 echo d ${#x} d 8099expected-stdout: 8100 a m h a 8101 b mä äh b 8102 c ä ä c 8103 d 4 d 8104--- 8105name: varexpand-substr-5W 8106description: 8107 Check that substring expansions work on characters 8108stdin: 8109 set -U 8110 x=mäh 8111 echo a ${x::1} ${x: -1} a 8112 echo b ${x::2} ${x: -2} b 8113 echo c ${x:1:1} ${x: -2:1} c 8114 echo d ${#x} d 8115expected-stdout: 8116 a m h a 8117 b mä äh b 8118 c ä ä c 8119 d 3 d 8120--- 8121name: varexpand-substr-6 8122description: 8123 Check that string substitution works correctly 8124stdin: 8125 foo=1 8126 bar=2 8127 baz=qwertyuiop 8128 echo a ${baz: foo: bar} 8129 echo b ${baz: foo: $bar} 8130 echo c ${baz: $foo: bar} 8131 echo d ${baz: $foo: $bar} 8132expected-stdout: 8133 a we 8134 b we 8135 c we 8136 d we 8137--- 8138name: varexpand-special-hash 8139description: 8140 Check special ${var@x} expansion for x=hash 8141stdin: 8142 typeset -i8 foo=10 8143 bar=baz 8144 unset baz 8145 print ${foo@#} ${bar@#} ${baz@#} . 8146expected-stdout: 8147 9B15FBFB CFBDD32B 00000000 . 8148--- 8149name: varexpand-special-quote 8150description: 8151 Check special ${var@Q} expansion for quoted strings 8152stdin: 8153 set +U 8154 i=x 8155 j=a\ b 8156 k=$'c 8157 d\xA0''e€f' 8158 print -r -- "<i=$i j=$j k=$k>" 8159 s="u=${i@Q} v=${j@Q} w=${k@Q}" 8160 print -r -- "s=\"$s\"" 8161 eval "$s" 8162 typeset -p u v w 8163expected-stdout: 8164 <i=x j=a b k=c 8165 d�e€f> 8166 s="u=x v='a b' w=$'c\nd\240e\u20ACf'" 8167 typeset u=x 8168 typeset v='a b' 8169 typeset w=$'c\nd\240e\u20ACf' 8170--- 8171name: varexpand-null-1 8172description: 8173 Ensure empty strings expand emptily 8174stdin: 8175 print x ${a} ${b} y 8176 print z ${a#?} ${b%?} w 8177 print v ${a=} ${b/c/d} u 8178expected-stdout: 8179 x y 8180 z w 8181 v u 8182--- 8183name: varexpand-null-2 8184description: 8185 Ensure empty strings, when quoted, are expanded as empty strings 8186stdin: 8187 print '#!'"$__progname"'\nfor x in "$@"; do print -nr -- "<$x> "; done' >pfs 8188 chmod +x pfs 8189 ./pfs 1 "${a}" 2 "${a#?}" + "${b%?}" 3 "${a=}" + "${b/c/d}" 8190 echo . 8191expected-stdout: 8192 <1> <> <2> <> <+> <> <3> <> <+> <> . 8193--- 8194name: varexpand-null-3 8195description: 8196 Ensure concatenating behaviour matches other shells 8197 although the line 2<> is probably wrong? XNULLSUB case. 8198stdin: 8199 x=; printf "1<%s>\n" "$x$@" 8200 set A; printf "2<%s>\n" "${@:+}" 8201expected-stdout: 8202 1<> 8203 2<> 8204--- 8205name: print-funny-chars 8206description: 8207 Check print builtin's capability to output designated characters 8208stdin: 8209 print '<\0144\0344\xDB\u00DB\u20AC\uDB\x40>' 8210expected-stdout: 8211 <d��Û€Û@> 8212--- 8213name: print-bksl-c 8214description: 8215 Check print builtin's \c escape 8216stdin: 8217 print '\ca'; print b 8218expected-stdout: 8219 ab 8220--- 8221name: print-cr 8222description: 8223 Check that CR+LF is not collapsed into LF as some MSYS shells wrongly do 8224stdin: 8225 echo '#!'"$__progname" >foo 8226 cat >>foo <<-'EOF' 8227 print -n -- '220-blau.mirbsd.org ESMTP ready at Thu, 25 Jul 2013 15:57:57 GMT\r\n220->> Bitte keine Werbung einwerfen! <<\r\r\n220 Who do you wanna pretend to be today' 8228 print \? 8229 EOF 8230 chmod +x foo 8231 echo "[$(./foo)]" 8232 ./foo | while IFS= read -r line; do 8233 print -r -- "{$line}" 8234 done 8235expected-stdout: 8236 [220-blau.mirbsd.org ESMTP ready at Thu, 25 Jul 2013 15:57:57 GMT 8237 220->> Bitte keine Werbung einwerfen! << 8238 8239 220 Who do you wanna pretend to be today? 8240] 8241 {220-blau.mirbsd.org ESMTP ready at Thu, 25 Jul 2013 15:57:57 GMT 8242} 8243 {220->> Bitte keine Werbung einwerfen! << 8244 8245} 8246 {220 Who do you wanna pretend to be today? 8247} 8248--- 8249name: print-nul-chars 8250description: 8251 Check handling of NUL characters for print and COMSUB 8252stdin: 8253 x=$(print '<\0>') 8254 print $(($(print '<\0>' | wc -c))) $(($(print "$x" | wc -c))) \ 8255 ${#x} "$x" '<\0>' 8256expected-stdout-pattern: 8257 /^4 3 2 <> <\0>$/ 8258--- 8259name: print-escapes 8260description: 8261 Check backslash expansion by the print builtin 8262stdin: 8263 print '\ \!\"\#\$\%\&'\\\''\(\)\*\+\,\-\.\/\0\1\2\3\4\5\6\7\8' \ 8264 '\9\:\;\<\=\>\?\@\A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T' \ 8265 '\U\V\W\X\Y\Z\[\\\]\^\_\`\a\b \d\e\f\g\h\i\j\k\l\m\n\o\p' \ 8266 '\q\r\s\t\u\v\w\x\y\z\{\|\}\~' '\u20acd' '\U20acd' '\x123' \ 8267 '\0x' '\0123' '\01234' | { 8268 # integer-base-one-3As 8269 typeset -Uui16 -Z11 pos=0 8270 typeset -Uui16 -Z5 hv=2147483647 8271 typeset -i1 wc=0x0A 8272 dasc= 8273 nl=${wc#1#} 8274 while IFS= read -r line; do 8275 line=$line$nl 8276 while [[ -n $line ]]; do 8277 hv=1#${line::1} 8278 if (( (pos & 15) == 0 )); then 8279 (( pos )) && print "$dasc|" 8280 print -n "${pos#16#} " 8281 dasc=' |' 8282 fi 8283 print -n "${hv#16#} " 8284 if (( (hv < 32) || (hv > 126) )); then 8285 dasc=$dasc. 8286 else 8287 dasc=$dasc${line::1} 8288 fi 8289 (( (pos++ & 15) == 7 )) && print -n -- '- ' 8290 line=${line:1} 8291 done 8292 done 8293 while (( pos & 15 )); do 8294 print -n ' ' 8295 (( (pos++ & 15) == 7 )) && print -n -- '- ' 8296 done 8297 (( hv == 2147483647 )) || print "$dasc|" 8298 } 8299expected-stdout: 8300 00000000 5C 20 5C 21 5C 22 5C 23 - 5C 24 5C 25 5C 26 5C 27 |\ \!\"\#\$\%\&\'| 8301 00000010 5C 28 5C 29 5C 2A 5C 2B - 5C 2C 5C 2D 5C 2E 5C 2F |\(\)\*\+\,\-\.\/| 8302 00000020 5C 31 5C 32 5C 33 5C 34 - 5C 35 5C 36 5C 37 5C 38 |\1\2\3\4\5\6\7\8| 8303 00000030 20 5C 39 5C 3A 5C 3B 5C - 3C 5C 3D 5C 3E 5C 3F 5C | \9\:\;\<\=\>\?\| 8304 00000040 40 5C 41 5C 42 5C 43 5C - 44 1B 5C 46 5C 47 5C 48 |@\A\B\C\D.\F\G\H| 8305 00000050 5C 49 5C 4A 5C 4B 5C 4C - 5C 4D 5C 4E 5C 4F 5C 50 |\I\J\K\L\M\N\O\P| 8306 00000060 5C 51 5C 52 5C 53 5C 54 - 20 5C 56 5C 57 5C 58 5C |\Q\R\S\T \V\W\X\| 8307 00000070 59 5C 5A 5C 5B 5C 5C 5D - 5C 5E 5C 5F 5C 60 07 08 |Y\Z\[\]\^\_\`..| 8308 00000080 20 20 5C 64 1B 0C 5C 67 - 5C 68 5C 69 5C 6A 5C 6B | \d..\g\h\i\j\k| 8309 00000090 5C 6C 5C 6D 0A 5C 6F 5C - 70 20 5C 71 0D 5C 73 09 |\l\m.\o\p \q.\s.| 8310 000000A0 0B 5C 77 5C 79 5C 7A 5C - 7B 5C 7C 5C 7D 5C 7E 20 |.\w\y\z\{\|\}\~ | 8311 000000B0 E2 82 AC 64 20 EF BF BD - 20 12 33 20 78 20 53 20 |...d ... .3 x S | 8312 000000C0 53 34 0A - |S4.| 8313--- 8314name: dollar-doublequoted-strings 8315description: 8316 Check that a $ preceding "…" is ignored 8317stdin: 8318 echo $"Localise me!" 8319 cat <<<$"Me too!" 8320 V=X 8321 aol=aol 8322 cat <<-$"aol" 8323 I do not take a $V for a V! 8324 aol 8325expected-stdout: 8326 Localise me! 8327 Me too! 8328 I do not take a $V for a V! 8329--- 8330name: dollar-quoted-strings 8331description: 8332 Check backslash expansion by $'…' strings 8333stdin: 8334 print '#!'"$__progname"'\nfor x in "$@"; do print -r -- "$x"; done' >pfn 8335 chmod +x pfn 8336 ./pfn $'\ \!\"\#\$\%\&\'\(\)\*\+\,\-\.\/ \1\2\3\4\5\6' \ 8337 $'a\0b' $'a\01b' $'\7\8\9\:\;\<\=\>\?\@\A\B\C\D\E\F\G\H\I' \ 8338 $'\J\K\L\M\N\O\P\Q\R\S\T\U1\V\W\X\Y\Z\[\\\]\^\_\`\a\b\d\e' \ 8339 $'\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u1\v\w\x1\y\z\{\|\}\~ $x' \ 8340 $'\u20acd' $'\U20acd' $'\x123' $'fn\x0rd' $'\0234' $'\234' \ 8341 $'\2345' $'\ca' $'\c!' $'\c?' $'\c€' $'a\ 8342 b' | { 8343 # integer-base-one-3As 8344 typeset -Uui16 -Z11 pos=0 8345 typeset -Uui16 -Z5 hv=2147483647 8346 typeset -i1 wc=0x0A 8347 dasc= 8348 nl=${wc#1#} 8349 while IFS= read -r line; do 8350 line=$line$nl 8351 while [[ -n $line ]]; do 8352 hv=1#${line::1} 8353 if (( (pos & 15) == 0 )); then 8354 (( pos )) && print "$dasc|" 8355 print -n "${pos#16#} " 8356 dasc=' |' 8357 fi 8358 print -n "${hv#16#} " 8359 if (( (hv < 32) || (hv > 126) )); then 8360 dasc=$dasc. 8361 else 8362 dasc=$dasc${line::1} 8363 fi 8364 (( (pos++ & 15) == 7 )) && print -n -- '- ' 8365 line=${line:1} 8366 done 8367 done 8368 while (( pos & 15 )); do 8369 print -n ' ' 8370 (( (pos++ & 15) == 7 )) && print -n -- '- ' 8371 done 8372 (( hv == 2147483647 )) || print "$dasc|" 8373 } 8374expected-stdout: 8375 00000000 20 21 22 23 24 25 26 27 - 28 29 2A 2B 2C 2D 2E 2F | !"#$%&'()*+,-./| 8376 00000010 20 01 02 03 04 05 06 0A - 61 0A 61 01 62 0A 07 38 | .......a.a.b..8| 8377 00000020 39 3A 3B 3C 3D 3E 3F 40 - 41 42 43 44 1B 46 47 48 |9:;<=>?@ABCD.FGH| 8378 00000030 49 0A 4A 4B 4C 4D 4E 4F - 50 51 52 53 54 01 56 57 |I.JKLMNOPQRST.VW| 8379 00000040 58 59 5A 5B 5C 5D 5E 5F - 60 07 08 64 1B 0A 0C 67 |XYZ[\]^_`..d...g| 8380 00000050 68 69 6A 6B 6C 6D 0A 6F - 70 71 0D 73 09 01 0B 77 |hijklm.opq.s...w| 8381 00000060 01 79 7A 7B 7C 7D 7E 20 - 24 78 0A E2 82 AC 64 0A |.yz{|}~ $x....d.| 8382 00000070 EF BF BD 0A C4 A3 0A 66 - 6E 0A 13 34 0A 9C 0A 9C |.......fn..4....| 8383 00000080 35 0A 01 0A 01 0A 7F 0A - 02 82 AC 0A 61 0A 62 0A |5...........a.b.| 8384--- 8385name: dollar-quotes-in-heredocs-strings 8386description: 8387 They are, however, not parsed in here documents, here strings 8388 (outside of string delimiters) or regular strings, but in 8389 parameter substitutions. 8390stdin: 8391 cat <<EOF 8392 dollar = strchr(s, '$'); /* ' */ 8393 foo " bar \" baz 8394 EOF 8395 cat <<$'a\tb' 8396 a\tb 8397 a b 8398 cat <<<"dollar = strchr(s, '$'); /* ' */" 8399 cat <<<'dollar = strchr(s, '\''$'\''); /* '\'' */' 8400 x="dollar = strchr(s, '$'); /* ' */" 8401 cat <<<"$x" 8402 cat <<<$'a\E[0m\tb' 8403 unset nl; print -r -- "x${nl:=$'\n'}y" 8404 echo "1 foo\"bar" 8405 # cf & HEREDOC 8406 cat <<EOF 8407 2 foo\"bar 8408 EOF 8409 # probably never reached for here strings? 8410 cat <<<"3 foo\"bar" 8411 cat <<<"4 foo\\\"bar" 8412 cat <<<'5 foo\"bar' 8413 # old scripts use this (e.g. ncurses) 8414 echo "^$" 8415 # make sure this works, outside of quotes 8416 cat <<<'7'$'\t''.' 8417expected-stdout: 8418 dollar = strchr(s, '$'); /* ' */ 8419 foo " bar \" baz 8420 a\tb 8421 dollar = strchr(s, '$'); /* ' */ 8422 dollar = strchr(s, '$'); /* ' */ 8423 dollar = strchr(s, '$'); /* ' */ 8424 a[0m b 8425 x 8426 y 8427 1 foo"bar 8428 2 foo\"bar 8429 3 foo"bar 8430 4 foo\"bar 8431 5 foo\"bar 8432 ^$ 8433 7 . 8434--- 8435name: dot-needs-argument 8436description: 8437 check Debian #415167 solution: '.' without arguments should fail 8438stdin: 8439 "$__progname" -c . 8440 "$__progname" -c source 8441expected-exit: e != 0 8442expected-stderr-pattern: 8443 /\.: missing argument.*\n.*\.: missing argument/ 8444--- 8445name: alias-function-no-conflict 8446description: 8447 make aliases not conflict with functions 8448 note: for ksh-like functions, the order of preference is 8449 different; bash outputs baz instead of bar in line 2 below 8450stdin: 8451 alias foo='echo bar' 8452 foo() { 8453 echo baz 8454 } 8455 alias korn='echo bar' 8456 function korn { 8457 echo baz 8458 } 8459 foo 8460 korn 8461 unset -f foo 8462 foo 2>/dev/null || echo rab 8463expected-stdout: 8464 baz 8465 bar 8466 rab 8467--- 8468name: bash-function-parens 8469description: 8470 ensure the keyword function is ignored when preceding 8471 POSIX style function declarations (bashism) 8472stdin: 8473 mk() { 8474 echo '#!'"$__progname" 8475 echo "$1 {" 8476 echo ' echo "bar='\''$0'\'\" 8477 echo '}' 8478 echo ${2:-foo} 8479 } 8480 mk 'function foo' >f-korn 8481 mk 'foo ()' >f-dash 8482 mk 'function foo ()' >f-bash 8483 mk 'function stop ()' stop >f-stop 8484 print '#!'"$__progname"'\nprint -r -- "${0%/f-argh}"' >f-argh 8485 chmod +x f-* 8486 u=$(./f-argh) 8487 x="korn: $(./f-korn)"; echo "${x/@("$u")/.}" 8488 x="dash: $(./f-dash)"; echo "${x/@("$u")/.}" 8489 x="bash: $(./f-bash)"; echo "${x/@("$u")/.}" 8490 x="stop: $(./f-stop)"; echo "${x/@("$u")/.}" 8491expected-stdout: 8492 korn: bar='foo' 8493 dash: bar='./f-dash' 8494 bash: bar='./f-bash' 8495 stop: bar='./f-stop' 8496--- 8497name: integer-base-one-1 8498description: 8499 check if the use of fake integer base 1 works 8500stdin: 8501 set -U 8502 typeset -Uui16 i0=1#� i1=1#€ 8503 typeset -i1 o0a=64 8504 typeset -i1 o1a=0x263A 8505 typeset -Uui1 o0b=0x7E 8506 typeset -Uui1 o1b=0xFDD0 8507 integer px=0xCAFE 'p0=1# ' p1=1#… pl=1#f 8508 echo "in <$i0> <$i1>" 8509 echo "out <${o0a#1#}|${o0b#1#}> <${o1a#1#}|${o1b#1#}>" 8510 typeset -Uui1 i0 i1 8511 echo "pass <$px> <$p0> <$p1> <$pl> <${i0#1#}|${i1#1#}>" 8512 typeset -Uui16 tv1=1#~ tv2=1# tv3=1#� tv4=1#� tv5=1#� tv6=1#� tv7=1# tv8=1# 8513 echo "specX <${tv1#16#}> <${tv2#16#}> <${tv3#16#}> <${tv4#16#}> <${tv5#16#}> <${tv6#16#}> <${tv7#16#}> <${tv8#16#}>" 8514 typeset -i1 tv1 tv2 tv3 tv4 tv5 tv6 tv7 tv8 8515 echo "specW <${tv1#1#}> <${tv2#1#}> <${tv3#1#}> <${tv4#1#}> <${tv5#1#}> <${tv6#1#}> <${tv7#1#}> <${tv8#1#}>" 8516 typeset -i1 xs1=0xEF7F xs2=0xEF80 xs3=0xFDD0 8517 echo "specU <${xs1#1#}> <${xs2#1#}> <${xs3#1#}>" 8518expected-stdout: 8519 in <16#EFEF> <16#20AC> 8520 out <@|~> <☺|> 8521 pass <16#cafe> <1# > <1#…> <1#f> <�|€> 8522 specX <7E> <7F> <EF80> <EF81> <EFC0> <EFC1> <A0> <80> 8523 specW <~> <> <�> <�> <�> <�> < > <> 8524 specU <> <�> <> 8525--- 8526name: integer-base-one-2a 8527description: 8528 check if the use of fake integer base 1 stops at correct characters 8529stdin: 8530 set -U 8531 integer x=1#foo 8532 echo /$x/ 8533expected-stderr-pattern: 8534 /1#foo: unexpected 'oo'/ 8535expected-exit: e != 0 8536--- 8537name: integer-base-one-2b 8538description: 8539 check if the use of fake integer base 1 stops at correct characters 8540stdin: 8541 set -U 8542 integer x=1#�� 8543 echo /$x/ 8544expected-stderr-pattern: 8545 /1#��: unexpected '�'/ 8546expected-exit: e != 0 8547--- 8548name: integer-base-one-2c1 8549description: 8550 check if the use of fake integer base 1 stops at correct characters 8551stdin: 8552 set -U 8553 integer x=1#… 8554 echo /$x/ 8555expected-stdout: 8556 /1#…/ 8557--- 8558name: integer-base-one-2c2 8559description: 8560 check if the use of fake integer base 1 stops at correct characters 8561stdin: 8562 set +U 8563 integer x=1#… 8564 echo /$x/ 8565expected-stderr-pattern: 8566 /1#…: unexpected '�'/ 8567expected-exit: e != 0 8568--- 8569name: integer-base-one-2d1 8570description: 8571 check if the use of fake integer base 1 handles octets okay 8572stdin: 8573 set -U 8574 typeset -i16 x=1#� 8575 echo /$x/ # invalid utf-8 8576expected-stdout: 8577 /16#efff/ 8578--- 8579name: integer-base-one-2d2 8580description: 8581 check if the use of fake integer base 1 handles octets 8582stdin: 8583 set -U 8584 typeset -i16 x=1#� 8585 echo /$x/ # invalid 2-byte 8586expected-stdout: 8587 /16#efc2/ 8588--- 8589name: integer-base-one-2d3 8590description: 8591 check if the use of fake integer base 1 handles octets 8592stdin: 8593 set -U 8594 typeset -i16 x=1#� 8595 echo /$x/ # invalid 2-byte 8596expected-stdout: 8597 /16#efef/ 8598--- 8599name: integer-base-one-2d4 8600description: 8601 check if the use of fake integer base 1 stops at invalid input 8602stdin: 8603 set -U 8604 typeset -i16 x=1#�� 8605 echo /$x/ # invalid 3-byte 8606expected-stderr-pattern: 8607 /1#��: unexpected '�'/ 8608expected-exit: e != 0 8609--- 8610name: integer-base-one-2d5 8611description: 8612 check if the use of fake integer base 1 stops at invalid input 8613stdin: 8614 set -U 8615 typeset -i16 x=1#�� 8616 echo /$x/ # non-minimalistic 8617expected-stderr-pattern: 8618 /1#��: unexpected '�'/ 8619expected-exit: e != 0 8620--- 8621name: integer-base-one-2d6 8622description: 8623 check if the use of fake integer base 1 stops at invalid input 8624stdin: 8625 set -U 8626 typeset -i16 x=1#��� 8627 echo /$x/ # non-minimalistic 8628expected-stderr-pattern: 8629 /1#���: unexpected '�'/ 8630expected-exit: e != 0 8631--- 8632name: integer-base-one-3As 8633description: 8634 some sample code for hexdumping 8635 not NUL safe; input lines must be NL terminated 8636stdin: 8637 { 8638 print 'Hello, World!\\\nこんにちは!' 8639 typeset -Uui16 i=0x100 8640 # change that to 0xFF once we can handle embedded 8641 # NUL characters in strings / here documents 8642 while (( i++ < 0x1FF )); do 8643 print -n "\x${i#16#1}" 8644 done 8645 print '\0z' 8646 } | { 8647 # integer-base-one-3As 8648 typeset -Uui16 -Z11 pos=0 8649 typeset -Uui16 -Z5 hv=2147483647 8650 typeset -i1 wc=0x0A 8651 dasc= 8652 nl=${wc#1#} 8653 while IFS= read -r line; do 8654 line=$line$nl 8655 while [[ -n $line ]]; do 8656 hv=1#${line::1} 8657 if (( (pos & 15) == 0 )); then 8658 (( pos )) && print "$dasc|" 8659 print -n "${pos#16#} " 8660 dasc=' |' 8661 fi 8662 print -n "${hv#16#} " 8663 if (( (hv < 32) || (hv > 126) )); then 8664 dasc=$dasc. 8665 else 8666 dasc=$dasc${line::1} 8667 fi 8668 (( (pos++ & 15) == 7 )) && print -n -- '- ' 8669 line=${line:1} 8670 done 8671 done 8672 while (( pos & 15 )); do 8673 print -n ' ' 8674 (( (pos++ & 15) == 7 )) && print -n -- '- ' 8675 done 8676 (( hv == 2147483647 )) || print "$dasc|" 8677 } 8678expected-stdout: 8679 00000000 48 65 6C 6C 6F 2C 20 57 - 6F 72 6C 64 21 5C 0A E3 |Hello, World!\..| 8680 00000010 81 93 E3 82 93 E3 81 AB - E3 81 A1 E3 81 AF EF BC |................| 8681 00000020 81 0A 01 02 03 04 05 06 - 07 08 09 0A 0B 0C 0D 0E |................| 8682 00000030 0F 10 11 12 13 14 15 16 - 17 18 19 1A 1B 1C 1D 1E |................| 8683 00000040 1F 20 21 22 23 24 25 26 - 27 28 29 2A 2B 2C 2D 2E |. !"#$%&'()*+,-.| 8684 00000050 2F 30 31 32 33 34 35 36 - 37 38 39 3A 3B 3C 3D 3E |/0123456789:;<=>| 8685 00000060 3F 40 41 42 43 44 45 46 - 47 48 49 4A 4B 4C 4D 4E |?@ABCDEFGHIJKLMN| 8686 00000070 4F 50 51 52 53 54 55 56 - 57 58 59 5A 5B 5C 5D 5E |OPQRSTUVWXYZ[\]^| 8687 00000080 5F 60 61 62 63 64 65 66 - 67 68 69 6A 6B 6C 6D 6E |_`abcdefghijklmn| 8688 00000090 6F 70 71 72 73 74 75 76 - 77 78 79 7A 7B 7C 7D 7E |opqrstuvwxyz{|}~| 8689 000000A0 7F 80 81 82 83 84 85 86 - 87 88 89 8A 8B 8C 8D 8E |................| 8690 000000B0 8F 90 91 92 93 94 95 96 - 97 98 99 9A 9B 9C 9D 9E |................| 8691 000000C0 9F A0 A1 A2 A3 A4 A5 A6 - A7 A8 A9 AA AB AC AD AE |................| 8692 000000D0 AF B0 B1 B2 B3 B4 B5 B6 - B7 B8 B9 BA BB BC BD BE |................| 8693 000000E0 BF C0 C1 C2 C3 C4 C5 C6 - C7 C8 C9 CA CB CC CD CE |................| 8694 000000F0 CF D0 D1 D2 D3 D4 D5 D6 - D7 D8 D9 DA DB DC DD DE |................| 8695 00000100 DF E0 E1 E2 E3 E4 E5 E6 - E7 E8 E9 EA EB EC ED EE |................| 8696 00000110 EF F0 F1 F2 F3 F4 F5 F6 - F7 F8 F9 FA FB FC FD FE |................| 8697 00000120 FF 7A 0A - |.z.| 8698--- 8699name: integer-base-one-3Ws 8700description: 8701 some sample code for hexdumping Unicode 8702 not NUL safe; input lines must be NL terminated 8703stdin: 8704 set -U 8705 { 8706 print 'Hello, World!\\\nこんにちは!' 8707 typeset -Uui16 i=0x100 8708 # change that to 0xFF once we can handle embedded 8709 # NUL characters in strings / here documents 8710 while (( i++ < 0x1FF )); do 8711 print -n "\u${i#16#1}" 8712 done 8713 print 8714 print \\xff # invalid utf-8 8715 print \\xc2 # invalid 2-byte 8716 print \\xef\\xbf\\xc0 # invalid 3-byte 8717 print \\xc0\\x80 # non-minimalistic 8718 print \\xe0\\x80\\x80 # non-minimalistic 8719 print '�' # end of range 8720 print '\0z' # embedded NUL 8721 } | { 8722 # integer-base-one-3Ws 8723 typeset -Uui16 -Z11 pos=0 8724 typeset -Uui16 -Z7 hv 8725 typeset -i1 wc=0x0A 8726 typeset -i lpos 8727 dasc= 8728 nl=${wc#1#} 8729 while IFS= read -r line; do 8730 line=$line$nl 8731 lpos=0 8732 while (( lpos < ${#line} )); do 8733 wc=1#${line:(lpos++):1} 8734 if (( (wc < 32) || \ 8735 ((wc > 126) && (wc < 160)) )); then 8736 dch=. 8737 elif (( (wc & 0xFF80) == 0xEF80 )); then 8738 dch=� 8739 else 8740 dch=${wc#1#} 8741 fi 8742 if (( (pos & 7) == 7 )); then 8743 dasc=$dasc$dch 8744 dch= 8745 elif (( (pos & 7) == 0 )); then 8746 (( pos )) && print "$dasc|" 8747 print -n "${pos#16#} " 8748 dasc=' |' 8749 fi 8750 let hv=wc 8751 print -n "${hv#16#} " 8752 (( (pos++ & 7) == 3 )) && \ 8753 print -n -- '- ' 8754 dasc=$dasc$dch 8755 done 8756 done 8757 while (( pos & 7 )); do 8758 print -n ' ' 8759 (( (pos++ & 7) == 3 )) && print -n -- '- ' 8760 done 8761 (( hv == 2147483647 )) || print "$dasc|" 8762 } 8763expected-stdout: 8764 00000000 0048 0065 006C 006C - 006F 002C 0020 0057 |Hello, W| 8765 00000008 006F 0072 006C 0064 - 0021 005C 000A 3053 |orld!\.こ| 8766 00000010 3093 306B 3061 306F - FF01 000A 0001 0002 |んにちは!...| 8767 00000018 0003 0004 0005 0006 - 0007 0008 0009 000A |........| 8768 00000020 000B 000C 000D 000E - 000F 0010 0011 0012 |........| 8769 00000028 0013 0014 0015 0016 - 0017 0018 0019 001A |........| 8770 00000030 001B 001C 001D 001E - 001F 0020 0021 0022 |..... !"| 8771 00000038 0023 0024 0025 0026 - 0027 0028 0029 002A |#$%&'()*| 8772 00000040 002B 002C 002D 002E - 002F 0030 0031 0032 |+,-./012| 8773 00000048 0033 0034 0035 0036 - 0037 0038 0039 003A |3456789:| 8774 00000050 003B 003C 003D 003E - 003F 0040 0041 0042 |;<=>?@AB| 8775 00000058 0043 0044 0045 0046 - 0047 0048 0049 004A |CDEFGHIJ| 8776 00000060 004B 004C 004D 004E - 004F 0050 0051 0052 |KLMNOPQR| 8777 00000068 0053 0054 0055 0056 - 0057 0058 0059 005A |STUVWXYZ| 8778 00000070 005B 005C 005D 005E - 005F 0060 0061 0062 |[\]^_`ab| 8779 00000078 0063 0064 0065 0066 - 0067 0068 0069 006A |cdefghij| 8780 00000080 006B 006C 006D 006E - 006F 0070 0071 0072 |klmnopqr| 8781 00000088 0073 0074 0075 0076 - 0077 0078 0079 007A |stuvwxyz| 8782 00000090 007B 007C 007D 007E - 007F 0080 0081 0082 |{|}~....| 8783 00000098 0083 0084 0085 0086 - 0087 0088 0089 008A |........| 8784 000000A0 008B 008C 008D 008E - 008F 0090 0091 0092 |........| 8785 000000A8 0093 0094 0095 0096 - 0097 0098 0099 009A |........| 8786 000000B0 009B 009C 009D 009E - 009F 00A0 00A1 00A2 |..... ¡¢| 8787 000000B8 00A3 00A4 00A5 00A6 - 00A7 00A8 00A9 00AA |£¤¥¦§¨©ª| 8788 000000C0 00AB 00AC 00AD 00AE - 00AF 00B0 00B1 00B2 |«¬®¯°±²| 8789 000000C8 00B3 00B4 00B5 00B6 - 00B7 00B8 00B9 00BA |³´µ¶·¸¹º| 8790 000000D0 00BB 00BC 00BD 00BE - 00BF 00C0 00C1 00C2 |»¼½¾¿ÀÁÂ| 8791 000000D8 00C3 00C4 00C5 00C6 - 00C7 00C8 00C9 00CA |ÃÄÅÆÇÈÉÊ| 8792 000000E0 00CB 00CC 00CD 00CE - 00CF 00D0 00D1 00D2 |ËÌÍÎÏÐÑÒ| 8793 000000E8 00D3 00D4 00D5 00D6 - 00D7 00D8 00D9 00DA |ÓÔÕÖ×ØÙÚ| 8794 000000F0 00DB 00DC 00DD 00DE - 00DF 00E0 00E1 00E2 |ÛÜÝÞßàáâ| 8795 000000F8 00E3 00E4 00E5 00E6 - 00E7 00E8 00E9 00EA |ãäåæçèéê| 8796 00000100 00EB 00EC 00ED 00EE - 00EF 00F0 00F1 00F2 |ëìíîïðñò| 8797 00000108 00F3 00F4 00F5 00F6 - 00F7 00F8 00F9 00FA |óôõö÷øùú| 8798 00000110 00FB 00FC 00FD 00FE - 00FF 000A EFFF 000A |ûüýþÿ.�.| 8799 00000118 EFC2 000A EFEF EFBF - EFC0 000A EFC0 EF80 |�.���.��| 8800 00000120 000A EFE0 EF80 EF80 - 000A FFFD EFEF EFBF |.���.���| 8801 00000128 EFBE EFEF EFBF EFBF - 000A 007A 000A |����.z.| 8802--- 8803name: integer-base-one-3Ar 8804description: 8805 some sample code for hexdumping; NUL and binary safe 8806stdin: 8807 { 8808 print 'Hello, World!\\\nこんにちは!' 8809 typeset -Uui16 i=0x100 8810 # change that to 0xFF once we can handle embedded 8811 # NUL characters in strings / here documents 8812 while (( i++ < 0x1FF )); do 8813 print -n "\x${i#16#1}" 8814 done 8815 print '\0z' 8816 } | { 8817 # integer-base-one-3Ar 8818 typeset -Uui16 -Z11 pos=0 8819 typeset -Uui16 -Z5 hv=2147483647 8820 dasc= 8821 if read -arN -1 line; then 8822 typeset -i1 line 8823 i=0 8824 while (( i < ${#line[*]} )); do 8825 hv=${line[i++]} 8826 if (( (pos & 15) == 0 )); then 8827 (( pos )) && print "$dasc|" 8828 print -n "${pos#16#} " 8829 dasc=' |' 8830 fi 8831 print -n "${hv#16#} " 8832 if (( (hv < 32) || (hv > 126) )); then 8833 dasc=$dasc. 8834 else 8835 dasc=$dasc${line[i-1]#1#} 8836 fi 8837 (( (pos++ & 15) == 7 )) && print -n -- '- ' 8838 done 8839 fi 8840 while (( pos & 15 )); do 8841 print -n ' ' 8842 (( (pos++ & 15) == 7 )) && print -n -- '- ' 8843 done 8844 (( hv == 2147483647 )) || print "$dasc|" 8845 } 8846expected-stdout: 8847 00000000 48 65 6C 6C 6F 2C 20 57 - 6F 72 6C 64 21 5C 0A E3 |Hello, World!\..| 8848 00000010 81 93 E3 82 93 E3 81 AB - E3 81 A1 E3 81 AF EF BC |................| 8849 00000020 81 0A 01 02 03 04 05 06 - 07 08 09 0A 0B 0C 0D 0E |................| 8850 00000030 0F 10 11 12 13 14 15 16 - 17 18 19 1A 1B 1C 1D 1E |................| 8851 00000040 1F 20 21 22 23 24 25 26 - 27 28 29 2A 2B 2C 2D 2E |. !"#$%&'()*+,-.| 8852 00000050 2F 30 31 32 33 34 35 36 - 37 38 39 3A 3B 3C 3D 3E |/0123456789:;<=>| 8853 00000060 3F 40 41 42 43 44 45 46 - 47 48 49 4A 4B 4C 4D 4E |?@ABCDEFGHIJKLMN| 8854 00000070 4F 50 51 52 53 54 55 56 - 57 58 59 5A 5B 5C 5D 5E |OPQRSTUVWXYZ[\]^| 8855 00000080 5F 60 61 62 63 64 65 66 - 67 68 69 6A 6B 6C 6D 6E |_`abcdefghijklmn| 8856 00000090 6F 70 71 72 73 74 75 76 - 77 78 79 7A 7B 7C 7D 7E |opqrstuvwxyz{|}~| 8857 000000A0 7F 80 81 82 83 84 85 86 - 87 88 89 8A 8B 8C 8D 8E |................| 8858 000000B0 8F 90 91 92 93 94 95 96 - 97 98 99 9A 9B 9C 9D 9E |................| 8859 000000C0 9F A0 A1 A2 A3 A4 A5 A6 - A7 A8 A9 AA AB AC AD AE |................| 8860 000000D0 AF B0 B1 B2 B3 B4 B5 B6 - B7 B8 B9 BA BB BC BD BE |................| 8861 000000E0 BF C0 C1 C2 C3 C4 C5 C6 - C7 C8 C9 CA CB CC CD CE |................| 8862 000000F0 CF D0 D1 D2 D3 D4 D5 D6 - D7 D8 D9 DA DB DC DD DE |................| 8863 00000100 DF E0 E1 E2 E3 E4 E5 E6 - E7 E8 E9 EA EB EC ED EE |................| 8864 00000110 EF F0 F1 F2 F3 F4 F5 F6 - F7 F8 F9 FA FB FC FD FE |................| 8865 00000120 FF 00 7A 0A - |..z.| 8866--- 8867name: integer-base-one-3Wr 8868description: 8869 some sample code for hexdumping Unicode; NUL and binary safe 8870stdin: 8871 set -U 8872 { 8873 print 'Hello, World!\\\nこんにちは!' 8874 typeset -Uui16 i=0x100 8875 # change that to 0xFF once we can handle embedded 8876 # NUL characters in strings / here documents 8877 while (( i++ < 0x1FF )); do 8878 print -n "\u${i#16#1}" 8879 done 8880 print 8881 print \\xff # invalid utf-8 8882 print \\xc2 # invalid 2-byte 8883 print \\xef\\xbf\\xc0 # invalid 3-byte 8884 print \\xc0\\x80 # non-minimalistic 8885 print \\xe0\\x80\\x80 # non-minimalistic 8886 print '�' # end of range 8887 print '\0z' # embedded NUL 8888 } | { 8889 # integer-base-one-3Wr 8890 typeset -Uui16 -Z11 pos=0 8891 typeset -Uui16 -Z7 hv=2147483647 8892 dasc= 8893 if read -arN -1 line; then 8894 typeset -i1 line 8895 i=0 8896 while (( i < ${#line[*]} )); do 8897 hv=${line[i++]} 8898 if (( (hv < 32) || \ 8899 ((hv > 126) && (hv < 160)) )); then 8900 dch=. 8901 elif (( (hv & 0xFF80) == 0xEF80 )); then 8902 dch=� 8903 else 8904 dch=${line[i-1]#1#} 8905 fi 8906 if (( (pos & 7) == 7 )); then 8907 dasc=$dasc$dch 8908 dch= 8909 elif (( (pos & 7) == 0 )); then 8910 (( pos )) && print "$dasc|" 8911 print -n "${pos#16#} " 8912 dasc=' |' 8913 fi 8914 print -n "${hv#16#} " 8915 (( (pos++ & 7) == 3 )) && \ 8916 print -n -- '- ' 8917 dasc=$dasc$dch 8918 done 8919 fi 8920 while (( pos & 7 )); do 8921 print -n ' ' 8922 (( (pos++ & 7) == 3 )) && print -n -- '- ' 8923 done 8924 (( hv == 2147483647 )) || print "$dasc|" 8925 } 8926expected-stdout: 8927 00000000 0048 0065 006C 006C - 006F 002C 0020 0057 |Hello, W| 8928 00000008 006F 0072 006C 0064 - 0021 005C 000A 3053 |orld!\.こ| 8929 00000010 3093 306B 3061 306F - FF01 000A 0001 0002 |んにちは!...| 8930 00000018 0003 0004 0005 0006 - 0007 0008 0009 000A |........| 8931 00000020 000B 000C 000D 000E - 000F 0010 0011 0012 |........| 8932 00000028 0013 0014 0015 0016 - 0017 0018 0019 001A |........| 8933 00000030 001B 001C 001D 001E - 001F 0020 0021 0022 |..... !"| 8934 00000038 0023 0024 0025 0026 - 0027 0028 0029 002A |#$%&'()*| 8935 00000040 002B 002C 002D 002E - 002F 0030 0031 0032 |+,-./012| 8936 00000048 0033 0034 0035 0036 - 0037 0038 0039 003A |3456789:| 8937 00000050 003B 003C 003D 003E - 003F 0040 0041 0042 |;<=>?@AB| 8938 00000058 0043 0044 0045 0046 - 0047 0048 0049 004A |CDEFGHIJ| 8939 00000060 004B 004C 004D 004E - 004F 0050 0051 0052 |KLMNOPQR| 8940 00000068 0053 0054 0055 0056 - 0057 0058 0059 005A |STUVWXYZ| 8941 00000070 005B 005C 005D 005E - 005F 0060 0061 0062 |[\]^_`ab| 8942 00000078 0063 0064 0065 0066 - 0067 0068 0069 006A |cdefghij| 8943 00000080 006B 006C 006D 006E - 006F 0070 0071 0072 |klmnopqr| 8944 00000088 0073 0074 0075 0076 - 0077 0078 0079 007A |stuvwxyz| 8945 00000090 007B 007C 007D 007E - 007F 0080 0081 0082 |{|}~....| 8946 00000098 0083 0084 0085 0086 - 0087 0088 0089 008A |........| 8947 000000A0 008B 008C 008D 008E - 008F 0090 0091 0092 |........| 8948 000000A8 0093 0094 0095 0096 - 0097 0098 0099 009A |........| 8949 000000B0 009B 009C 009D 009E - 009F 00A0 00A1 00A2 |..... ¡¢| 8950 000000B8 00A3 00A4 00A5 00A6 - 00A7 00A8 00A9 00AA |£¤¥¦§¨©ª| 8951 000000C0 00AB 00AC 00AD 00AE - 00AF 00B0 00B1 00B2 |«¬®¯°±²| 8952 000000C8 00B3 00B4 00B5 00B6 - 00B7 00B8 00B9 00BA |³´µ¶·¸¹º| 8953 000000D0 00BB 00BC 00BD 00BE - 00BF 00C0 00C1 00C2 |»¼½¾¿ÀÁÂ| 8954 000000D8 00C3 00C4 00C5 00C6 - 00C7 00C8 00C9 00CA |ÃÄÅÆÇÈÉÊ| 8955 000000E0 00CB 00CC 00CD 00CE - 00CF 00D0 00D1 00D2 |ËÌÍÎÏÐÑÒ| 8956 000000E8 00D3 00D4 00D5 00D6 - 00D7 00D8 00D9 00DA |ÓÔÕÖ×ØÙÚ| 8957 000000F0 00DB 00DC 00DD 00DE - 00DF 00E0 00E1 00E2 |ÛÜÝÞßàáâ| 8958 000000F8 00E3 00E4 00E5 00E6 - 00E7 00E8 00E9 00EA |ãäåæçèéê| 8959 00000100 00EB 00EC 00ED 00EE - 00EF 00F0 00F1 00F2 |ëìíîïðñò| 8960 00000108 00F3 00F4 00F5 00F6 - 00F7 00F8 00F9 00FA |óôõö÷øùú| 8961 00000110 00FB 00FC 00FD 00FE - 00FF 000A EFFF 000A |ûüýþÿ.�.| 8962 00000118 EFC2 000A EFEF EFBF - EFC0 000A EFC0 EF80 |�.���.��| 8963 00000120 000A EFE0 EF80 EF80 - 000A FFFD EFEF EFBF |.���.���| 8964 00000128 EFBE EFEF EFBF EFBF - 000A 0000 007A 000A |����..z.| 8965--- 8966name: integer-base-one-4 8967description: 8968 Check if ksh93-style base-one integers work 8969category: !smksh 8970stdin: 8971 set -U 8972 echo 1 $(('a')) 8973 (echo 2f $(('aa'))) 2>&1 | sed "s/^[^']*'/2p '/" 8974 echo 3 $(('…')) 8975 x="'a'" 8976 echo "4 <$x>" 8977 echo 5 $(($x)) 8978 echo 6 $((x)) 8979expected-stdout: 8980 1 97 8981 2p 'aa': multi-character character constant 8982 3 8230 8983 4 <'a'> 8984 5 97 8985 6 97 8986--- 8987name: integer-base-one-5A 8988description: 8989 Check to see that we’re NUL and Unicode safe 8990stdin: 8991 set +U 8992 print 'a\0b\xfdz' >x 8993 read -a y <x 8994 set -U 8995 typeset -Uui16 y 8996 print ${y[*]} . 8997expected-stdout: 8998 16#61 16#0 16#62 16#FD 16#7A . 8999--- 9000name: integer-base-one-5W 9001description: 9002 Check to see that we’re NUL and Unicode safe 9003stdin: 9004 set -U 9005 print 'a\0b€c' >x 9006 read -a y <x 9007 set +U 9008 typeset -Uui16 y 9009 print ${y[*]} . 9010expected-stdout: 9011 16#61 16#0 16#62 16#20AC 16#63 . 9012--- 9013name: ulimit-1 9014description: 9015 Check if we can use a specific syntax idiom for ulimit 9016category: !os:syllable 9017stdin: 9018 if ! x=$(ulimit -d) || [[ $x = unknown ]]; then 9019 #echo expected to fail on this OS 9020 echo okay 9021 else 9022 ulimit -dS $x && echo okay 9023 fi 9024expected-stdout: 9025 okay 9026--- 9027name: redir-1 9028description: 9029 Check some of the most basic invariants of I/O redirection 9030stdin: 9031 i=0 9032 function d { 9033 print o$i. 9034 print -u2 e$((i++)). 9035 } 9036 d >a 2>b 9037 echo =1= 9038 cat a 9039 echo =2= 9040 cat b 9041 echo =3= 9042 d 2>&1 >c 9043 echo =4= 9044 cat c 9045 echo =5= 9046expected-stdout: 9047 =1= 9048 o0. 9049 =2= 9050 e0. 9051 =3= 9052 e1. 9053 =4= 9054 o1. 9055 =5= 9056--- 9057name: bashiop-1 9058description: 9059 Check if GNU bash-like I/O redirection works 9060 Part 1: this is also supported by GNU bash 9061category: shell:legacy-no 9062stdin: 9063 exec 3>&1 9064 function threeout { 9065 echo ras 9066 echo dwa >&2 9067 echo tri >&3 9068 } 9069 threeout &>foo 9070 echo === 9071 cat foo 9072expected-stdout: 9073 tri 9074 === 9075 ras 9076 dwa 9077--- 9078name: bashiop-2a 9079description: 9080 Check if GNU bash-like I/O redirection works 9081 Part 2: this is *not* supported by GNU bash 9082category: shell:legacy-no 9083stdin: 9084 exec 3>&1 9085 function threeout { 9086 echo ras 9087 echo dwa >&2 9088 echo tri >&3 9089 } 9090 threeout 3&>foo 9091 echo === 9092 cat foo 9093expected-stdout: 9094 ras 9095 === 9096 dwa 9097 tri 9098--- 9099name: bashiop-2b 9100description: 9101 Check if GNU bash-like I/O redirection works 9102 Part 2: this is *not* supported by GNU bash 9103category: shell:legacy-no 9104stdin: 9105 exec 3>&1 9106 function threeout { 9107 echo ras 9108 echo dwa >&2 9109 echo tri >&3 9110 } 9111 threeout 3>foo &>&3 9112 echo === 9113 cat foo 9114expected-stdout: 9115 === 9116 ras 9117 dwa 9118 tri 9119--- 9120name: bashiop-2c 9121description: 9122 Check if GNU bash-like I/O redirection works 9123 Part 2: this is supported by GNU bash 4 only 9124category: shell:legacy-no 9125stdin: 9126 echo mir >foo 9127 set -o noclobber 9128 exec 3>&1 9129 function threeout { 9130 echo ras 9131 echo dwa >&2 9132 echo tri >&3 9133 } 9134 threeout &>>foo 9135 echo === 9136 cat foo 9137expected-stdout: 9138 tri 9139 === 9140 mir 9141 ras 9142 dwa 9143--- 9144name: bashiop-3a 9145description: 9146 Check if GNU bash-like I/O redirection fails correctly 9147 Part 1: this is also supported by GNU bash 9148category: shell:legacy-no 9149stdin: 9150 echo mir >foo 9151 set -o noclobber 9152 exec 3>&1 9153 function threeout { 9154 echo ras 9155 echo dwa >&2 9156 echo tri >&3 9157 } 9158 threeout &>foo 9159 echo === 9160 cat foo 9161expected-stdout: 9162 === 9163 mir 9164expected-stderr-pattern: /.*: can't (create|overwrite) .*/ 9165--- 9166name: bashiop-3b 9167description: 9168 Check if GNU bash-like I/O redirection fails correctly 9169 Part 2: this is *not* supported by GNU bash 9170category: shell:legacy-no 9171stdin: 9172 echo mir >foo 9173 set -o noclobber 9174 exec 3>&1 9175 function threeout { 9176 echo ras 9177 echo dwa >&2 9178 echo tri >&3 9179 } 9180 threeout &>|foo 9181 echo === 9182 cat foo 9183expected-stdout: 9184 tri 9185 === 9186 ras 9187 dwa 9188--- 9189name: bashiop-4 9190description: 9191 Check if GNU bash-like I/O redirection works 9192 Part 4: this is also supported by GNU bash, 9193 but failed in some mksh versions 9194category: shell:legacy-no 9195stdin: 9196 exec 3>&1 9197 function threeout { 9198 echo ras 9199 echo dwa >&2 9200 echo tri >&3 9201 } 9202 function blubb { 9203 [[ -e bar ]] && threeout "$bf" &>foo 9204 } 9205 blubb 9206 echo -n >bar 9207 blubb 9208 echo === 9209 cat foo 9210expected-stdout: 9211 tri 9212 === 9213 ras 9214 dwa 9215--- 9216name: bashiop-5-normal 9217description: 9218 Check if GNU bash-like I/O redirection is only supported 9219 in !POSIX !sh mode as it breaks existing scripts' syntax 9220category: shell:legacy-no 9221stdin: 9222 :>x; echo 1 "$("$__progname" -c 'echo foo>/dev/null&>x echo bar')" = "$(<x)" . 9223 :>x; echo 2 "$("$__progname" -o posix -c 'echo foo>/dev/null&>x echo bar')" = "$(<x)" . 9224 :>x; echo 3 "$("$__progname" -o sh -c 'echo foo>/dev/null&>x echo bar')" = "$(<x)" . 9225expected-stdout: 9226 1 = foo echo bar . 9227 2 = bar . 9228 3 = bar . 9229--- 9230name: bashiop-5-legacy 9231description: 9232 Check if GNU bash-like I/O redirection is not parsed 9233 in lksh as it breaks existing scripts' syntax 9234category: shell:legacy-yes 9235stdin: 9236 :>x; echo 1 "$("$__progname" -c 'echo foo>/dev/null&>x echo bar')" = "$(<x)" . 9237 :>x; echo 2 "$("$__progname" -o posix -c 'echo foo>/dev/null&>x echo bar')" = "$(<x)" . 9238 :>x; echo 3 "$("$__progname" -o sh -c 'echo foo>/dev/null&>x echo bar')" = "$(<x)" . 9239expected-stdout: 9240 1 = bar . 9241 2 = bar . 9242 3 = bar . 9243--- 9244name: mkshiop-1 9245description: 9246 Check for support of more than 9 file descriptors 9247category: !convfds 9248stdin: 9249 read -u10 foo 10<<< bar 9250 echo x$foo 9251expected-stdout: 9252 xbar 9253--- 9254name: mkshiop-2 9255description: 9256 Check for support of more than 9 file descriptors 9257category: !convfds 9258stdin: 9259 exec 12>foo 9260 print -u12 bar 9261 echo baz >&12 9262 cat foo 9263expected-stdout: 9264 bar 9265 baz 9266--- 9267name: oksh-eval 9268description: 9269 Check expansions. 9270stdin: 9271 a= 9272 for n in ${a#*=}; do echo 1hu ${n} .; done 9273 for n in "${a#*=}"; do echo 1hq ${n} .; done 9274 for n in ${a##*=}; do echo 2hu ${n} .; done 9275 for n in "${a##*=}"; do echo 2hq ${n} .; done 9276 for n in ${a%=*}; do echo 1pu ${n} .; done 9277 for n in "${a%=*}"; do echo 1pq ${n} .; done 9278 for n in ${a%%=*}; do echo 2pu ${n} .; done 9279 for n in "${a%%=*}"; do echo 2pq ${n} .; done 9280expected-stdout: 9281 1hq . 9282 2hq . 9283 1pq . 9284 2pq . 9285--- 9286name: oksh-and-list-error-1 9287description: 9288 Test exit status of rightmost element in 2 element && list in -e mode 9289stdin: 9290 true && false 9291 echo "should not print" 9292arguments: !-e! 9293expected-exit: e != 0 9294--- 9295name: oksh-and-list-error-2 9296description: 9297 Test exit status of rightmost element in 3 element && list in -e mode 9298stdin: 9299 true && true && false 9300 echo "should not print" 9301arguments: !-e! 9302expected-exit: e != 0 9303--- 9304name: oksh-or-list-error-1 9305description: 9306 Test exit status of || list in -e mode 9307stdin: 9308 false || false 9309 echo "should not print" 9310arguments: !-e! 9311expected-exit: e != 0 9312--- 9313name: oksh-longline-crash 9314description: 9315 This used to cause a core dump 9316stdin: 9317 ulimit -c 0 9318 deplibs="-lz -lpng /usr/local/lib/libjpeg.la -ltiff -lm -lX11 -lXext /usr/local/lib/libiconv.la -L/usr/local/lib -L/usr/ports/devel/gettext/w-gettext-0.10.40/gettext-0.10.40/intl/.libs /usr/local/lib/libintl.la /usr/local/lib/libglib.la /usr/local/lib/libgmodule.la -lintl -lm -lX11 -lXext -L/usr/X11R6/lib -lglib -lgmodule -L/usr/local/lib /usr/local/lib/libgdk.la -lintl -lm -lX11 -lXext -L/usr/X11R6/lib -lglib -lgmodule -L/usr/local/lib /usr/local/lib/libgtk.la -ltiff -ljpeg -lz -lpng -lm -lX11 -lXext -lintl -lglib -lgmodule -lgdk -lgtk -L/usr/X11R6/lib -lglib -lgmodule -L/usr/local/lib /usr/local/lib/libgdk_pixbuf.la -lz -lpng /usr/local/lib/libiconv.la -L/usr/local/lib -L/usr/ports/devel/gettext/w-gettext-0.10.40/gettext-0.10.40/intl/.libs /usr/local/lib/libintl.la /usr/local/lib/libglib.la -lm -lm /usr/local/lib/libaudiofile.la -lm -lm -laudiofile -L/usr/local/lib /usr/local/lib/libesd.la -lm -lz -L/usr/local/lib /usr/local/lib/libgnomesupport.la -lm -lz -lm -lglib -L/usr/local/lib /usr/local/lib/libgnome.la -lX11 -lXext /usr/local/lib/libiconv.la -L/usr/local/lib -L/usr/ports/devel/gettext/w-gettext-0.10.40/gettext-0.10.40/intl/.libs /usr/local/lib/libintl.la /usr/local/lib/libgmodule.la -lintl -lm -lX11 -lXext -L/usr/X11R6/lib -lglib -lgmodule -L/usr/local/lib /usr/local/lib/libgdk.la -lintl -lm -lX11 -lXext -L/usr/X11R6/lib -lglib -lgmodule -L/usr/local/lib /usr/local/lib/libgtk.la -lICE -lSM -lz -lpng /usr/local/lib/libungif.la /usr/local/lib/libjpeg.la -ltiff -lm -lz -lpng /usr/local/lib/libungif.la -lz /usr/local/lib/libjpeg.la -ltiff -L/usr/local/lib -L/usr/X11R6/lib /usr/local/lib/libgdk_imlib.la -lm -L/usr/local/lib /usr/local/lib/libart_lgpl.la -lm -lz -lm -lX11 -lXext -lintl -lglib -lgmodule -lgdk -lgtk -lICE -lSM -lm -lX11 -lXext -lintl -lglib -lgmodule -lgdk -lgtk -L/usr/X11R6/lib -lm -lz -lpng -lungif -lz -ljpeg -ltiff -ljpeg -lgdk_imlib -lglib -lm -laudiofile -lm -laudiofile -lesd -L/usr/local/lib /usr/local/lib/libgnomeui.la -lz -lz /usr/local/lib/libxml.la -lz -lz -lz /usr/local/lib/libxml.la -lm -lX11 -lXext /usr/local/lib/libiconv.la -L/usr/ports/devel/gettext/w-gettext-0.10.40/gettext-0.10.40/intl/.libs /usr/local/lib/libintl.la /usr/local/lib/libglib.la /usr/local/lib/libgmodule.la -lintl -lglib -lgmodule /usr/local/lib/libgdk.la /usr/local/lib/libgtk.la -L/usr/X11R6/lib -L/usr/local/lib /usr/local/lib/libglade.la -lz -lz -lz /usr/local/lib/libxml.la /usr/local/lib/libglib.la -lm -lm /usr/local/lib/libaudiofile.la -lm -lm -laudiofile /usr/local/lib/libesd.la -lm -lz /usr/local/lib/libgnomesupport.la -lm -lz -lm -lglib /usr/local/lib/libgnome.la -lX11 -lXext /usr/local/lib/libiconv.la -L/usr/ports/devel/gettext/w-gettext-0.10.40/gettext-0.10.40/intl/.libs /usr/local/lib/libintl.la /usr/local/lib/libgmodule.la -lintl -lm -lX11 -lXext -lglib -lgmodule /usr/local/lib/libgdk.la -lintl -lm -lX11 -lXext -lglib -lgmodule /usr/local/lib/libgtk.la -lICE -lSM -lz -lpng /usr/local/lib/libungif.la /usr/local/lib/libjpeg.la -ltiff -lm -lz -lz /usr/local/lib/libgdk_imlib.la /usr/local/lib/libart_lgpl.la -lm -lz -lm -lX11 -lXext -lintl -lglib -lgmodule -lgdk -lgtk -lm -lX11 -lXext -lintl -lglib -lgmodule -lgdk -lgtk -lm -lz -lungif -lz -ljpeg -ljpeg -lgdk_imlib -lglib -lm -laudiofile -lm -laudiofile -lesd /usr/local/lib/libgnomeui.la -L/usr/X11R6/lib -L/usr/local/lib /usr/local/lib/libglade-gnome.la /usr/local/lib/libglib.la -lm -lm /usr/local/lib/libaudiofile.la -lm -lm -laudiofile -L/usr/local/lib /usr/local/lib/libesd.la -lm -lz -L/usr/local/lib /usr/local/lib/libgnomesupport.la -lm -lz -lm -lglib -L/usr/local/lib /usr/local/lib/libgnome.la -lX11 -lXext /usr/local/lib/libiconv.la -L/usr/local/lib -L/usr/ports/devel/gettext/w-gettext-0.10.40/gettext-0.10.40/intl/.libs /usr/local/lib/libintl.la /usr/local/lib/libgmodule.la -lintl -lm -lX11 -lXext -L/usr/X11R6/lib -lglib -lgmodule -L/usr/local/lib /usr/local/lib/libgdk.la -lintl -lm -lX11 -lXext -L/usr/X11R6/lib -lglib -lgmodule -L/usr/local/lib /usr/local/lib/libgtk.la -lICE -lSM -lz -lpng /usr/local/lib/libungif.la /usr/local/lib/libjpeg.la -ltiff -lm -lz -lpng /usr/local/lib/libungif.la -lz /usr/local/lib/libjpeg.la -ltiff -L/usr/local/lib -L/usr/X11R6/lib /usr/local/lib/libgdk_imlib.la -lm -L/usr/local/lib /usr/local/lib/libart_lgpl.la -lm -lz -lm -lX11 -lXext -lintl -lglib -lgmodule -lgdk -lgtk -lICE -lSM -lm -lX11 -lXext -lintl -lglib -lgmodule -lgdk -lgtk -L/usr/X11R6/lib -lm -lz -lpng -lungif -lz -ljpeg -ltiff -ljpeg -lgdk_imlib -lglib -lm -laudiofile -lm -laudiofile -lesd -L/usr/local/lib /usr/local/lib/libgnomeui.la -L/usr/X11R6/lib -L/usr/local/lib" 9319 specialdeplibs="-lgnomeui -lart_lgpl -lgdk_imlib -ltiff -ljpeg -lungif -lpng -lz -lSM -lICE -lgtk -lgdk -lgmodule -lintl -lXext -lX11 -lgnome -lgnomesupport -lesd -laudiofile -lm -lglib" 9320 for deplib in $deplibs; do 9321 case $deplib in 9322 -L*) 9323 new_libs="$deplib $new_libs" 9324 ;; 9325 *) 9326 case " $specialdeplibs " in 9327 *" $deplib "*) 9328 new_libs="$deplib $new_libs";; 9329 esac 9330 ;; 9331 esac 9332 done 9333--- 9334name: oksh-seterror-1 9335description: 9336 The -e flag should be ignored when executing a compound list 9337 followed by an if statement. 9338stdin: 9339 if true; then false && false; fi 9340 true 9341arguments: !-e! 9342expected-exit: e == 0 9343--- 9344name: oksh-seterror-2 9345description: 9346 The -e flag should be ignored when executing a compound list 9347 followed by an if statement. 9348stdin: 9349 if true; then if true; then false && false; fi; fi 9350 true 9351arguments: !-e! 9352expected-exit: e == 0 9353--- 9354name: oksh-seterror-3 9355description: 9356 The -e flag should be ignored when executing a compound list 9357 followed by an elif statement. 9358stdin: 9359 if true; then :; elif true; then false && false; fi 9360arguments: !-e! 9361expected-exit: e == 0 9362--- 9363name: oksh-seterror-4 9364description: 9365 The -e flag should be ignored when executing a pipeline 9366 beginning with '!' 9367stdin: 9368 for i in 1 2 3 9369 do 9370 false && false 9371 true || false 9372 done 9373arguments: !-e! 9374expected-exit: e == 0 9375--- 9376name: oksh-seterror-5 9377description: 9378 The -e flag should be ignored when executing a pipeline 9379 beginning with '!' 9380stdin: 9381 ! true | false 9382 true 9383arguments: !-e! 9384expected-exit: e == 0 9385--- 9386name: oksh-seterror-6 9387description: 9388 When trapping ERR and EXIT, both traps should run in -e mode 9389 when an error occurs. 9390stdin: 9391 trap 'echo EXIT' EXIT 9392 trap 'echo ERR' ERR 9393 set -e 9394 false 9395 echo DONE 9396 exit 0 9397arguments: !-e! 9398expected-exit: e != 0 9399expected-stdout: 9400 ERR 9401 EXIT 9402--- 9403name: oksh-seterror-7 9404description: 9405 The -e flag within a command substitution should be honored 9406stdin: 9407 echo $( set -e; false; echo foo ) 9408arguments: !-e! 9409expected-stdout: 9410 9411--- 9412name: oksh-input-comsub 9413description: 9414 A command substitution using input redirection should exit with 9415 failure if the input file does not exist. 9416stdin: 9417 var=$(< non-existent) 9418expected-exit: e != 0 9419expected-stderr-pattern: /non-existent/ 9420--- 9421name: oksh-empty-for-list 9422description: 9423 A for list which expands to zero items should not execute the body. 9424stdin: 9425 set foo bar baz ; for out in ; do echo $out ; done 9426--- 9427name: oksh-varfunction-mod1 9428description: 9429 (Inspired by PR 2450 on OpenBSD.) Calling 9430 FOO=bar f 9431 where f is a ksh style function, should not set FOO in the current 9432 env. If f is a Bourne style function, FOO should be set. Furthermore, 9433 the function should receive a correct value of FOO. However, differing 9434 from oksh, setting FOO in the function itself must change the value in 9435 setting FOO in the function itself should not change the value in 9436 global environment. 9437stdin: 9438 print '#!'"$__progname"'\nunset RANDOM\nexport | while IFS= read -r' \ 9439 'RANDOM; do eval '\''print -r -- "$RANDOM=$'\''"$RANDOM"'\'\"\'\; \ 9440 done >env; chmod +x env; PATH=.:$PATH 9441 function k { 9442 if [ x$FOO != xbar ]; then 9443 echo 1 9444 return 1 9445 fi 9446 x=$(env | grep FOO) 9447 if [ "x$x" != "xFOO=bar" ]; then 9448 echo 2 9449 return 1; 9450 fi 9451 FOO=foo 9452 return 0 9453 } 9454 b () { 9455 if [ x$FOO != xbar ]; then 9456 echo 3 9457 return 1 9458 fi 9459 x=$(env | grep FOO) 9460 if [ "x$x" != "xFOO=bar" ]; then 9461 echo 4 9462 return 1; 9463 fi 9464 FOO=foo 9465 return 0 9466 } 9467 FOO=bar k 9468 if [ $? != 0 ]; then 9469 exit 1 9470 fi 9471 if [ x$FOO != x ]; then 9472 exit 1 9473 fi 9474 FOO=bar b 9475 if [ $? != 0 ]; then 9476 exit 1 9477 fi 9478 if [ x$FOO != xfoo ]; then 9479 exit 1 9480 fi 9481 FOO=barbar 9482 FOO=bar k 9483 if [ $? != 0 ]; then 9484 exit 1 9485 fi 9486 if [ x$FOO != xbarbar ]; then 9487 exit 1 9488 fi 9489 FOO=bar b 9490 if [ $? != 0 ]; then 9491 exit 1 9492 fi 9493 if [ x$FOO != xfoo ]; then 9494 exit 1 9495 fi 9496--- 9497name: fd-cloexec-1 9498description: 9499 Verify that file descriptors > 2 are private for Korn shells 9500 AT&T ksh93 does this still, which means we must keep it as well 9501category: shell:legacy-no 9502file-setup: file 644 "test.sh" 9503 echo >&3 Fowl 9504stdin: 9505 exec 3>&1 9506 "$__progname" test.sh 9507expected-exit: e != 0 9508expected-stderr-pattern: 9509 /bad file descriptor/ 9510--- 9511name: fd-cloexec-2 9512description: 9513 Verify that file descriptors > 2 are not private for POSIX shells 9514 See Debian Bug #154540, Closes: #499139 9515file-setup: file 644 "test.sh" 9516 echo >&3 Fowl 9517stdin: 9518 test -n "$POSH_VERSION" || set -o sh 9519 exec 3>&1 9520 "$__progname" test.sh 9521expected-stdout: 9522 Fowl 9523--- 9524name: fd-cloexec-3 9525description: 9526 Verify that file descriptors > 2 are not private for LEGACY KSH 9527category: shell:legacy-yes 9528file-setup: file 644 "test.sh" 9529 echo >&3 Fowl 9530stdin: 9531 exec 3>&1 9532 "$__progname" test.sh 9533expected-stdout: 9534 Fowl 9535--- 9536name: comsub-1a 9537description: 9538 COMSUB are now parsed recursively, so this works 9539 see also regression-6: matching parenthesēs bug 9540 Fails on: pdksh bash2 bash3 zsh 9541 Passes on: bash4 ksh93 mksh(20110313+) 9542stdin: 9543 echo 1 $(case 1 in (1) echo yes;; (2) echo no;; esac) . 9544 echo 2 $(case 1 in 1) echo yes;; 2) echo no;; esac) . 9545 TEST=1234; echo 3 ${TEST: $(case 1 in (1) echo 1;; (*) echo 2;; esac)} . 9546 TEST=5678; echo 4 ${TEST: $(case 1 in 1) echo 1;; *) echo 2;; esac)} . 9547 a=($(case 1 in (1) echo 1;; (*) echo 2;; esac)); echo 5 ${a[0]} . 9548 a=($(case 1 in 1) echo 1;; *) echo 2;; esac)); echo 6 ${a[0]} . 9549expected-stdout: 9550 1 yes . 9551 2 yes . 9552 3 234 . 9553 4 678 . 9554 5 1 . 9555 6 1 . 9556--- 9557name: comsub-1b 9558description: 9559 COMSUB are now parsed recursively, so this works 9560 Fails on: pdksh bash2 bash3 bash4 zsh 9561 Passes on: ksh93 mksh(20110313+) 9562stdin: 9563 echo 1 $(($(case 1 in (1) echo 1;; (*) echo 2;; esac)+10)) . 9564 echo 2 $(($(case 1 in 1) echo 1;; *) echo 2;; esac)+20)) . 9565 (( a = $(case 1 in (1) echo 1;; (*) echo 2;; esac) )); echo 3 $a . 9566 (( a = $(case 1 in 1) echo 1;; *) echo 2;; esac) )); echo 4 $a . 9567 a=($(($(case 1 in (1) echo 1;; (*) echo 2;; esac)+10))); echo 5 ${a[0]} . 9568 a=($(($(case 1 in 1) echo 1;; *) echo 2;; esac)+20))); echo 6 ${a[0]} . 9569expected-stdout: 9570 1 11 . 9571 2 21 . 9572 3 1 . 9573 4 1 . 9574 5 11 . 9575 6 21 . 9576--- 9577name: comsub-2 9578description: 9579 RedHat BZ#496791 – another case of missing recursion 9580 in parsing COMSUB expressions 9581 Fails on: pdksh bash2 bash3¹ bash4¹ zsh 9582 Passes on: ksh93 mksh(20110305+) 9583 ① bash[34] seem to choke on comment ending with backslash-newline 9584stdin: 9585 # a comment with " ' \ 9586 x=$( 9587 echo yes 9588 # a comment with " ' \ 9589 ) 9590 echo $x 9591expected-stdout: 9592 yes 9593--- 9594name: comsub-3 9595description: 9596 Extended test for COMSUB explaining why a recursive parser 9597 is a must (a non-recursive parser cannot pass all three of 9598 these test cases, especially the ‘#’ is difficult) 9599stdin: 9600 print '#!'"$__progname"'\necho 1234' >id; chmod +x id; PATH=.:$PATH 9601 echo $(typeset -i10 x=16#20; echo $x) 9602 echo $(typeset -Uui16 x=16#$(id -u) 9603 ) . 9604 echo $(c=1; d=1 9605 typeset -Uui16 a=36#foo; c=2 9606 typeset -Uui16 b=36 #foo; d=2 9607 echo $a $b $c $d) 9608expected-stdout: 9609 32 9610 . 9611 16#4F68 16#24 2 1 9612--- 9613name: comsub-4 9614description: 9615 Check the tree dump functions for !MKSH_SMALL functionality 9616category: !smksh 9617stdin: 9618 x() { case $1 in u) echo x ;;& *) echo $1 ;; esac; } 9619 typeset -f x 9620expected-stdout: 9621 x() { 9622 case $1 in 9623 (u) 9624 echo x 9625 ;| 9626 (*) 9627 echo $1 9628 ;; 9629 esac 9630 } 9631--- 9632name: comsub-5 9633description: 9634 Check COMSUB works with aliases (does not expand them twice) 9635stdin: 9636 print '#!'"$__progname"'\nfor x in "$@"; do print -r -- "$x"; done' >pfn 9637 chmod +x pfn 9638 alias echo='echo a' 9639 foo() { 9640 ./pfn "$(echo foo)" 9641 } 9642 ./pfn "$(echo b)" 9643 typeset -f foo 9644expected-stdout: 9645 a b 9646 foo() { 9647 ./pfn "$(echo foo )" 9648 } 9649--- 9650name: comsub-torture 9651description: 9652 Check the tree dump functions work correctly 9653stdin: 9654 if [[ -z $__progname ]]; then echo >&2 call me with __progname; exit 1; fi 9655 while IFS= read -r line; do 9656 if [[ $line = '#1' ]]; then 9657 lastf=0 9658 continue 9659 elif [[ $line = EOFN* ]]; then 9660 fbody=$fbody$'\n'$line 9661 continue 9662 elif [[ $line != '#'* ]]; then 9663 fbody=$fbody$'\n\t'$line 9664 continue 9665 fi 9666 if (( lastf )); then 9667 x="inline_${nextf}() {"$fbody$'\n}\n' 9668 print -nr -- "$x" 9669 print -r -- "${x}typeset -f inline_$nextf" | "$__progname" 9670 x="function comsub_$nextf { x=\$("$fbody$'\n); }\n' 9671 print -nr -- "$x" 9672 print -r -- "${x}typeset -f comsub_$nextf" | "$__progname" 9673 x="function reread_$nextf { x=\$(("$fbody$'\n)|tr u x); }\n' 9674 print -nr -- "$x" 9675 print -r -- "${x}typeset -f reread_$nextf" | "$__progname" 9676 fi 9677 lastf=1 9678 fbody= 9679 nextf=${line#?} 9680 done <<'EOD' 9681 #1 9682 #TCOM 9683 vara=1 varb='2 3' cmd arg1 $arg2 "$arg3 4" 9684 #TPAREN_TPIPE_TLIST 9685 (echo $foo | tr -dc 0-9; echo) 9686 #TAND_TOR 9687 cmd && echo ja || echo nein 9688 #TSELECT 9689 select file in *; do echo "<$file>" ; break ; done 9690 #TFOR_TTIME 9691 time for i in {1,2,3} ; do echo $i ; done 9692 #TCASE 9693 case $foo in 1) echo eins;& 2) echo zwei ;| *) echo kann net bis drei zählen;; esac 9694 #TIF_TBANG_TDBRACKET_TELIF 9695 if ! [[ 1 = 1 ]] ; then echo eins; elif [[ 1 = 2 ]]; then echo zwei ;else echo drei; fi 9696 #TWHILE 9697 i=1; while (( i < 10 )); do echo $i; let ++i; done 9698 #TUNTIL 9699 i=10; until (( !--i )) ; do echo $i; done 9700 #TCOPROC 9701 cat * |& ls 9702 #TFUNCT_TBRACE_TASYNC 9703 function korn { echo eins; echo zwei ; } 9704 bourne () { logger * & } 9705 #IOREAD_IOCAT 9706 tr x u 0<foo >>bar 9707 #IOWRITE_IOCLOB_IOHERE_noIOSKIP 9708 cat >|bar <<'EOFN' 9709 foo 9710 EOFN 9711 #IOWRITE_noIOCLOB_IOHERE_IOSKIP 9712 cat 1>bar <<-EOFI 9713 foo 9714 EOFI 9715 #IORDWR_IODUP 9716 sh 1<>/dev/console 0<&1 2>&1 9717 #COMSUB_EXPRSUB_FUNSUB_VALSUB 9718 echo $(true) $((1+ 2)) ${ :;} ${| REPLY=x;} 9719 #QCHAR_OQUOTE_CQUOTE 9720 echo fo\ob\"a\`r\'b\$az 9721 echo "fo\ob\"a\`r\'b\$az" 9722 echo 'fo\ob\"a\`r'\''b\$az' 9723 #OSUBST_CSUBST_OPAT_SPAT_CPAT 9724 [[ ${foo#bl\(u\)b} = @(bar|baz) ]] 9725 #heredoc_closed 9726 x=$(cat <<EOFN 9727 note there must be no space between EOFN and ) 9728 EOFN); echo $x 9729 #heredoc_space 9730 x=$(cat <<EOFN\ 9731 note the space between EOFN and ) is actually part of the here document marker 9732 EOFN ); echo $x 9733 #patch_motd 9734 x=$(sysctl -n kern.version | sed 1q) 9735 [[ -s /etc/motd && "$([[ "$(head -1 /etc/motd)" != $x ]] && \ 9736 ed -s /etc/motd 2>&1 <<-EOF 9737 1,/^\$/d 9738 0a 9739 $x 9740 9741 . 9742 wq 9743 EOF)" = @(?) ]] && rm -f /etc/motd 9744 if [[ ! -s /etc/motd ]]; then 9745 install -c -o root -g wheel -m 664 /dev/null /etc/motd 9746 print -- "$x\n" >/etc/motd 9747 fi 9748 #wdarrassign 9749 case x in 9750 x) a+=b; c+=(d e) 9751 esac 9752 #0 9753 EOD 9754expected-stdout: 9755 inline_TCOM() { 9756 vara=1 varb='2 3' cmd arg1 $arg2 "$arg3 4" 9757 } 9758 inline_TCOM() { 9759 vara=1 varb="2 3" cmd arg1 $arg2 "$arg3 4" 9760 } 9761 function comsub_TCOM { x=$( 9762 vara=1 varb='2 3' cmd arg1 $arg2 "$arg3 4" 9763 ); } 9764 function comsub_TCOM { 9765 x=$(vara=1 varb="2 3" cmd arg1 $arg2 "$arg3 4" ) 9766 } 9767 function reread_TCOM { x=$(( 9768 vara=1 varb='2 3' cmd arg1 $arg2 "$arg3 4" 9769 )|tr u x); } 9770 function reread_TCOM { 9771 x=$(( vara=1 varb="2 3" cmd arg1 $arg2 "$arg3 4" ) | tr u x ) 9772 } 9773 inline_TPAREN_TPIPE_TLIST() { 9774 (echo $foo | tr -dc 0-9; echo) 9775 } 9776 inline_TPAREN_TPIPE_TLIST() { 9777 ( echo $foo | tr -dc 0-9 9778 echo ) 9779 } 9780 function comsub_TPAREN_TPIPE_TLIST { x=$( 9781 (echo $foo | tr -dc 0-9; echo) 9782 ); } 9783 function comsub_TPAREN_TPIPE_TLIST { 9784 x=$(( echo $foo | tr -dc 0-9 ; echo ) ) 9785 } 9786 function reread_TPAREN_TPIPE_TLIST { x=$(( 9787 (echo $foo | tr -dc 0-9; echo) 9788 )|tr u x); } 9789 function reread_TPAREN_TPIPE_TLIST { 9790 x=$(( ( echo $foo | tr -dc 0-9 ; echo ) ) | tr u x ) 9791 } 9792 inline_TAND_TOR() { 9793 cmd && echo ja || echo nein 9794 } 9795 inline_TAND_TOR() { 9796 cmd && echo ja || echo nein 9797 } 9798 function comsub_TAND_TOR { x=$( 9799 cmd && echo ja || echo nein 9800 ); } 9801 function comsub_TAND_TOR { 9802 x=$(cmd && echo ja || echo nein ) 9803 } 9804 function reread_TAND_TOR { x=$(( 9805 cmd && echo ja || echo nein 9806 )|tr u x); } 9807 function reread_TAND_TOR { 9808 x=$(( cmd && echo ja || echo nein ) | tr u x ) 9809 } 9810 inline_TSELECT() { 9811 select file in *; do echo "<$file>" ; break ; done 9812 } 9813 inline_TSELECT() { 9814 select file in * 9815 do 9816 echo "<$file>" 9817 break 9818 done 9819 } 9820 function comsub_TSELECT { x=$( 9821 select file in *; do echo "<$file>" ; break ; done 9822 ); } 9823 function comsub_TSELECT { 9824 x=$(select file in * ; do echo "<$file>" ; break ; done ) 9825 } 9826 function reread_TSELECT { x=$(( 9827 select file in *; do echo "<$file>" ; break ; done 9828 )|tr u x); } 9829 function reread_TSELECT { 9830 x=$(( select file in * ; do echo "<$file>" ; break ; done ) | tr u x ) 9831 } 9832 inline_TFOR_TTIME() { 9833 time for i in {1,2,3} ; do echo $i ; done 9834 } 9835 inline_TFOR_TTIME() { 9836 time for i in {1,2,3} 9837 do 9838 echo $i 9839 done 9840 } 9841 function comsub_TFOR_TTIME { x=$( 9842 time for i in {1,2,3} ; do echo $i ; done 9843 ); } 9844 function comsub_TFOR_TTIME { 9845 x=$(time for i in {1,2,3} ; do echo $i ; done ) 9846 } 9847 function reread_TFOR_TTIME { x=$(( 9848 time for i in {1,2,3} ; do echo $i ; done 9849 )|tr u x); } 9850 function reread_TFOR_TTIME { 9851 x=$(( time for i in {1,2,3} ; do echo $i ; done ) | tr u x ) 9852 } 9853 inline_TCASE() { 9854 case $foo in 1) echo eins;& 2) echo zwei ;| *) echo kann net bis drei zählen;; esac 9855 } 9856 inline_TCASE() { 9857 case $foo in 9858 (1) 9859 echo eins 9860 ;& 9861 (2) 9862 echo zwei 9863 ;| 9864 (*) 9865 echo kann net bis drei zählen 9866 ;; 9867 esac 9868 } 9869 function comsub_TCASE { x=$( 9870 case $foo in 1) echo eins;& 2) echo zwei ;| *) echo kann net bis drei zählen;; esac 9871 ); } 9872 function comsub_TCASE { 9873 x=$(case $foo in (1) echo eins ;& (2) echo zwei ;| (*) echo kann net bis drei zählen ;; esac ) 9874 } 9875 function reread_TCASE { x=$(( 9876 case $foo in 1) echo eins;& 2) echo zwei ;| *) echo kann net bis drei zählen;; esac 9877 )|tr u x); } 9878 function reread_TCASE { 9879 x=$(( case $foo in (1) echo eins ;& (2) echo zwei ;| (*) echo kann net bis drei zählen ;; esac ) | tr u x ) 9880 } 9881 inline_TIF_TBANG_TDBRACKET_TELIF() { 9882 if ! [[ 1 = 1 ]] ; then echo eins; elif [[ 1 = 2 ]]; then echo zwei ;else echo drei; fi 9883 } 9884 inline_TIF_TBANG_TDBRACKET_TELIF() { 9885 if ! [[ 1 = 1 ]] 9886 then 9887 echo eins 9888 elif [[ 1 = 2 ]] 9889 then 9890 echo zwei 9891 else 9892 echo drei 9893 fi 9894 } 9895 function comsub_TIF_TBANG_TDBRACKET_TELIF { x=$( 9896 if ! [[ 1 = 1 ]] ; then echo eins; elif [[ 1 = 2 ]]; then echo zwei ;else echo drei; fi 9897 ); } 9898 function comsub_TIF_TBANG_TDBRACKET_TELIF { 9899 x=$(if ! [[ 1 = 1 ]] ; then echo eins ; elif [[ 1 = 2 ]] ; then echo zwei ; else echo drei ; fi ) 9900 } 9901 function reread_TIF_TBANG_TDBRACKET_TELIF { x=$(( 9902 if ! [[ 1 = 1 ]] ; then echo eins; elif [[ 1 = 2 ]]; then echo zwei ;else echo drei; fi 9903 )|tr u x); } 9904 function reread_TIF_TBANG_TDBRACKET_TELIF { 9905 x=$(( if ! [[ 1 = 1 ]] ; then echo eins ; elif [[ 1 = 2 ]] ; then echo zwei ; else echo drei ; fi ) | tr u x ) 9906 } 9907 inline_TWHILE() { 9908 i=1; while (( i < 10 )); do echo $i; let ++i; done 9909 } 9910 inline_TWHILE() { 9911 i=1 9912 while let] " i < 10 " 9913 do 9914 echo $i 9915 let ++i 9916 done 9917 } 9918 function comsub_TWHILE { x=$( 9919 i=1; while (( i < 10 )); do echo $i; let ++i; done 9920 ); } 9921 function comsub_TWHILE { 9922 x=$(i=1 ; while let] " i < 10 " ; do echo $i ; let ++i ; done ) 9923 } 9924 function reread_TWHILE { x=$(( 9925 i=1; while (( i < 10 )); do echo $i; let ++i; done 9926 )|tr u x); } 9927 function reread_TWHILE { 9928 x=$(( i=1 ; while let] " i < 10 " ; do echo $i ; let ++i ; done ) | tr u x ) 9929 } 9930 inline_TUNTIL() { 9931 i=10; until (( !--i )) ; do echo $i; done 9932 } 9933 inline_TUNTIL() { 9934 i=10 9935 until let] " !--i " 9936 do 9937 echo $i 9938 done 9939 } 9940 function comsub_TUNTIL { x=$( 9941 i=10; until (( !--i )) ; do echo $i; done 9942 ); } 9943 function comsub_TUNTIL { 9944 x=$(i=10 ; until let] " !--i " ; do echo $i ; done ) 9945 } 9946 function reread_TUNTIL { x=$(( 9947 i=10; until (( !--i )) ; do echo $i; done 9948 )|tr u x); } 9949 function reread_TUNTIL { 9950 x=$(( i=10 ; until let] " !--i " ; do echo $i ; done ) | tr u x ) 9951 } 9952 inline_TCOPROC() { 9953 cat * |& ls 9954 } 9955 inline_TCOPROC() { 9956 cat * |& 9957 ls 9958 } 9959 function comsub_TCOPROC { x=$( 9960 cat * |& ls 9961 ); } 9962 function comsub_TCOPROC { 9963 x=$(cat * |& ls ) 9964 } 9965 function reread_TCOPROC { x=$(( 9966 cat * |& ls 9967 )|tr u x); } 9968 function reread_TCOPROC { 9969 x=$(( cat * |& ls ) | tr u x ) 9970 } 9971 inline_TFUNCT_TBRACE_TASYNC() { 9972 function korn { echo eins; echo zwei ; } 9973 bourne () { logger * & } 9974 } 9975 inline_TFUNCT_TBRACE_TASYNC() { 9976 function korn { 9977 echo eins 9978 echo zwei 9979 } 9980 bourne() { 9981 logger * & 9982 } 9983 } 9984 function comsub_TFUNCT_TBRACE_TASYNC { x=$( 9985 function korn { echo eins; echo zwei ; } 9986 bourne () { logger * & } 9987 ); } 9988 function comsub_TFUNCT_TBRACE_TASYNC { 9989 x=$(function korn { echo eins ; echo zwei ; } ; bourne() { logger * & } ) 9990 } 9991 function reread_TFUNCT_TBRACE_TASYNC { x=$(( 9992 function korn { echo eins; echo zwei ; } 9993 bourne () { logger * & } 9994 )|tr u x); } 9995 function reread_TFUNCT_TBRACE_TASYNC { 9996 x=$(( function korn { echo eins ; echo zwei ; } ; bourne() { logger * & } ) | tr u x ) 9997 } 9998 inline_IOREAD_IOCAT() { 9999 tr x u 0<foo >>bar 10000 } 10001 inline_IOREAD_IOCAT() { 10002 tr x u <foo >>bar 10003 } 10004 function comsub_IOREAD_IOCAT { x=$( 10005 tr x u 0<foo >>bar 10006 ); } 10007 function comsub_IOREAD_IOCAT { 10008 x=$(tr x u <foo >>bar ) 10009 } 10010 function reread_IOREAD_IOCAT { x=$(( 10011 tr x u 0<foo >>bar 10012 )|tr u x); } 10013 function reread_IOREAD_IOCAT { 10014 x=$(( tr x u <foo >>bar ) | tr u x ) 10015 } 10016 inline_IOWRITE_IOCLOB_IOHERE_noIOSKIP() { 10017 cat >|bar <<'EOFN' 10018 foo 10019 EOFN 10020 } 10021 inline_IOWRITE_IOCLOB_IOHERE_noIOSKIP() { 10022 cat >|bar <<"EOFN" 10023 foo 10024 EOFN 10025 10026 } 10027 function comsub_IOWRITE_IOCLOB_IOHERE_noIOSKIP { x=$( 10028 cat >|bar <<'EOFN' 10029 foo 10030 EOFN 10031 ); } 10032 function comsub_IOWRITE_IOCLOB_IOHERE_noIOSKIP { 10033 x=$(cat >|bar <<"EOFN" 10034 foo 10035 EOFN 10036 ) 10037 } 10038 function reread_IOWRITE_IOCLOB_IOHERE_noIOSKIP { x=$(( 10039 cat >|bar <<'EOFN' 10040 foo 10041 EOFN 10042 )|tr u x); } 10043 function reread_IOWRITE_IOCLOB_IOHERE_noIOSKIP { 10044 x=$(( cat >|bar <<"EOFN" 10045 foo 10046 EOFN 10047 ) | tr u x ) 10048 } 10049 inline_IOWRITE_noIOCLOB_IOHERE_IOSKIP() { 10050 cat 1>bar <<-EOFI 10051 foo 10052 EOFI 10053 } 10054 inline_IOWRITE_noIOCLOB_IOHERE_IOSKIP() { 10055 cat >bar <<-EOFI 10056 foo 10057 EOFI 10058 10059 } 10060 function comsub_IOWRITE_noIOCLOB_IOHERE_IOSKIP { x=$( 10061 cat 1>bar <<-EOFI 10062 foo 10063 EOFI 10064 ); } 10065 function comsub_IOWRITE_noIOCLOB_IOHERE_IOSKIP { 10066 x=$(cat >bar <<-EOFI 10067 foo 10068 EOFI 10069 ) 10070 } 10071 function reread_IOWRITE_noIOCLOB_IOHERE_IOSKIP { x=$(( 10072 cat 1>bar <<-EOFI 10073 foo 10074 EOFI 10075 )|tr u x); } 10076 function reread_IOWRITE_noIOCLOB_IOHERE_IOSKIP { 10077 x=$(( cat >bar <<-EOFI 10078 foo 10079 EOFI 10080 ) | tr u x ) 10081 } 10082 inline_IORDWR_IODUP() { 10083 sh 1<>/dev/console 0<&1 2>&1 10084 } 10085 inline_IORDWR_IODUP() { 10086 sh 1<>/dev/console <&1 2>&1 10087 } 10088 function comsub_IORDWR_IODUP { x=$( 10089 sh 1<>/dev/console 0<&1 2>&1 10090 ); } 10091 function comsub_IORDWR_IODUP { 10092 x=$(sh 1<>/dev/console <&1 2>&1 ) 10093 } 10094 function reread_IORDWR_IODUP { x=$(( 10095 sh 1<>/dev/console 0<&1 2>&1 10096 )|tr u x); } 10097 function reread_IORDWR_IODUP { 10098 x=$(( sh 1<>/dev/console <&1 2>&1 ) | tr u x ) 10099 } 10100 inline_COMSUB_EXPRSUB_FUNSUB_VALSUB() { 10101 echo $(true) $((1+ 2)) ${ :;} ${| REPLY=x;} 10102 } 10103 inline_COMSUB_EXPRSUB_FUNSUB_VALSUB() { 10104 echo $(true ) $((1+ 2)) ${ : ;} ${|REPLY=x ;} 10105 } 10106 function comsub_COMSUB_EXPRSUB_FUNSUB_VALSUB { x=$( 10107 echo $(true) $((1+ 2)) ${ :;} ${| REPLY=x;} 10108 ); } 10109 function comsub_COMSUB_EXPRSUB_FUNSUB_VALSUB { 10110 x=$(echo $(true ) $((1+ 2)) ${ : ;} ${|REPLY=x ;} ) 10111 } 10112 function reread_COMSUB_EXPRSUB_FUNSUB_VALSUB { x=$(( 10113 echo $(true) $((1+ 2)) ${ :;} ${| REPLY=x;} 10114 )|tr u x); } 10115 function reread_COMSUB_EXPRSUB_FUNSUB_VALSUB { 10116 x=$(( echo $(true ) $((1+ 2)) ${ : ;} ${|REPLY=x ;} ) | tr u x ) 10117 } 10118 inline_QCHAR_OQUOTE_CQUOTE() { 10119 echo fo\ob\"a\`r\'b\$az 10120 echo "fo\ob\"a\`r\'b\$az" 10121 echo 'fo\ob\"a\`r'\''b\$az' 10122 } 10123 inline_QCHAR_OQUOTE_CQUOTE() { 10124 echo fo\ob\"a\`r\'b\$az 10125 echo "fo\ob\"a\`r\'b\$az" 10126 echo "fo\\ob\\\"a\\\`r"\'"b\\\$az" 10127 } 10128 function comsub_QCHAR_OQUOTE_CQUOTE { x=$( 10129 echo fo\ob\"a\`r\'b\$az 10130 echo "fo\ob\"a\`r\'b\$az" 10131 echo 'fo\ob\"a\`r'\''b\$az' 10132 ); } 10133 function comsub_QCHAR_OQUOTE_CQUOTE { 10134 x=$(echo fo\ob\"a\`r\'b\$az ; echo "fo\ob\"a\`r\'b\$az" ; echo "fo\\ob\\\"a\\\`r"\'"b\\\$az" ) 10135 } 10136 function reread_QCHAR_OQUOTE_CQUOTE { x=$(( 10137 echo fo\ob\"a\`r\'b\$az 10138 echo "fo\ob\"a\`r\'b\$az" 10139 echo 'fo\ob\"a\`r'\''b\$az' 10140 )|tr u x); } 10141 function reread_QCHAR_OQUOTE_CQUOTE { 10142 x=$(( echo fo\ob\"a\`r\'b\$az ; echo "fo\ob\"a\`r\'b\$az" ; echo "fo\\ob\\\"a\\\`r"\'"b\\\$az" ) | tr u x ) 10143 } 10144 inline_OSUBST_CSUBST_OPAT_SPAT_CPAT() { 10145 [[ ${foo#bl\(u\)b} = @(bar|baz) ]] 10146 } 10147 inline_OSUBST_CSUBST_OPAT_SPAT_CPAT() { 10148 [[ ${foo#bl\(u\)b} = @(bar|baz) ]] 10149 } 10150 function comsub_OSUBST_CSUBST_OPAT_SPAT_CPAT { x=$( 10151 [[ ${foo#bl\(u\)b} = @(bar|baz) ]] 10152 ); } 10153 function comsub_OSUBST_CSUBST_OPAT_SPAT_CPAT { 10154 x=$([[ ${foo#bl\(u\)b} = @(bar|baz) ]] ) 10155 } 10156 function reread_OSUBST_CSUBST_OPAT_SPAT_CPAT { x=$(( 10157 [[ ${foo#bl\(u\)b} = @(bar|baz) ]] 10158 )|tr u x); } 10159 function reread_OSUBST_CSUBST_OPAT_SPAT_CPAT { 10160 x=$(( [[ ${foo#bl\(u\)b} = @(bar|baz) ]] ) | tr u x ) 10161 } 10162 inline_heredoc_closed() { 10163 x=$(cat <<EOFN 10164 note there must be no space between EOFN and ) 10165 EOFN); echo $x 10166 } 10167 inline_heredoc_closed() { 10168 x=$(cat <<EOFN 10169 note there must be no space between EOFN and ) 10170 EOFN 10171 ) 10172 echo $x 10173 } 10174 function comsub_heredoc_closed { x=$( 10175 x=$(cat <<EOFN 10176 note there must be no space between EOFN and ) 10177 EOFN); echo $x 10178 ); } 10179 function comsub_heredoc_closed { 10180 x=$(x=$(cat <<EOFN 10181 note there must be no space between EOFN and ) 10182 EOFN 10183 ) ; echo $x ) 10184 } 10185 function reread_heredoc_closed { x=$(( 10186 x=$(cat <<EOFN 10187 note there must be no space between EOFN and ) 10188 EOFN); echo $x 10189 )|tr u x); } 10190 function reread_heredoc_closed { 10191 x=$(( x=$(cat <<EOFN 10192 note there must be no space between EOFN and ) 10193 EOFN 10194 ) ; echo $x ) | tr u x ) 10195 } 10196 inline_heredoc_space() { 10197 x=$(cat <<EOFN\ 10198 note the space between EOFN and ) is actually part of the here document marker 10199 EOFN ); echo $x 10200 } 10201 inline_heredoc_space() { 10202 x=$(cat <<EOFN\ 10203 note the space between EOFN and ) is actually part of the here document marker 10204 EOFN 10205 ) 10206 echo $x 10207 } 10208 function comsub_heredoc_space { x=$( 10209 x=$(cat <<EOFN\ 10210 note the space between EOFN and ) is actually part of the here document marker 10211 EOFN ); echo $x 10212 ); } 10213 function comsub_heredoc_space { 10214 x=$(x=$(cat <<EOFN\ 10215 note the space between EOFN and ) is actually part of the here document marker 10216 EOFN 10217 ) ; echo $x ) 10218 } 10219 function reread_heredoc_space { x=$(( 10220 x=$(cat <<EOFN\ 10221 note the space between EOFN and ) is actually part of the here document marker 10222 EOFN ); echo $x 10223 )|tr u x); } 10224 function reread_heredoc_space { 10225 x=$(( x=$(cat <<EOFN\ 10226 note the space between EOFN and ) is actually part of the here document marker 10227 EOFN 10228 ) ; echo $x ) | tr u x ) 10229 } 10230 inline_patch_motd() { 10231 x=$(sysctl -n kern.version | sed 1q) 10232 [[ -s /etc/motd && "$([[ "$(head -1 /etc/motd)" != $x ]] && \ 10233 ed -s /etc/motd 2>&1 <<-EOF 10234 1,/^\$/d 10235 0a 10236 $x 10237 10238 . 10239 wq 10240 EOF)" = @(?) ]] && rm -f /etc/motd 10241 if [[ ! -s /etc/motd ]]; then 10242 install -c -o root -g wheel -m 664 /dev/null /etc/motd 10243 print -- "$x\n" >/etc/motd 10244 fi 10245 } 10246 inline_patch_motd() { 10247 x=$(sysctl -n kern.version | sed 1q ) 10248 [[ -s /etc/motd && "$([[ "$(head -1 /etc/motd )" != $x ]] && ed -s /etc/motd 2>&1 <<-EOF 10249 1,/^\$/d 10250 0a 10251 $x 10252 10253 . 10254 wq 10255 EOF 10256 )" = @(?) ]] && rm -f /etc/motd 10257 if [[ ! -s /etc/motd ]] 10258 then 10259 install -c -o root -g wheel -m 664 /dev/null /etc/motd 10260 print -- "$x\n" >/etc/motd 10261 fi 10262 } 10263 function comsub_patch_motd { x=$( 10264 x=$(sysctl -n kern.version | sed 1q) 10265 [[ -s /etc/motd && "$([[ "$(head -1 /etc/motd)" != $x ]] && \ 10266 ed -s /etc/motd 2>&1 <<-EOF 10267 1,/^\$/d 10268 0a 10269 $x 10270 10271 . 10272 wq 10273 EOF)" = @(?) ]] && rm -f /etc/motd 10274 if [[ ! -s /etc/motd ]]; then 10275 install -c -o root -g wheel -m 664 /dev/null /etc/motd 10276 print -- "$x\n" >/etc/motd 10277 fi 10278 ); } 10279 function comsub_patch_motd { 10280 x=$(x=$(sysctl -n kern.version | sed 1q ) ; [[ -s /etc/motd && "$([[ "$(head -1 /etc/motd )" != $x ]] && ed -s /etc/motd 2>&1 <<-EOF 10281 1,/^\$/d 10282 0a 10283 $x 10284 10285 . 10286 wq 10287 EOF 10288 )" = @(?) ]] && rm -f /etc/motd ; if [[ ! -s /etc/motd ]] ; then install -c -o root -g wheel -m 664 /dev/null /etc/motd ; print -- "$x\n" >/etc/motd ; fi ) 10289 } 10290 function reread_patch_motd { x=$(( 10291 x=$(sysctl -n kern.version | sed 1q) 10292 [[ -s /etc/motd && "$([[ "$(head -1 /etc/motd)" != $x ]] && \ 10293 ed -s /etc/motd 2>&1 <<-EOF 10294 1,/^\$/d 10295 0a 10296 $x 10297 10298 . 10299 wq 10300 EOF)" = @(?) ]] && rm -f /etc/motd 10301 if [[ ! -s /etc/motd ]]; then 10302 install -c -o root -g wheel -m 664 /dev/null /etc/motd 10303 print -- "$x\n" >/etc/motd 10304 fi 10305 )|tr u x); } 10306 function reread_patch_motd { 10307 x=$(( x=$(sysctl -n kern.version | sed 1q ) ; [[ -s /etc/motd && "$([[ "$(head -1 /etc/motd )" != $x ]] && ed -s /etc/motd 2>&1 <<-EOF 10308 1,/^\$/d 10309 0a 10310 $x 10311 10312 . 10313 wq 10314 EOF 10315 )" = @(?) ]] && rm -f /etc/motd ; if [[ ! -s /etc/motd ]] ; then install -c -o root -g wheel -m 664 /dev/null /etc/motd ; print -- "$x\n" >/etc/motd ; fi ) | tr u x ) 10316 } 10317 inline_wdarrassign() { 10318 case x in 10319 x) a+=b; c+=(d e) 10320 esac 10321 } 10322 inline_wdarrassign() { 10323 case x in 10324 (x) 10325 a+=b 10326 set -A c+ -- d e 10327 ;; 10328 esac 10329 } 10330 function comsub_wdarrassign { x=$( 10331 case x in 10332 x) a+=b; c+=(d e) 10333 esac 10334 ); } 10335 function comsub_wdarrassign { 10336 x=$(case x in (x) a+=b ; set -A c+ -- d e ;; esac ) 10337 } 10338 function reread_wdarrassign { x=$(( 10339 case x in 10340 x) a+=b; c+=(d e) 10341 esac 10342 )|tr u x); } 10343 function reread_wdarrassign { 10344 x=$(( case x in (x) a+=b ; set -A c+ -- d e ;; esac ) | tr u x ) 10345 } 10346--- 10347name: comsub-torture-io 10348description: 10349 Check the tree dump functions work correctly with I/O redirection 10350stdin: 10351 if [[ -z $__progname ]]; then echo >&2 call me with __progname; exit 1; fi 10352 while IFS= read -r line; do 10353 if [[ $line = '#1' ]]; then 10354 lastf=0 10355 continue 10356 elif [[ $line = EOFN* ]]; then 10357 fbody=$fbody$'\n'$line 10358 continue 10359 elif [[ $line != '#'* ]]; then 10360 fbody=$fbody$'\n\t'$line 10361 continue 10362 fi 10363 if (( lastf )); then 10364 x="inline_${nextf}() {"$fbody$'\n}\n' 10365 print -nr -- "$x" 10366 print -r -- "${x}typeset -f inline_$nextf" | "$__progname" 10367 x="function comsub_$nextf { x=\$("$fbody$'\n); }\n' 10368 print -nr -- "$x" 10369 print -r -- "${x}typeset -f comsub_$nextf" | "$__progname" 10370 x="function reread_$nextf { x=\$(("$fbody$'\n)|tr u x); }\n' 10371 print -nr -- "$x" 10372 print -r -- "${x}typeset -f reread_$nextf" | "$__progname" 10373 fi 10374 lastf=1 10375 fbody= 10376 nextf=${line#?} 10377 done <<'EOD' 10378 #1 10379 #TCOM 10380 vara=1 varb='2 3' cmd arg1 $arg2 "$arg3 4" >&3 10381 #TPAREN_TPIPE_TLIST 10382 (echo $foo | tr -dc 0-9 >&3; echo >&3) >&3 10383 #TAND_TOR 10384 cmd >&3 && >&3 echo ja || echo >&3 nein 10385 #TSELECT 10386 select file in *; do echo "<$file>" ; break >&3 ; done >&3 10387 #TFOR_TTIME 10388 for i in {1,2,3} ; do time >&3 echo $i ; done >&3 10389 #TCASE 10390 case $foo in 1) echo eins >&3;& 2) echo zwei >&3 ;| *) echo kann net bis drei zählen >&3;; esac >&3 10391 #TIF_TBANG_TDBRACKET_TELIF 10392 if ! [[ 1 = 1 ]] >&3 ; then echo eins; elif [[ 1 = 2 ]] >&3; then echo zwei ;else echo drei; fi >&3 10393 #TWHILE 10394 i=1; while (( i < 10 )) >&3; do echo $i; let ++i; done >&3 10395 #TUNTIL 10396 i=10; until (( !--i )) >&3 ; do echo $i; done >&3 10397 #TCOPROC 10398 cat * >&3 |& >&3 ls 10399 #TFUNCT_TBRACE_TASYNC 10400 function korn { echo eins; echo >&3 zwei ; } 10401 bourne () { logger * >&3 & } 10402 #COMSUB_EXPRSUB 10403 echo $(true >&3) $((1+ 2)) 10404 #0 10405 EOD 10406expected-stdout: 10407 inline_TCOM() { 10408 vara=1 varb='2 3' cmd arg1 $arg2 "$arg3 4" >&3 10409 } 10410 inline_TCOM() { 10411 vara=1 varb="2 3" cmd arg1 $arg2 "$arg3 4" >&3 10412 } 10413 function comsub_TCOM { x=$( 10414 vara=1 varb='2 3' cmd arg1 $arg2 "$arg3 4" >&3 10415 ); } 10416 function comsub_TCOM { 10417 x=$(vara=1 varb="2 3" cmd arg1 $arg2 "$arg3 4" >&3 ) 10418 } 10419 function reread_TCOM { x=$(( 10420 vara=1 varb='2 3' cmd arg1 $arg2 "$arg3 4" >&3 10421 )|tr u x); } 10422 function reread_TCOM { 10423 x=$(( vara=1 varb="2 3" cmd arg1 $arg2 "$arg3 4" >&3 ) | tr u x ) 10424 } 10425 inline_TPAREN_TPIPE_TLIST() { 10426 (echo $foo | tr -dc 0-9 >&3; echo >&3) >&3 10427 } 10428 inline_TPAREN_TPIPE_TLIST() { 10429 ( echo $foo | tr -dc 0-9 >&3 10430 echo >&3 ) >&3 10431 } 10432 function comsub_TPAREN_TPIPE_TLIST { x=$( 10433 (echo $foo | tr -dc 0-9 >&3; echo >&3) >&3 10434 ); } 10435 function comsub_TPAREN_TPIPE_TLIST { 10436 x=$(( echo $foo | tr -dc 0-9 >&3 ; echo >&3 ) >&3 ) 10437 } 10438 function reread_TPAREN_TPIPE_TLIST { x=$(( 10439 (echo $foo | tr -dc 0-9 >&3; echo >&3) >&3 10440 )|tr u x); } 10441 function reread_TPAREN_TPIPE_TLIST { 10442 x=$(( ( echo $foo | tr -dc 0-9 >&3 ; echo >&3 ) >&3 ) | tr u x ) 10443 } 10444 inline_TAND_TOR() { 10445 cmd >&3 && >&3 echo ja || echo >&3 nein 10446 } 10447 inline_TAND_TOR() { 10448 cmd >&3 && echo ja >&3 || echo nein >&3 10449 } 10450 function comsub_TAND_TOR { x=$( 10451 cmd >&3 && >&3 echo ja || echo >&3 nein 10452 ); } 10453 function comsub_TAND_TOR { 10454 x=$(cmd >&3 && echo ja >&3 || echo nein >&3 ) 10455 } 10456 function reread_TAND_TOR { x=$(( 10457 cmd >&3 && >&3 echo ja || echo >&3 nein 10458 )|tr u x); } 10459 function reread_TAND_TOR { 10460 x=$(( cmd >&3 && echo ja >&3 || echo nein >&3 ) | tr u x ) 10461 } 10462 inline_TSELECT() { 10463 select file in *; do echo "<$file>" ; break >&3 ; done >&3 10464 } 10465 inline_TSELECT() { 10466 select file in * 10467 do 10468 echo "<$file>" 10469 break >&3 10470 done >&3 10471 } 10472 function comsub_TSELECT { x=$( 10473 select file in *; do echo "<$file>" ; break >&3 ; done >&3 10474 ); } 10475 function comsub_TSELECT { 10476 x=$(select file in * ; do echo "<$file>" ; break >&3 ; done >&3 ) 10477 } 10478 function reread_TSELECT { x=$(( 10479 select file in *; do echo "<$file>" ; break >&3 ; done >&3 10480 )|tr u x); } 10481 function reread_TSELECT { 10482 x=$(( select file in * ; do echo "<$file>" ; break >&3 ; done >&3 ) | tr u x ) 10483 } 10484 inline_TFOR_TTIME() { 10485 for i in {1,2,3} ; do time >&3 echo $i ; done >&3 10486 } 10487 inline_TFOR_TTIME() { 10488 for i in {1,2,3} 10489 do 10490 time echo $i >&3 10491 done >&3 10492 } 10493 function comsub_TFOR_TTIME { x=$( 10494 for i in {1,2,3} ; do time >&3 echo $i ; done >&3 10495 ); } 10496 function comsub_TFOR_TTIME { 10497 x=$(for i in {1,2,3} ; do time echo $i >&3 ; done >&3 ) 10498 } 10499 function reread_TFOR_TTIME { x=$(( 10500 for i in {1,2,3} ; do time >&3 echo $i ; done >&3 10501 )|tr u x); } 10502 function reread_TFOR_TTIME { 10503 x=$(( for i in {1,2,3} ; do time echo $i >&3 ; done >&3 ) | tr u x ) 10504 } 10505 inline_TCASE() { 10506 case $foo in 1) echo eins >&3;& 2) echo zwei >&3 ;| *) echo kann net bis drei zählen >&3;; esac >&3 10507 } 10508 inline_TCASE() { 10509 case $foo in 10510 (1) 10511 echo eins >&3 10512 ;& 10513 (2) 10514 echo zwei >&3 10515 ;| 10516 (*) 10517 echo kann net bis drei zählen >&3 10518 ;; 10519 esac >&3 10520 } 10521 function comsub_TCASE { x=$( 10522 case $foo in 1) echo eins >&3;& 2) echo zwei >&3 ;| *) echo kann net bis drei zählen >&3;; esac >&3 10523 ); } 10524 function comsub_TCASE { 10525 x=$(case $foo in (1) echo eins >&3 ;& (2) echo zwei >&3 ;| (*) echo kann net bis drei zählen >&3 ;; esac >&3 ) 10526 } 10527 function reread_TCASE { x=$(( 10528 case $foo in 1) echo eins >&3;& 2) echo zwei >&3 ;| *) echo kann net bis drei zählen >&3;; esac >&3 10529 )|tr u x); } 10530 function reread_TCASE { 10531 x=$(( case $foo in (1) echo eins >&3 ;& (2) echo zwei >&3 ;| (*) echo kann net bis drei zählen >&3 ;; esac >&3 ) | tr u x ) 10532 } 10533 inline_TIF_TBANG_TDBRACKET_TELIF() { 10534 if ! [[ 1 = 1 ]] >&3 ; then echo eins; elif [[ 1 = 2 ]] >&3; then echo zwei ;else echo drei; fi >&3 10535 } 10536 inline_TIF_TBANG_TDBRACKET_TELIF() { 10537 if ! [[ 1 = 1 ]] >&3 10538 then 10539 echo eins 10540 elif [[ 1 = 2 ]] >&3 10541 then 10542 echo zwei 10543 else 10544 echo drei 10545 fi >&3 10546 } 10547 function comsub_TIF_TBANG_TDBRACKET_TELIF { x=$( 10548 if ! [[ 1 = 1 ]] >&3 ; then echo eins; elif [[ 1 = 2 ]] >&3; then echo zwei ;else echo drei; fi >&3 10549 ); } 10550 function comsub_TIF_TBANG_TDBRACKET_TELIF { 10551 x=$(if ! [[ 1 = 1 ]] >&3 ; then echo eins ; elif [[ 1 = 2 ]] >&3 ; then echo zwei ; else echo drei ; fi >&3 ) 10552 } 10553 function reread_TIF_TBANG_TDBRACKET_TELIF { x=$(( 10554 if ! [[ 1 = 1 ]] >&3 ; then echo eins; elif [[ 1 = 2 ]] >&3; then echo zwei ;else echo drei; fi >&3 10555 )|tr u x); } 10556 function reread_TIF_TBANG_TDBRACKET_TELIF { 10557 x=$(( if ! [[ 1 = 1 ]] >&3 ; then echo eins ; elif [[ 1 = 2 ]] >&3 ; then echo zwei ; else echo drei ; fi >&3 ) | tr u x ) 10558 } 10559 inline_TWHILE() { 10560 i=1; while (( i < 10 )) >&3; do echo $i; let ++i; done >&3 10561 } 10562 inline_TWHILE() { 10563 i=1 10564 while let] " i < 10 " >&3 10565 do 10566 echo $i 10567 let ++i 10568 done >&3 10569 } 10570 function comsub_TWHILE { x=$( 10571 i=1; while (( i < 10 )) >&3; do echo $i; let ++i; done >&3 10572 ); } 10573 function comsub_TWHILE { 10574 x=$(i=1 ; while let] " i < 10 " >&3 ; do echo $i ; let ++i ; done >&3 ) 10575 } 10576 function reread_TWHILE { x=$(( 10577 i=1; while (( i < 10 )) >&3; do echo $i; let ++i; done >&3 10578 )|tr u x); } 10579 function reread_TWHILE { 10580 x=$(( i=1 ; while let] " i < 10 " >&3 ; do echo $i ; let ++i ; done >&3 ) | tr u x ) 10581 } 10582 inline_TUNTIL() { 10583 i=10; until (( !--i )) >&3 ; do echo $i; done >&3 10584 } 10585 inline_TUNTIL() { 10586 i=10 10587 until let] " !--i " >&3 10588 do 10589 echo $i 10590 done >&3 10591 } 10592 function comsub_TUNTIL { x=$( 10593 i=10; until (( !--i )) >&3 ; do echo $i; done >&3 10594 ); } 10595 function comsub_TUNTIL { 10596 x=$(i=10 ; until let] " !--i " >&3 ; do echo $i ; done >&3 ) 10597 } 10598 function reread_TUNTIL { x=$(( 10599 i=10; until (( !--i )) >&3 ; do echo $i; done >&3 10600 )|tr u x); } 10601 function reread_TUNTIL { 10602 x=$(( i=10 ; until let] " !--i " >&3 ; do echo $i ; done >&3 ) | tr u x ) 10603 } 10604 inline_TCOPROC() { 10605 cat * >&3 |& >&3 ls 10606 } 10607 inline_TCOPROC() { 10608 cat * >&3 |& 10609 ls >&3 10610 } 10611 function comsub_TCOPROC { x=$( 10612 cat * >&3 |& >&3 ls 10613 ); } 10614 function comsub_TCOPROC { 10615 x=$(cat * >&3 |& ls >&3 ) 10616 } 10617 function reread_TCOPROC { x=$(( 10618 cat * >&3 |& >&3 ls 10619 )|tr u x); } 10620 function reread_TCOPROC { 10621 x=$(( cat * >&3 |& ls >&3 ) | tr u x ) 10622 } 10623 inline_TFUNCT_TBRACE_TASYNC() { 10624 function korn { echo eins; echo >&3 zwei ; } 10625 bourne () { logger * >&3 & } 10626 } 10627 inline_TFUNCT_TBRACE_TASYNC() { 10628 function korn { 10629 echo eins 10630 echo zwei >&3 10631 } 10632 bourne() { 10633 logger * >&3 & 10634 } 10635 } 10636 function comsub_TFUNCT_TBRACE_TASYNC { x=$( 10637 function korn { echo eins; echo >&3 zwei ; } 10638 bourne () { logger * >&3 & } 10639 ); } 10640 function comsub_TFUNCT_TBRACE_TASYNC { 10641 x=$(function korn { echo eins ; echo zwei >&3 ; } ; bourne() { logger * >&3 & } ) 10642 } 10643 function reread_TFUNCT_TBRACE_TASYNC { x=$(( 10644 function korn { echo eins; echo >&3 zwei ; } 10645 bourne () { logger * >&3 & } 10646 )|tr u x); } 10647 function reread_TFUNCT_TBRACE_TASYNC { 10648 x=$(( function korn { echo eins ; echo zwei >&3 ; } ; bourne() { logger * >&3 & } ) | tr u x ) 10649 } 10650 inline_COMSUB_EXPRSUB() { 10651 echo $(true >&3) $((1+ 2)) 10652 } 10653 inline_COMSUB_EXPRSUB() { 10654 echo $(true >&3 ) $((1+ 2)) 10655 } 10656 function comsub_COMSUB_EXPRSUB { x=$( 10657 echo $(true >&3) $((1+ 2)) 10658 ); } 10659 function comsub_COMSUB_EXPRSUB { 10660 x=$(echo $(true >&3 ) $((1+ 2)) ) 10661 } 10662 function reread_COMSUB_EXPRSUB { x=$(( 10663 echo $(true >&3) $((1+ 2)) 10664 )|tr u x); } 10665 function reread_COMSUB_EXPRSUB { 10666 x=$(( echo $(true >&3 ) $((1+ 2)) ) | tr u x ) 10667 } 10668--- 10669name: funsub-1 10670description: 10671 Check that non-subenvironment command substitution works 10672stdin: 10673 set -e 10674 foo=bar 10675 echo "ob $foo ." 10676 echo "${ 10677 echo "ib $foo :" 10678 foo=baz 10679 echo "ia $foo :" 10680 false 10681 }" . 10682 echo "oa $foo ." 10683expected-stdout: 10684 ob bar . 10685 ib bar : 10686 ia baz : . 10687 oa baz . 10688--- 10689name: funsub-2 10690description: 10691 You can now reliably use local and return in funsubs 10692 (not exit though) 10693stdin: 10694 x=q; e=1; x=${ echo a; e=2; echo x$e;}; echo 1:y$x,$e,$?. 10695 x=q; e=1; x=${ echo a; typeset e=2; echo x$e;}; echo 2:y$x,$e,$?. 10696 x=q; e=1; x=${ echo a; typeset e=2; return 3; echo x$e;}; echo 3:y$x,$e,$?. 10697expected-stdout: 10698 1:ya x2,2,0. 10699 2:ya x2,1,0. 10700 3:ya,1,3. 10701--- 10702name: valsub-1 10703description: 10704 Check that "value substitutions" work as advertised 10705stdin: 10706 x=1 10707 y=2 10708 z=3 10709 REPLY=4 10710 echo "before: x<$x> y<$y> z<$z> R<$REPLY>" 10711 x=${| 10712 local y 10713 echo "begin: x<$x> y<$y> z<$z> R<$REPLY>" 10714 x=5 10715 y=6 10716 z=7 10717 REPLY=8 10718 echo "end: x<$x> y<$y> z<$z> R<$REPLY>" 10719 } 10720 echo "after: x<$x> y<$y> z<$z> R<$REPLY>" 10721 # ensure trailing newlines are kept 10722 t=${|REPLY=$'foo\n\n';} 10723 typeset -p t 10724 echo -n this used to segfault 10725 echo ${|true;}$(true). 10726expected-stdout: 10727 before: x<1> y<2> z<3> R<4> 10728 begin: x<1> y<> z<3> R<> 10729 end: x<5> y<6> z<7> R<8> 10730 after: x<8> y<2> z<7> R<4> 10731 typeset t=$'foo\n\n' 10732 this used to segfault. 10733--- 10734name: test-stnze-1 10735description: 10736 Check that the short form [ $x ] works 10737stdin: 10738 i=0 10739 [ -n $x ] 10740 rv=$?; echo $((++i)) $rv 10741 [ $x ] 10742 rv=$?; echo $((++i)) $rv 10743 [ -n "$x" ] 10744 rv=$?; echo $((++i)) $rv 10745 [ "$x" ] 10746 rv=$?; echo $((++i)) $rv 10747 x=0 10748 [ -n $x ] 10749 rv=$?; echo $((++i)) $rv 10750 [ $x ] 10751 rv=$?; echo $((++i)) $rv 10752 [ -n "$x" ] 10753 rv=$?; echo $((++i)) $rv 10754 [ "$x" ] 10755 rv=$?; echo $((++i)) $rv 10756 x='1 -a 1 = 2' 10757 [ -n $x ] 10758 rv=$?; echo $((++i)) $rv 10759 [ $x ] 10760 rv=$?; echo $((++i)) $rv 10761 [ -n "$x" ] 10762 rv=$?; echo $((++i)) $rv 10763 [ "$x" ] 10764 rv=$?; echo $((++i)) $rv 10765expected-stdout: 10766 1 0 10767 2 1 10768 3 1 10769 4 1 10770 5 0 10771 6 0 10772 7 0 10773 8 0 10774 9 1 10775 10 1 10776 11 0 10777 12 0 10778--- 10779name: test-stnze-2 10780description: 10781 Check that the short form [[ $x ]] works (ksh93 extension) 10782stdin: 10783 i=0 10784 [[ -n $x ]] 10785 rv=$?; echo $((++i)) $rv 10786 [[ $x ]] 10787 rv=$?; echo $((++i)) $rv 10788 [[ -n "$x" ]] 10789 rv=$?; echo $((++i)) $rv 10790 [[ "$x" ]] 10791 rv=$?; echo $((++i)) $rv 10792 x=0 10793 [[ -n $x ]] 10794 rv=$?; echo $((++i)) $rv 10795 [[ $x ]] 10796 rv=$?; echo $((++i)) $rv 10797 [[ -n "$x" ]] 10798 rv=$?; echo $((++i)) $rv 10799 [[ "$x" ]] 10800 rv=$?; echo $((++i)) $rv 10801 x='1 -a 1 = 2' 10802 [[ -n $x ]] 10803 rv=$?; echo $((++i)) $rv 10804 [[ $x ]] 10805 rv=$?; echo $((++i)) $rv 10806 [[ -n "$x" ]] 10807 rv=$?; echo $((++i)) $rv 10808 [[ "$x" ]] 10809 rv=$?; echo $((++i)) $rv 10810expected-stdout: 10811 1 1 10812 2 1 10813 3 1 10814 4 1 10815 5 0 10816 6 0 10817 7 0 10818 8 0 10819 9 0 10820 10 0 10821 11 0 10822 12 0 10823--- 10824name: event-subst-3 10825description: 10826 Check that '!' substitution in noninteractive mode is ignored 10827file-setup: file 755 "falsetto" 10828 #! /bin/sh 10829 echo molto bene 10830 exit 42 10831file-setup: file 755 "!false" 10832 #! /bin/sh 10833 echo si 10834stdin: 10835 export PATH=.:$PATH 10836 falsetto 10837 echo yeap 10838 !false 10839 echo meow 10840 ! false 10841 echo = $? 10842 if 10843 ! false; then echo foo; else echo bar; fi 10844expected-stdout: 10845 molto bene 10846 yeap 10847 si 10848 meow 10849 = 0 10850 foo 10851--- 10852name: event-subst-0 10853description: 10854 Check that '!' substitution in interactive mode is ignored 10855need-ctty: yes 10856arguments: !-i! 10857file-setup: file 755 "falsetto" 10858 #! /bin/sh 10859 echo molto bene 10860 exit 42 10861file-setup: file 755 "!false" 10862 #! /bin/sh 10863 echo si 10864stdin: 10865 export PATH=.:$PATH 10866 falsetto 10867 echo yeap 10868 !false 10869 echo meow 10870 ! false 10871 echo = $? 10872 if 10873 ! false; then echo foo; else echo bar; fi 10874expected-stdout: 10875 molto bene 10876 yeap 10877 si 10878 meow 10879 = 0 10880 foo 10881expected-stderr-pattern: 10882 /.*/ 10883--- 10884name: nounset-1 10885description: 10886 Check that "set -u" matches (future) SUSv4 requirement 10887stdin: 10888 (set -u 10889 try() { 10890 local v 10891 eval v=\$$1 10892 if [[ -n $v ]]; then 10893 echo $1=nz 10894 else 10895 echo $1=zf 10896 fi 10897 } 10898 x=y 10899 (echo $x) 10900 echo =1 10901 (echo $y) 10902 echo =2 10903 (try x) 10904 echo =3 10905 (try y) 10906 echo =4 10907 (try 0) 10908 echo =5 10909 (try 2) 10910 echo =6 10911 (try) 10912 echo =7 10913 (echo at=$@) 10914 echo =8 10915 (echo asterisk=$*) 10916 echo =9 10917 (echo $?) 10918 echo =10 10919 (echo $!) 10920 echo =11 10921 (echo $-) 10922 echo =12 10923 #(echo $_) 10924 #echo =13 10925 (echo $#) 10926 echo =14 10927 (mypid=$$; try mypid) 10928 echo =15 10929 ) 2>&1 | sed -e 's/^[^]]*]//' -e 's/^[^:]*: *//' 10930expected-stdout: 10931 y 10932 =1 10933 y: parameter not set 10934 =2 10935 x=nz 10936 =3 10937 y: parameter not set 10938 =4 10939 0=nz 10940 =5 10941 2: parameter not set 10942 =6 10943 1: parameter not set 10944 =7 10945 at= 10946 =8 10947 asterisk= 10948 =9 10949 0 10950 =10 10951 !: parameter not set 10952 =11 10953 ush 10954 =12 10955 0 10956 =14 10957 mypid=nz 10958 =15 10959--- 10960name: nameref-1 10961description: 10962 Testsuite for nameref (bound variables) 10963stdin: 10964 bar=global 10965 typeset -n ir2=bar 10966 typeset -n ind=ir2 10967 echo !ind: ${!ind} 10968 echo ind: $ind 10969 echo !ir2: ${!ir2} 10970 echo ir2: $ir2 10971 typeset +n ind 10972 echo !ind: ${!ind} 10973 echo ind: $ind 10974 typeset -n ir2=ind 10975 echo !ir2: ${!ir2} 10976 echo ir2: $ir2 10977 set|grep ^ir2|sed 's/^/s1: /' 10978 typeset|grep ' ir2'|sed -e 's/^/s2: /' -e 's/nameref/typeset -n/' 10979 set -A blub -- e1 e2 e3 10980 typeset -n ind=blub 10981 typeset -n ir2=blub[2] 10982 echo !ind[1]: ${!ind[1]} 10983 echo !ir2: $!ir2 10984 echo ind[1]: ${ind[1]} 10985 echo ir2: $ir2 10986expected-stdout: 10987 !ind: bar 10988 ind: global 10989 !ir2: bar 10990 ir2: global 10991 !ind: ind 10992 ind: ir2 10993 !ir2: ind 10994 ir2: ir2 10995 s1: ir2=ind 10996 s2: typeset -n ir2 10997 !ind[1]: blub[1] 10998 !ir2: ir2 10999 ind[1]: e2 11000 ir2: e3 11001--- 11002name: nameref-2da 11003description: 11004 Testsuite for nameref (bound variables) 11005 Functions, argument given directly, after local 11006stdin: 11007 function foo { 11008 typeset bar=lokal baz=auch 11009 typeset -n v=bar 11010 echo entering 11011 echo !v: ${!v} 11012 echo !bar: ${!bar} 11013 echo !baz: ${!baz} 11014 echo bar: $bar 11015 echo v: $v 11016 v=123 11017 echo bar: $bar 11018 echo v: $v 11019 echo exiting 11020 } 11021 bar=global 11022 echo bar: $bar 11023 foo bar 11024 echo bar: $bar 11025expected-stdout: 11026 bar: global 11027 entering 11028 !v: bar 11029 !bar: bar 11030 !baz: baz 11031 bar: lokal 11032 v: lokal 11033 bar: 123 11034 v: 123 11035 exiting 11036 bar: global 11037--- 11038name: nameref-3 11039description: 11040 Advanced testsuite for bound variables (ksh93 fails this) 11041stdin: 11042 typeset -n foo=bar[i] 11043 set -A bar -- b c a 11044 for i in 0 1 2 3; do 11045 print $i $foo . 11046 done 11047expected-stdout: 11048 0 b . 11049 1 c . 11050 2 a . 11051 3 . 11052--- 11053name: nameref-4 11054description: 11055 Ensure we don't run in an infinite loop 11056time-limit: 3 11057stdin: 11058 baz() { 11059 typeset -n foo=fnord fnord=foo 11060 foo[0]=bar 11061 } 11062 set -A foo bad 11063 echo sind $foo . 11064 baz 11065 echo blah $foo . 11066expected-stdout: 11067 sind bad . 11068 blah bad . 11069expected-stderr-pattern: 11070 /fnord: expression recurses on parameter/ 11071--- 11072name: better-parens-1a 11073description: 11074 Check support for ((…)) and $((…)) vs (…) and $(…) 11075stdin: 11076 if ( (echo fubar)|tr u x); then 11077 echo ja 11078 else 11079 echo nein 11080 fi 11081expected-stdout: 11082 fxbar 11083 ja 11084--- 11085name: better-parens-1b 11086description: 11087 Check support for ((…)) and $((…)) vs (…) and $(…) 11088stdin: 11089 echo $( (echo fubar)|tr u x) $? 11090expected-stdout: 11091 fxbar 0 11092--- 11093name: better-parens-1c 11094description: 11095 Check support for ((…)) and $((…)) vs (…) and $(…) 11096stdin: 11097 x=$( (echo fubar)|tr u x); echo $x $? 11098expected-stdout: 11099 fxbar 0 11100--- 11101name: better-parens-2a 11102description: 11103 Check support for ((…)) and $((…)) vs (…) and $(…) 11104stdin: 11105 if ((echo fubar)|tr u x); then 11106 echo ja 11107 else 11108 echo nein 11109 fi 11110expected-stdout: 11111 fxbar 11112 ja 11113--- 11114name: better-parens-2b 11115description: 11116 Check support for ((…)) and $((…)) vs (…) and $(…) 11117stdin: 11118 echo $((echo fubar)|tr u x) $? 11119expected-stdout: 11120 fxbar 0 11121--- 11122name: better-parens-2c 11123description: 11124 Check support for ((…)) and $((…)) vs (…) and $(…) 11125stdin: 11126 x=$((echo fubar)|tr u x); echo $x $? 11127expected-stdout: 11128 fxbar 0 11129--- 11130name: better-parens-3a 11131description: 11132 Check support for ((…)) and $((…)) vs (…) and $(…) 11133stdin: 11134 if ( (echo fubar)|(tr u x)); then 11135 echo ja 11136 else 11137 echo nein 11138 fi 11139expected-stdout: 11140 fxbar 11141 ja 11142--- 11143name: better-parens-3b 11144description: 11145 Check support for ((…)) and $((…)) vs (…) and $(…) 11146stdin: 11147 echo $( (echo fubar)|(tr u x)) $? 11148expected-stdout: 11149 fxbar 0 11150--- 11151name: better-parens-3c 11152description: 11153 Check support for ((…)) and $((…)) vs (…) and $(…) 11154stdin: 11155 x=$( (echo fubar)|(tr u x)); echo $x $? 11156expected-stdout: 11157 fxbar 0 11158--- 11159name: better-parens-4a 11160description: 11161 Check support for ((…)) and $((…)) vs (…) and $(…) 11162stdin: 11163 if ((echo fubar)|(tr u x)); then 11164 echo ja 11165 else 11166 echo nein 11167 fi 11168expected-stdout: 11169 fxbar 11170 ja 11171--- 11172name: better-parens-4b 11173description: 11174 Check support for ((…)) and $((…)) vs (…) and $(…) 11175stdin: 11176 echo $((echo fubar)|(tr u x)) $? 11177expected-stdout: 11178 fxbar 0 11179--- 11180name: better-parens-4c 11181description: 11182 Check support for ((…)) and $((…)) vs (…) and $(…) 11183stdin: 11184 x=$((echo fubar)|(tr u x)); echo $x $? 11185expected-stdout: 11186 fxbar 0 11187--- 11188name: echo-test-1 11189description: 11190 Test what the echo builtin does (mksh) 11191stdin: 11192 echo -n 'foo\x40bar' 11193 echo -e '\tbaz' 11194expected-stdout: 11195 foo@bar baz 11196--- 11197name: echo-test-2 11198description: 11199 Test what the echo builtin does (POSIX) 11200 Note: this follows Debian Policy 10.4 which mandates 11201 that -n shall be treated as an option, not XSI which 11202 mandates it shall be treated as string but escapes 11203 shall be expanded. 11204stdin: 11205 test -n "$POSH_VERSION" || set -o posix 11206 echo -n 'foo\x40bar' 11207 echo -e '\tbaz' 11208expected-stdout: 11209 foo\x40bar-e \tbaz 11210--- 11211name: echo-test-3-mnbsd 11212description: 11213 Test what the echo builtin does, and test a compatibility flag. 11214category: mnbsdash 11215stdin: 11216 "$__progname" -c 'echo -n 1=\\x40$1; echo -e \\x2E' -- foo bar 11217 "$__progname" -o posix -c 'echo -n 2=\\x40$1; echo -e \\x2E' -- foo bar 11218 "$__progname" -o sh -c 'echo -n 3=\\x40$1; echo -e \\x2E' -- foo bar 11219expected-stdout: 11220 1=@foo. 11221 2=\x40foo-e \x2E 11222 3=\x40bar. 11223--- 11224name: echo-test-3-normal 11225description: 11226 Test what the echo builtin does, and test a compatibility flag. 11227category: !mnbsdash 11228stdin: 11229 "$__progname" -c 'echo -n 1=\\x40$1; echo -e \\x2E' -- foo bar 11230 "$__progname" -o posix -c 'echo -n 2=\\x40$1; echo -e \\x2E' -- foo bar 11231 "$__progname" -o sh -c 'echo -n 3=\\x40$1; echo -e \\x2E' -- foo bar 11232expected-stdout: 11233 1=@foo. 11234 2=\x40foo-e \x2E 11235 3=\x40foo-e \x2E 11236--- 11237name: utilities-getopts-1 11238description: 11239 getopts sets OPTIND correctly for unparsed option 11240stdin: 11241 set -- -a -a -x 11242 while getopts :a optc; do 11243 echo "OPTARG=$OPTARG, OPTIND=$OPTIND, optc=$optc." 11244 done 11245 echo done 11246expected-stdout: 11247 OPTARG=, OPTIND=2, optc=a. 11248 OPTARG=, OPTIND=3, optc=a. 11249 OPTARG=x, OPTIND=4, optc=?. 11250 done 11251--- 11252name: utilities-getopts-2 11253description: 11254 Check OPTARG 11255stdin: 11256 set -- -a Mary -x 11257 while getopts a: optc; do 11258 echo "OPTARG=$OPTARG, OPTIND=$OPTIND, optc=$optc." 11259 done 11260 echo done 11261expected-stdout: 11262 OPTARG=Mary, OPTIND=3, optc=a. 11263 OPTARG=, OPTIND=4, optc=?. 11264 done 11265expected-stderr-pattern: /.*-x.*option/ 11266--- 11267name: wcswidth-1 11268description: 11269 Check the new wcswidth feature 11270stdin: 11271 s=何 11272 set +U 11273 print octets: ${#s} . 11274 print 8-bit width: ${%s} . 11275 set -U 11276 print characters: ${#s} . 11277 print columns: ${%s} . 11278 s=� 11279 set +U 11280 print octets: ${#s} . 11281 print 8-bit width: ${%s} . 11282 set -U 11283 print characters: ${#s} . 11284 print columns: ${%s} . 11285expected-stdout: 11286 octets: 3 . 11287 8-bit width: -1 . 11288 characters: 1 . 11289 columns: 2 . 11290 octets: 3 . 11291 8-bit width: 3 . 11292 characters: 1 . 11293 columns: 1 . 11294--- 11295name: wcswidth-2 11296description: 11297 Check some corner cases 11298stdin: 11299 print % $% . 11300 set -U 11301 x='a b' 11302 print c ${%x} . 11303 set +U 11304 x='a b' 11305 print d ${%x} . 11306expected-stdout: 11307 % $% . 11308 c -1 . 11309 d -1 . 11310--- 11311name: wcswidth-3 11312description: 11313 Check some corner cases 11314stdin: 11315 print ${%} . 11316expected-stderr-pattern: 11317 /bad substitution/ 11318expected-exit: 1 11319--- 11320name: wcswidth-4a 11321description: 11322 Check some corner cases 11323stdin: 11324 print ${%*} . 11325expected-stderr-pattern: 11326 /bad substitution/ 11327expected-exit: 1 11328--- 11329name: wcswidth-4b 11330description: 11331 Check some corner cases 11332stdin: 11333 print ${%@} . 11334expected-stderr-pattern: 11335 /bad substitution/ 11336expected-exit: 1 11337--- 11338name: wcswidth-4c 11339description: 11340 Check some corner cases 11341stdin: 11342 : 11343 print ${%?} . 11344expected-stdout: 11345 1 . 11346--- 11347name: realpath-1 11348description: 11349 Check proper return values for realpath 11350category: os:mirbsd 11351stdin: 11352 wd=$(realpath .) 11353 mkdir dir 11354 :>file 11355 :>dir/file 11356 ln -s dir lndir 11357 ln -s file lnfile 11358 ln -s nix lnnix 11359 ln -s . lnself 11360 i=0 11361 chk() { 11362 typeset x y 11363 x=$(realpath "$wd/$1" 2>&1); y=$? 11364 print $((++i)) "?$1" =${x##*$wd/} !$y 11365 } 11366 chk dir 11367 chk dir/ 11368 chk dir/file 11369 chk dir/nix 11370 chk file 11371 chk file/ 11372 chk file/file 11373 chk file/nix 11374 chk nix 11375 chk nix/ 11376 chk nix/file 11377 chk nix/nix 11378 chk lndir 11379 chk lndir/ 11380 chk lndir/file 11381 chk lndir/nix 11382 chk lnfile 11383 chk lnfile/ 11384 chk lnfile/file 11385 chk lnfile/nix 11386 chk lnnix 11387 chk lnnix/ 11388 chk lnnix/file 11389 chk lnnix/nix 11390 chk lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself 11391 rm lnself 11392expected-stdout: 11393 1 ?dir =dir !0 11394 2 ?dir/ =dir !0 11395 3 ?dir/file =dir/file !0 11396 4 ?dir/nix =dir/nix !0 11397 5 ?file =file !0 11398 6 ?file/ =file/: Not a directory !20 11399 7 ?file/file =file/file: Not a directory !20 11400 8 ?file/nix =file/nix: Not a directory !20 11401 9 ?nix =nix !0 11402 10 ?nix/ =nix !0 11403 11 ?nix/file =nix/file: No such file or directory !2 11404 12 ?nix/nix =nix/nix: No such file or directory !2 11405 13 ?lndir =dir !0 11406 14 ?lndir/ =dir !0 11407 15 ?lndir/file =dir/file !0 11408 16 ?lndir/nix =dir/nix !0 11409 17 ?lnfile =file !0 11410 18 ?lnfile/ =lnfile/: Not a directory !20 11411 19 ?lnfile/file =lnfile/file: Not a directory !20 11412 20 ?lnfile/nix =lnfile/nix: Not a directory !20 11413 21 ?lnnix =nix !0 11414 22 ?lnnix/ =nix !0 11415 23 ?lnnix/file =lnnix/file: No such file or directory !2 11416 24 ?lnnix/nix =lnnix/nix: No such file or directory !2 11417 25 ?lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself =lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself/lnself: Too many levels of symbolic links !62 11418--- 11419name: realpath-2 11420description: 11421 Ensure that exactly two leading slashes are not collapsed 11422 POSIX guarantees this exception, e.g. for UNC paths on Cygwin 11423category: os:mirbsd 11424stdin: 11425 ln -s /bin t1 11426 ln -s //bin t2 11427 ln -s ///bin t3 11428 realpath /bin 11429 realpath //bin 11430 realpath ///bin 11431 realpath /usr/bin 11432 realpath /usr//bin 11433 realpath /usr///bin 11434 realpath t1 11435 realpath t2 11436 realpath t3 11437 rm -f t1 t2 t3 11438 cd //usr/bin 11439 pwd 11440 cd ../lib 11441 pwd 11442 realpath //usr/include/../bin 11443expected-stdout: 11444 /bin 11445 //bin 11446 /bin 11447 /usr/bin 11448 /usr/bin 11449 /usr/bin 11450 /bin 11451 //bin 11452 /bin 11453 //usr/bin 11454 //usr/lib 11455 //usr/bin 11456--- 11457name: crash-1 11458description: 11459 Crashed during March 2011, fixed on vernal equinōx ☺ 11460category: os:mirbsd,os:openbsd 11461stdin: 11462 export MALLOC_OPTIONS=FGJPRSX 11463 "$__progname" -c 'x=$(tr z r <<<baz); echo $x' 11464expected-stdout: 11465 bar 11466--- 11467name: debian-117-1 11468description: 11469 Check test - bug#465250 11470stdin: 11471 test \( ! -e \) ; echo $? 11472expected-stdout: 11473 1 11474--- 11475name: debian-117-2 11476description: 11477 Check test - bug#465250 11478stdin: 11479 test \( -e \) ; echo $? 11480expected-stdout: 11481 0 11482--- 11483name: debian-117-3 11484description: 11485 Check test - bug#465250 11486stdin: 11487 test ! -e ; echo $? 11488expected-stdout: 11489 1 11490--- 11491name: debian-117-4 11492description: 11493 Check test - bug#465250 11494stdin: 11495 test -e ; echo $? 11496expected-stdout: 11497 0 11498--- 11499name: case-zsh 11500description: 11501 Check that zsh case variants work 11502stdin: 11503 case 'b' in 11504 a) echo a ;; 11505 b) echo b ;; 11506 c) echo c ;; 11507 *) echo x ;; 11508 esac 11509 echo = 11510 case 'b' in 11511 a) echo a ;& 11512 b) echo b ;& 11513 c) echo c ;& 11514 *) echo x ;& 11515 esac 11516 echo = 11517 case 'b' in 11518 a) echo a ;| 11519 b) echo b ;| 11520 c) echo c ;| 11521 *) echo x ;| 11522 esac 11523expected-stdout: 11524 b 11525 = 11526 b 11527 c 11528 x 11529 = 11530 b 11531 x 11532--- 11533name: case-braces 11534description: 11535 Check that case end tokens are not mixed up (Debian #220272) 11536stdin: 11537 i=0 11538 for value in 'x' '}' 'esac'; do 11539 print -n "$((++i))($value)bourne " 11540 case $value in 11541 }) echo brace ;; 11542 *) echo no ;; 11543 esac 11544 print -n "$((++i))($value)korn " 11545 case $value { 11546 esac) echo esac ;; 11547 *) echo no ;; 11548 } 11549 done 11550expected-stdout: 11551 1(x)bourne no 11552 2(x)korn no 11553 3(})bourne brace 11554 4(})korn no 11555 5(esac)bourne no 11556 6(esac)korn esac 11557--- 11558name: command-shift 11559description: 11560 Check that 'command shift' works 11561stdin: 11562 function snc { 11563 echo "before 0='$0' 1='$1' 2='$2'" 11564 shift 11565 echo "after 0='$0' 1='$1' 2='$2'" 11566 } 11567 function swc { 11568 echo "before 0='$0' 1='$1' 2='$2'" 11569 command shift 11570 echo "after 0='$0' 1='$1' 2='$2'" 11571 } 11572 echo = without command 11573 snc 一 二 11574 echo = with command 11575 swc 一 二 11576 echo = done 11577expected-stdout: 11578 = without command 11579 before 0='snc' 1='一' 2='二' 11580 after 0='snc' 1='二' 2='' 11581 = with command 11582 before 0='swc' 1='一' 2='二' 11583 after 0='swc' 1='二' 2='' 11584 = done 11585--- 11586name: duffs-device 11587description: 11588 Check that the compiler did not optimise-break them 11589 (lex.c has got a similar one in SHEREDELIM) 11590stdin: 11591 set +U 11592 s= 11593 typeset -i1 i=0 11594 while (( ++i < 256 )); do 11595 s+=${i#1#} 11596 done 11597 s+=$'\xC2\xA0\xE2\x82\xAC\xEF\xBF\xBD\xEF\xBF\xBE\xEF\xBF\xBF\xF0\x90\x80\x80.' 11598 typeset -p s 11599expected-stdout: 11600 typeset s=$'\001\002\003\004\005\006\a\b\t\n\v\f\r\016\017\020\021\022\023\024\025\026\027\030\031\032\E\034\035\036\037 !"#$%&\047()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\177\200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217\220\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357\360\361\362\363\364\365\366\367\370\371\372\373\374\375\376\377\u00A0\u20AC\uFFFD\357\277\276\357\277\277\360\220\200\200.' 11601--- 11602name: stateptr-underflow 11603description: 11604 This check overflows an Xrestpos stored in a short in R40 11605category: fastbox 11606stdin: 11607 function Lb64decode { 11608 [[ -o utf8-mode ]]; local u=$? 11609 set +U 11610 local c s="$*" t= 11611 [[ -n $s ]] || { s=$(cat;print x); s=${s%x}; } 11612 local -i i=0 n=${#s} p=0 v x 11613 local -i16 o 11614 11615 while (( i < n )); do 11616 c=${s:(i++):1} 11617 case $c { 11618 (=) break ;; 11619 ([A-Z]) (( v = 1#$c - 65 )) ;; 11620 ([a-z]) (( v = 1#$c - 71 )) ;; 11621 ([0-9]) (( v = 1#$c + 4 )) ;; 11622 (+) v=62 ;; 11623 (/) v=63 ;; 11624 (*) continue ;; 11625 } 11626 (( x = (x << 6) | v )) 11627 case $((p++)) { 11628 (0) continue ;; 11629 (1) (( o = (x >> 4) & 255 )) ;; 11630 (2) (( o = (x >> 2) & 255 )) ;; 11631 (3) (( o = x & 255 )) 11632 p=0 11633 ;; 11634 } 11635 t=$t\\x${o#16#} 11636 done 11637 print -n $t 11638 (( u )) || set -U 11639 } 11640 11641 i=-1 11642 s= 11643 while (( ++i < 12120 )); do 11644 s+=a 11645 done 11646 Lb64decode $s >/dev/null 11647--- 11648name: xtrace-1 11649description: 11650 Check that "set -x" doesn't redirect too quickly 11651stdin: 11652 print '#!'"$__progname" >bash 11653 cat >>bash <<'EOF' 11654 echo 'GNU bash, version 2.05b.0(1)-release (i386-ecce-mirbsd10) 11655 Copyright (C) 2002 Free Software Foundation, Inc.' 11656 EOF 11657 chmod +x bash 11658 "$__progname" -xc 'foo=$(./bash --version 2>&1 | head -1); echo "=$foo="' 11659expected-stdout: 11660 =GNU bash, version 2.05b.0(1)-release (i386-ecce-mirbsd10)= 11661expected-stderr-pattern: 11662 /.*/ 11663--- 11664