mirror of
git://git.code.sf.net/p/zsh/code
synced 2024-11-19 13:33:52 +01:00
321 lines
5.3 KiB
Plaintext
321 lines
5.3 KiB
Plaintext
#
|
|
# 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
|
|
|
|
{ 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
|
|
>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
|
|
|
|
if true;
|
|
:
|
|
fi
|
|
1d:`if ...' (iv)
|
|
?(eval):3: parse error near `fi'
|
|
|
|
for name in word to term; do
|
|
print $name
|
|
done
|
|
0:`for' loop
|
|
>word
|
|
>to
|
|
>term
|
|
|
|
for name
|
|
in word to term; do
|
|
print $name
|
|
done
|
|
0:`for' loop with newline before in keyword
|
|
>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', old syntax
|
|
>2
|
|
|
|
word=Trinity
|
|
case $word in
|
|
(Michaelmas) print 0
|
|
;;
|
|
(Hilary) print 1
|
|
;;
|
|
(Trinity) print 2
|
|
;;
|
|
(*) print 3
|
|
;;
|
|
esac
|
|
0:`case', new syntax
|
|
>2
|
|
|
|
word=Hilary
|
|
case $word in
|
|
(Michaelmas) print 0
|
|
;;
|
|
(Hilary) print 1
|
|
;&
|
|
(Trinity) print 2
|
|
;&
|
|
(*) print 3
|
|
;;
|
|
esac
|
|
0:`case', new syntax, cascaded
|
|
>1
|
|
>2
|
|
>3
|
|
|
|
## 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'
|
|
#
|
|
|
|
if (true) { print true-1 } elif (true) { print true-2 } else { print false }
|
|
if (false) { print true-1 } elif (true) { print true-2 } else { print false }
|
|
if (false) { print true-1 } elif (false) { print true-2 } else { print false }
|
|
0:Alternate `if' with braces
|
|
>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
|
|
|
|
case bravo {
|
|
(alpha) print schmalpha
|
|
;;
|
|
(bravo) print schmavo
|
|
;;
|
|
(charlie) print schmarlie
|
|
;;
|
|
}
|
|
0:`case' with braces
|
|
>schmavo
|
|
|
|
print 'This test hangs the shell when it fails...' >&8
|
|
name=0
|
|
# The number 4375 here is chosen to produce more than 16384 bytes of output
|
|
while (( name < 4375 )); do
|
|
print -n $name
|
|
(( name++ ))
|
|
done < /dev/null | { read name; print done }
|
|
0:Bug regression: `while' loop with redirection and pipeline
|
|
>done
|