# # This file contains tests corresponding to the `Shell Grammar' texinfo node. # %prep mkdir basic.tmp && cd basic.tmp touch foo bar %test # # Tests for `Simple Commands and Pipelines' # echo foo | cat | sed 's/foo/bar/' 0:Basic pipeline handling >bar false | true 0:Exit status of pipeline with builtins (true) true | false 1:Exit status of pipeline with builtins (false) fn() { local foo; read foo; print $foo; } coproc fn print -p coproc test output read -p bar print $bar 0:Basic coprocess handling >coproc test output true | false && print true || print false 0:Basic sublist (i) >false false | true && print true || print false 0:Basic sublist (ii) >true (cd /NonExistentDirectory >&/dev/null) || print false 0:Basic subshell list with error >false # Can someone convince me the following is really supposed to fail # without the semicolon present? { cd /NonExistentDirectory >&/dev/null; } || print false 0:Basic current shell list with error >false # # Tests for `Precommand Modifiers' # - $ZTST_testdir/../Src/zsh -fc "[[ \$0 = \"-$ZTST_testdir/../Src/zsh\" ]]" 0:`-' precommand modifier echo f* noglob echo f* 0:`noglob' precommand modifier >foo >f* (exec /bin/sh; echo bar) 0:`exec' precommand modifier cat() { echo Function cat executed; } command cat && unfunction cat 0:`command' precommand modifier External command cat executed cd() { echo Not cd at all; } builtin cd . && unfunction cd 0:`builtin' precommand modifier # # Tests for `Complex Commands' # if true; then print true-1 elif true; then print true-2 else print false fi 0:`if ...' (i) >true-1 if false; then print true-1 elif true; then print true-2 else print false fi 0:`if ...' (ii) >true-2 if false; then print true-1 elif false; then print true-2 else print false fi 0:`if ...' (iii) >false for name in word to term; do print $name done 0:`for' loop >word >to >term for (( name = 0; name < 3; name++ )); do print $name done 0:arithmetic `for' loop >0 >1 >2 name=0 while (( name < 3 )); do print $name (( name++ )) done 0:`while' loop >0 >1 >2 name=0 until (( name == 3 )); do print $name (( name++ )) done 0:`until' loop >0 >1 >2 repeat 3 do echo over and over done 0:`repeat' loop >over and over >over and over >over and over word=Trinity case $word in Michaelmas) print 0 ;; Hilary) print 1 ;; Trinity) print 2 ;; *) print 3 ;; esac 0:`case' loop, old syntax >2 word=Trinity case $word in (Michaelmas) print 0 ;; (Hilary) print 1 ;; (Trinity) print 2 ;; (*) print 3 ;; esac 0:`case' loop, new syntax >2 ## This doesn't work, because zsh tries to read from the terminal ## even in a non-interactive shell. The manual implies it always reads ## from stdin, even in an interactive shell. # PS3="input> " # select name in one two three; do # print $name # done #0:`select' loop #<2 #>1) one 2) two 3) three #>input> #>two function name1 name2 () { print This is $0; } name2 name1 name2() { print This is still $0; } name2 0:`function' keyword >This is name2 >This is still name2 (time cat) >&/dev/null 0:`time' keyword (status only) if [[ -f foo && -d . && -n $ZTST_testdir ]]; then true else false fi 0:basic [[ ... ]] test # # Tests for `Alternate Forms For Complex Commands' # ## I simply can't get these to work. ## I suspect that the lists which are allowed here are only syntactically ## special tests. # if true; { print true-1; } elif true; { print true-2; } else { false; } # if false; { print true-1; } elif true; { print true-2; } else { false; } # if false; { print true-1; } elif false; { print true-2; } else { false; } #0:Alternate `if' with braces ## Are all those semicolons necessary? If not, what are the rules? #>true-1 #>true-2 #>false if true; print true 0:Short form of `if' >true for name ( word1 word2 word3 ) print $name 0:Form of `for' with parentheses. >word1 >word2 >word3 for name in alpha beta gamma; print $name 0:Short form of `for' >alpha >beta >gamma for (( val = 2; val < 10; val *= val )) print $val 0:Short arithmetic `for' >2 >4 foreach name ( verbiage words periphrasis ) print $name end 0:Csh-like `for' >verbiage >words >periphrasis # see comment with braces used in if loops val=0; while (( val < 2 )) { print $((val++)); } 0:Alternative `while' >0 >1 val=2; until (( val == 0 )) { print $((val--)); } 0:Alternative `until' >2 >1 repeat 3 print Hip hip hooray 0:Short `repeat' >Hip hip hooray >Hip hip hooray >Hip hip hooray ## Why doesn't this one work here? It works from the command line ## or with zsh -fc. # case bravo { # (alpha) print schmalpha # ;; # (bravo) print schmavo # ;; # (charlie) print schmarlie # ;; # } #0:`case' with braces #>schmavo