multi_test.sh revision 117900
1247835Skib#!/bin/sh -
2247835Skib#
3247835Skib# Copyright (c) 1992 Diomidis Spinellis.
4247835Skib# Copyright (c) 1992, 1993
5247835Skib#	The Regents of the University of California.  All rights reserved.
6247835Skib#
7247835Skib# Redistribution and use in source and binary forms, with or without
8247835Skib# modification, are permitted provided that the following conditions
9247835Skib# are met:
10247835Skib# 1. Redistributions of source code must retain the above copyright
11247835Skib#    notice, this list of conditions and the following disclaimer.
12247835Skib# 2. Redistributions in binary form must reproduce the above copyright
13247835Skib#    notice, this list of conditions and the following disclaimer in the
14247835Skib#    documentation and/or other materials provided with the distribution.
15247835Skib# 3. All advertising materials mentioning features or use of this software
16247835Skib#    must display the following acknowledgement:
17247835Skib#	This product includes software developed by the University of
18247835Skib#	California, Berkeley and its contributors.
19247835Skib# 4. Neither the name of the University nor the names of its contributors
20247835Skib#    may be used to endorse or promote products derived from this software
21247835Skib#    without specific prior written permission.
22247835Skib#
23247835Skib# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
24247835Skib# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25247835Skib# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26247835Skib# ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
27247835Skib# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28247835Skib# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29247835Skib# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30247835Skib# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31247835Skib# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32247835Skib# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33247835Skib# SUCH DAMAGE.
34247835Skib#
35247835Skib#	@(#)sed.test	8.1 (Berkeley) 6/6/93
36247835Skib#
37247835Skib#	$FreeBSD: head/tools/regression/usr.bin/sed/multitest.t 117900 2003-07-22 19:22:08Z dds $
38247835Skib#
39247835Skib
40247835Skib# sed Regression Tests
41247835Skib#
42247835Skib# The following files are created:
43247835Skib# lines[1-4], script1, script2
44247835Skib# Two directories *.out contain the test results
45247835Skib
46247835Skibmain()
47247835Skib{
48247835Skib	BASE=/usr/bin/sed
49247835Skib	BASELOG=sed.out
50247835Skib	TEST=`cd ..; make whereobj`/sed
51247835Skib	TESTLOG=nsed.out
52247835Skib	DICT=/usr/share/dict/words
53247835Skib
54247835Skib	test_error | more
55247835Skib
56247835Skib	awk 'END { for (i = 1; i < 15; i++) print "l1_" i}' </dev/null >lines1
57247835Skib	awk 'END { for (i = 1; i < 10; i++) print "l2_" i}' </dev/null >lines2
58247835Skib
59247835Skib	exec 4>&1 5>&2
60247835Skib
61247835Skib	# Set these flags to get messages about known problems
62247835Skib	BSD=1
63247835Skib	GNU=0
64247835Skib	SUN=0
65247835Skib	tests $BASE $BASELOG
66247835Skib
67247835Skib	BSD=0
68247835Skib	GNU=0
69247835Skib	SUN=0
70247835Skib	tests $TEST $TESTLOG
71247835Skib	exec 1>&4 2>&5
72247835Skib	diff -c $BASELOG $TESTLOG | more
73247835Skib}
74247835Skib
75247835Skibtests()
76247835Skib{
77247835Skib	SED=$1
78247835Skib	DIR=$2
79247835Skib	rm -rf $DIR
80247835Skib	mkdir $DIR
81247835Skib	MARK=100
82247835Skib
83247835Skib	test_args
84247835Skib	test_addr
85247835Skib	echo Testing commands
86247835Skib	test_group
87247835Skib	test_acid
88247835Skib	test_branch
89247835Skib	test_pattern
90247835Skib	test_print
91247835Skib	test_subst
92247835Skib}
93247835Skib
94247835Skibmark()
95247835Skib{
96247835Skib	MARK=`expr $MARK + 1`
97247835Skib	exec 1>&4 2>&5
98247835Skib	exec >"$DIR/${MARK}_$1"
99247835Skib	echo "Test $1:$MARK"
100247835Skib	# Uncomment this line to match tests with sed error messages
101247835Skib	echo "Test $1:$MARK" >&5
102247835Skib}
103247835Skib
104247835Skibtest_args()
105247835Skib{
106247835Skib	mark '1.1'
107247835Skib	echo Testing argument parsing
108247835Skib	echo First type
109247835Skib	if [ $SUN -eq 1 ] ; then
110247835Skib		echo SunOS sed prints only with -n
111247835Skib	else
112247835Skib		$SED 's/^/e1_/p' lines1
113247835Skib	fi
114247835Skib	mark '1.2' ; $SED -n 's/^/e1_/p' lines1
115247835Skib	mark '1.3'
116247835Skib	if [ $SUN -eq 1 ] ; then
117247835Skib		echo SunOS sed prints only with -n
118247835Skib	else
119247835Skib		$SED 's/^/e1_/p' <lines1
120247835Skib	fi
121247835Skib	mark '1.4' ; $SED -n 's/^/e1_/p' <lines1
122247835Skib	echo Second type
123247835Skib	mark '1.4.1'
124247835Skib	if [ $SUN -eq 1 ] ; then
125247835Skib		echo SunOS sed fails this
126247835Skib	fi
127247835Skib	$SED -e '' <lines1
128247835Skib	echo 's/^/s1_/p' >script1
129247835Skib	echo 's/^/s2_/p' >script2
130247835Skib	mark '1.5'
131247835Skib	if [ $SUN -eq 1 ] ; then
132247835Skib		echo SunOS sed prints only with -n
133247835Skib	else
134247835Skib		$SED -f script1 lines1
135247835Skib	fi
136247835Skib	mark '1.6'
137247835Skib	if [ $SUN -eq 1 ] ; then
138247835Skib		echo SunOS sed prints only with -n
139247835Skib	else
140247835Skib		$SED -f script1 <lines1
141247835Skib	fi
142247835Skib	mark '1.7'
143247835Skib	if [ $SUN -eq 1 ] ; then
144247835Skib		echo SunOS sed prints only with -n
145247835Skib	else
146247835Skib		$SED -e 's/^/e1_/p' lines1
147247835Skib	fi
148247835Skib	mark '1.8'
149247835Skib	if [ $SUN -eq 1 ] ; then
150247835Skib		echo SunOS sed prints only with -n
151247835Skib	else
152247835Skib		$SED -e 's/^/e1_/p' <lines1
153247835Skib	fi
154247835Skib	mark '1.9' ; $SED -n -f script1 lines1
155247835Skib	mark '1.10' ; $SED -n -f script1 <lines1
156247835Skib	mark '1.11' ; $SED -n -e 's/^/e1_/p' lines1
157247835Skib	mark '1.12'
158247835Skib	if [ $SUN -eq 1 ] ; then
159247835Skib		echo SunOS sed prints only with -n
160247835Skib	else
161247835Skib		$SED -n -e 's/^/e1_/p' <lines1
162247835Skib	fi
163247835Skib	mark '1.13'
164247835Skib	if [ $SUN -eq 1 ] ; then
165247835Skib		echo SunOS sed prints only with -n
166247835Skib	else
167247835Skib		$SED -e 's/^/e1_/p' -e 's/^/e2_/p' lines1
168247835Skib	fi
169247835Skib	mark '1.14'
170247835Skib	if [ $SUN -eq 1 ] ; then
171247835Skib		echo SunOS sed prints only with -n
172247835Skib	else
173247835Skib		$SED -f script1 -f script2 lines1
174247835Skib	fi
175247835Skib	mark '1.15'
176247835Skib	if [ $GNU -eq 1 -o $SUN -eq 1 ] ; then
177247835Skib		echo GNU and SunOS sed fail this following older POSIX draft
178247835Skib	else
179247835Skib		$SED -e 's/^/e1_/p' -f script1 lines1
180247835Skib	fi
181247835Skib	mark '1.16'
182247835Skib	if [ $SUN -eq 1 ] ; then
183247835Skib		echo SunOS sed prints only with -n
184247835Skib	else
185247835Skib		$SED -e 's/^/e1_/p' lines1 lines1
186247835Skib	fi
187247835Skib	# POSIX D11.2:11251
188247835Skib	mark '1.17' ; $SED p <lines1 lines1
189247835Skibcat >script1 <<EOF
190247835Skib#n
191247835Skib# A comment
192247835Skib
193247835Skibp
194247835SkibEOF
195247835Skib	mark '1.18' ; $SED -f script1 <lines1 lines1
196247835Skib}
197247835Skib
198247835Skibtest_addr()
199247835Skib{
200247835Skib	echo Testing address ranges
201247835Skib	mark '2.1' ; $SED -n -e '4p' lines1
202247835Skib	mark '2.2' ; $SED -n -e '20p' lines1 lines2
203247835Skib	mark '2.3' ; $SED -n -e '$p' lines1
204247835Skib	mark '2.4' ; $SED -n -e '$p' lines1 lines2
205247835Skib	mark '2.5' ; $SED -n -e '$a\
206247835Skibhello' /dev/null
207247835Skib	mark '2.6' ; $SED -n -e '$p' lines1 /dev/null lines2
208247835Skib	# Should not print anything
209247835Skib	mark '2.7' ; $SED -n -e '20p' lines1
210247835Skib	mark '2.8' ; $SED -n -e '0p' lines1
211247835Skib	mark '2.9' ; $SED -n '/l1_7/p' lines1
212247835Skib	mark '2.10' ; $SED -n ' /l1_7/ p' lines1
213247835Skib	mark '2.11'
214247835Skib	if [ $BSD -eq 1 ] ; then
215247835Skib		echo BSD sed fails this test
216247835Skib	fi
217247835Skib	if [ $GNU -eq 1 ] ; then
218247835Skib		echo GNU sed fails this
219247835Skib	fi
220247835Skib	$SED -n '\_l1\_7_p' lines1
221247835Skib	mark '2.12' ; $SED -n '1,4p' lines1
222247835Skib	mark '2.13' ; $SED -n '1,$p' lines1 lines2
223247835Skib	mark '2.14' ; $SED -n '1,/l2_9/p' lines1 lines2
224247835Skib	mark '2.15' ; $SED -n '/4/,$p' lines1 lines2
225247835Skib	mark '2.16' ; $SED -n '/4/,20p' lines1 lines2
226247835Skib	mark '2.17' ; $SED -n '/4/,/10/p' lines1 lines2
227247835Skib	mark '2.18' ; $SED -n '/l2_3/,/l1_8/p' lines1 lines2
228247835Skib	mark '2.19'
229247835Skib	if [ $GNU -eq 1 ] ; then
230247835Skib		echo GNU sed fails this
231247835Skib	fi
232247835Skib	$SED -n '12,3p' lines1 lines2
233247835Skib	mark '2.20'
234247835Skib	if [ $GNU -eq 1 ] ; then
235247835Skib		echo GNU sed fails this
236247835Skib	fi
237247835Skib	$SED -n '/l1_7/,3p' lines1 lines2
238247835Skib}
239247835Skib
240247835Skibtest_group()
241247835Skib{
242247835Skib	echo Brace and other grouping
243247835Skib	mark '3.1' ; $SED -e '
244247835Skib4,12 {
245247835Skib	s/^/^/
246247835Skib	s/$/$/
247247835Skib	s/_/T/
248247835Skib}' lines1
249247835Skib	mark '3.2' ; $SED -e '
250247835Skib4,12 {
251247835Skib	s/^/^/
252247835Skib	/6/,/10/ {
253247835Skib		s/$/$/
254247835Skib		/8/ s/_/T/
255247835Skib	}
256247835Skib}' lines1
257247835Skib	mark '3.3' ; $SED -e '
258247835Skib4,12 !{
259247835Skib	s/^/^/
260247835Skib	/6/,/10/ !{
261247835Skib		s/$/$/
262247835Skib		/8/ !s/_/T/
263247835Skib	}
264247835Skib}' lines1
265247835Skib	mark '3.4' ; $SED -e '4,12!s/^/^/' lines1
266247835Skib}
267247835Skib
268247835Skibtest_acid()
269247835Skib{
270247835Skib	echo Testing a c d and i commands
271247835Skib	mark '4.1' ; $SED -n -e '
272247835Skibs/^/before_i/p
273247835Skib20i\
274247835Skibinserted
275247835Skibs/^/after_i/p
276247835Skib' lines1 lines2
277247835Skib	mark '4.2' ; $SED -n -e '
278247835Skib5,12s/^/5-12/
279247835Skibs/^/before_a/p
280247835Skib/5-12/a\
281247835Skibappended
282247835Skibs/^/after_a/p
283247835Skib' lines1 lines2
284247835Skib	mark '4.3'
285247835Skib	if [ $GNU -eq 1 ] ; then
286247835Skib		echo GNU sed fails this
287247835Skib	fi
288247835Skib	$SED -n -e '
289247835Skibs/^/^/p
290247835Skib/l1_/a\
291247835Skibappended
292247835Skib8,10N
293247835Skibs/$/$/p
294247835Skib' lines1 lines2
295247835Skib	mark '4.4' ; $SED -n -e '
296247835Skibc\
297247835Skibhello
298247835Skib' lines1
299247835Skib	mark '4.5' ; $SED -n -e '
300247835Skib8c\
301247835Skibhello
302247835Skib' lines1
303247835Skib	mark '4.6' ; $SED -n -e '
304247835Skib3,14c\
305247835Skibhello
306247835Skib' lines1
307247835Skib# SunOS and GNU sed behave differently.   We follow POSIX
308247835Skib#	mark '4.7' ; $SED -n -e '
309247835Skib#8,3c\
310247835Skib#hello
311247835Skib#' lines1
312247835Skib	mark '4.8' ; $SED d <lines1
313247835Skib}
314247835Skib
315247835Skibtest_branch()
316247835Skib{
317247835Skib	echo Testing labels and branching
318247835Skib	mark '5.1' ; $SED -n -e '
319247835Skibb label4
320247835Skib:label3
321247835Skibs/^/label3_/p
322247835Skibb end
323247835Skib:label4
324247835Skib2,12b label1
325247835Skibb label2
326247835Skib:label1
327247835Skibs/^/label1_/p
328247835Skibb
329247835Skib:label2
330247835Skibs/^/label2_/p
331247835Skibb label3
332247835Skib:end
333247835Skib' lines1
334247835Skib	mark '5.2'
335247835Skib	if [ $BSD -eq 1 ] ; then
336247835Skib		echo BSD sed fails this test
337247835Skib	fi
338247835Skib	$SED -n -e '
339247835Skibs/l1_/l2_/
340247835Skibt ok
341247835Skibb
342247835Skib:ok
343247835Skibs/^/tested /p
344247835Skib' lines1 lines2
345247835Skib# SunOS sed behaves differently here.  Clarification needed.
346247835Skib#	mark '5.3' ; $SED -n -e '
347247835Skib#5,8b inside
348247835Skib#1,5 {
349247835Skib#	s/^/^/p
350247835Skib#	:inside
351247835Skib#	s/$/$/p
352247835Skib#}
353247835Skib#' lines1
354247835Skib# Check that t clears the substitution done flag
355247835Skib	mark '5.4' ; $SED -n -e '
356247835Skib1,8s/^/^/
357247835Skibt l1
358247835Skib:l1
359247835Skibt l2
360247835Skibs/$/$/p
361247835Skibb
362247835Skib:l2
363247835Skibs/^/ERROR/
364247835Skib' lines1
365247835Skib# Check that reading a line clears the substitution done flag
366247835Skib	mark '5.5'
367247835Skib	if [ $BSD -eq 1 ] ; then
368247835Skib		echo BSD sed fails this test
369247835Skib	fi
370247835Skib	$SED -n -e '
371247835Skibt l2
372247835Skib1,8s/^/^/p
373247835Skib2,7N
374247835Skibb
375247835Skib:l2
376247835Skibs/^/ERROR/p
377247835Skib' lines1
378247835Skib	mark '5.6' ; $SED 5q lines1
379247835Skib	mark '5.7' ; $SED -e '
380247835Skib5i\
381247835Skibhello
382247835Skib5q' lines1
383247835Skib# Branch across block boundary
384247835Skib	mark '5.8' ; $SED -e '
385247835Skib{
386247835Skib:b
387247835Skib}
388247835Skibs/l/m/
389247835Skibtb' lines1
390247835Skib}
391247835Skib
392247835Skibtest_pattern()
393247835Skib{
394247835Skibecho Pattern space commands
395247835Skib# Check that the pattern space is deleted
396247835Skib	mark '6.1' ; $SED -n -e '
397247835Skibc\
398247835Skibchanged
399247835Skibp
400247835Skib' lines1
401247835Skib	mark '6.2' ; $SED -n -e '
402247835Skib4d
403247835Skibp
404247835Skib' lines1
405247835Skib# SunOS sed refused to print here
406247835Skib#	mark '6.3' ; $SED -e '
407247835Skib#N
408247835Skib#N
409247835Skib#N
410247835Skib#D
411247835Skib#P
412247835Skib#4p
413247835Skib#' lines1
414247835Skib	mark '6.4' ; $SED -e '
415247835Skib2h
416247835Skib3H
417247835Skib4g
418247835Skib5G
419247835Skib6x
420247835Skib6p
421247835Skib6x
422247835Skib6p
423247835Skib' lines1
424247835Skib	mark '6.5' ; $SED -e '4n' lines1
425247835Skib	mark '6.6' ; $SED -n -e '4n' lines1
426247835Skib}
427247835Skib
428247835Skibtest_print()
429247835Skib{
430247835Skib	echo Testing print and file routines
431247835Skib	awk 'END {for (i = 1; i < 256; i++) printf("%c", i);print "\n"}' \
432247835Skib		</dev/null >lines3
433247835Skib	# GNU and SunOS sed behave differently here
434247835Skib	mark '7.1'
435247835Skib	$SED -n l lines3
436247835Skib	mark '7.2' ; $SED -e '/l2_/=' lines1 lines2
437247835Skib	rm -f lines4
438247835Skib	mark '7.3' ; $SED -e '3,12w lines4' lines1
439247835Skib	echo w results
440247835Skib	cat lines4
441247835Skib	mark '7.4' ; $SED -e '4r lines2' lines1
442247835Skib	mark '7.5' ; $SED -e '5r /dev/dds' lines1
443247835Skib	mark '7.6' ; $SED -e '6r /dev/null' lines1
444247835Skib	mark '7.7'
445247835Skib	if [ $BSD -eq 1 -o $GNU -eq 1 -o $SUN -eq 1 ] ; then
446247835Skib		echo BSD, GNU and SunOS cannot pass this one
447247835Skib	else
448247835Skib		sed '200q' $DICT | sed 's$.*$s/^/&/w tmpdir/&$' >script1
449247835Skib		rm -rf tmpdir
450247835Skib		mkdir tmpdir
451247835Skib		$SED -f script1 lines1
452247835Skib		cat tmpdir/*
453247835Skib		rm -rf tmpdir
454247835Skib	fi
455247835Skib	mark '7.8'
456247835Skib	if [ $BSD -eq 1 ] ; then
457247835Skib		echo BSD sed cannot pass 7.7
458247835Skib	else
459247835Skib		echo line1 > lines3
460247835Skib		echo "" >> lines3
461247835Skib		$SED -n -e '$p' lines3 /dev/null
462247835Skib	fi
463247835Skib		
464247835Skib}
465247835Skib
466247835Skibtest_subst()
467247835Skib{
468247835Skib	echo Testing substitution commands
469247835Skib	mark '8.1' ; $SED -e 's/./X/g' lines1
470247835Skib	mark '8.2' ; $SED -e 's,.,X,g' lines1
471247835Skib# GNU and SunOS sed thinks we are escaping . as wildcard, not as separator
472247835Skib#	mark '8.3' ; $SED -e 's.\..X.g' lines1
473247835Skib# POSIX does not say that this should work
474247835Skib#	mark '8.4' ; $SED -e 's/[/]/Q/' lines1
475247835Skib	mark '8.4' ; $SED -e 's/[\/]/Q/' lines1
476247835Skib	mark '8.5' ; $SED -e 's_\__X_' lines1
477247835Skib	mark '8.6' ; $SED -e 's/./(&)/g' lines1
478247835Skib	mark '8.7' ; $SED -e 's/./(\&)/g' lines1
479247835Skib	mark '8.8' ; $SED -e 's/\(.\)\(.\)\(.\)/x\3x\2x\1/g' lines1
480247835Skib	mark '8.9' ; $SED -e 's/_/u0\
481247835Skibu1\
482247835Skibu2/g' lines1
483247835Skib	mark '8.10'
484247835Skib	if [ $BSD -eq 1 -o $GNU -eq 1 ] ; then
485247835Skib		echo 'BSD/GNU sed do not understand digit flags on s commands'
486247835Skib	fi
487247835Skib	$SED -e 's/./X/4' lines1
488247835Skib	rm -f lines4
489247835Skib	mark '8.11' ; $SED -e 's/1/X/w lines4' lines1
490247835Skib	echo s wfile results
491247835Skib	cat lines4
492247835Skib	mark '8.12' ; $SED -e 's/[123]/X/g' lines1
493247835Skib	mark '8.13' ; $SED -e 'y/0123456789/9876543210/' lines1
494247835Skib	mark '8.14' ; 
495247835Skib	if [ $BSD -eq 1 -o $GNU -eq 1 -o $SUN -eq 1 ] ; then
496247835Skib		echo BSD/GNU/SUN sed fail this test
497247835Skib	else
498247835Skib		$SED -e 'y10\123456789198765432\101' lines1
499247835Skib	fi
500247835Skib	mark '8.15' ; $SED -e '1N;2y/\n/X/' lines1
501247835Skib	mark '8.16'
502247835Skib	echo 'eeefff' | $SED -e '
503247835Skib		p
504247835Skib		s/e/X/p
505247835Skib		:x
506247835Skib		s//Y/p 
507247835Skib		# Establish limit counter in the hold space
508247835Skib		# GNU sed version 3.02 enters into an infinite loop here
509247835Skib		x 
510247835Skib		/.\{10\}/ {
511247835Skib			s/.*/ERROR/
512247835Skib			b
513247835Skib		}
514247835Skib		s/.*/&./
515247835Skib		x 
516247835Skib		/f/bx
517247835Skib	'
518247835Skib}
519247835Skib
520247835Skibtest_error()
521247835Skib{
522247835Skib	exec 0>&3 4>&1 5>&2
523247835Skib	exec 0</dev/null
524247835Skib	exec 2>&1
525247835Skib	set -x
526247835Skib	$TEST -x && exit 1
527247835Skib	$TEST -f && exit 1
528247835Skib	$TEST -e && exit 1
529247835Skib	$TEST -f /dev/dds && exit 1
530247835Skib	$TEST p /dev/dds && exit 1
531247835Skib	$TEST -f /bin/sh && exit 1
532247835Skib	$TEST '{' && exit 1
533247835Skib	$TEST '{' && exit 1
534247835Skib	$TEST '/hello/' && exit 1
535247835Skib	$TEST '1,/hello/' && exit 1
536247835Skib	$TEST -e '-5p' && exit 1
537247835Skib	$TEST '/jj' && exit 1
538247835Skib	$TEST 'a hello' && exit 1
539247835Skib	$TEST 'a \ hello' && exit 1
540247835Skib	$TEST 'b foo' && exit 1
541247835Skib	$TEST 'd hello' && exit 1
542247835Skib	$TEST 's/aa' && exit 1
543247835Skib	$TEST 's/aa/' && exit 1
544247835Skib	$TEST 's/a/b' && exit 1
545247835Skib	$TEST 's/a/b/c/d' && exit 1
546247835Skib	$TEST 's/a/b/ 1 2' && exit 1
547247835Skib	$TEST 's/a/b/ 1 g' && exit 1
548247835Skib	$TEST 's/a/b/w' && exit 1
549247835Skib	$TEST 'y/aa' && exit 1
550247835Skib	$TEST 'y/aa/b/' && exit 1
551247835Skib	$TEST 'y/aa/' && exit 1
552247835Skib	$TEST 'y/a/b' && exit 1
553247835Skib	$TEST 'y/a/b/c/d' && exit 1
554247835Skib	$TEST '!' && exit 1
555247835Skib	$TEST supercalifrangolisticexprialidociussupercalifrangolisticexcius
556247835Skib	set +x
557247835Skib	exec 0>&3 1>&4 2>&5
558247835Skib}
559247835Skib
560247835Skibmain
561247835Skib