OILS / spec / pipeline.test.sh View on Github | oils.pub

280 lines, 107 significant
1## oils_failures_allowed: 1
2## compare_shells: bash dash mksh zsh
3
4#
5# Tests for pipelines.
6# NOTE: Grammatically, ! is part of the pipeline:
7#
8# pipeline : pipe_sequence
9# | Bang pipe_sequence
10
11#### Brace group in pipeline
12{ echo one; echo two; } | tac
13## STDOUT:
14two
15one
16## END
17
18#### For loop starts pipeline
19for w in one two; do
20 echo $w
21done | tac
22## STDOUT:
23two
24one
25## END
26
27#### While Loop ends pipeline
28seq 3 | while read i
29do
30 echo ".$i"
31done
32## STDOUT:
33.1
34.2
35.3
36## END
37
38#### Redirect in Pipeline
39echo hi 1>&2 | wc -l
40## stdout: 0
41## BUG zsh stdout: 1
42
43#### Pipeline comments
44echo abcd | # input
45 # blank line
46tr a-z A-Z # transform
47## stdout: ABCD
48
49#### Exit code is last status
50echo a | egrep '[0-9]+'
51## status: 1
52
53#### Initial value of PIPESTATUS is empty string
54case $SH in dash|zsh) exit ;; esac
55
56echo pipestatus ${PIPESTATUS[@]}
57## STDOUT:
58pipestatus
59## END
60## BUG mksh STDOUT:
61pipestatus 0
62## END
63## N-I dash/zsh STDOUT:
64## END
65
66#### PIPESTATUS
67return3() {
68 return 3
69}
70{ sleep 0.03; exit 1; } | { sleep 0.02; exit 2; } | { sleep 0.01; return3; }
71echo ${PIPESTATUS[@]}
72## stdout: 1 2 3
73## N-I dash status: 2
74## N-I dash stdout-json: ""
75## N-I zsh status: 0
76## N-I zsh STDOUT:
77
78## END
79
80#### PIPESTATUS is set on simple commands
81case $SH in dash|zsh) exit ;; esac
82
83false
84echo pipestatus ${PIPESTATUS[@]}
85
86exit 55 | (exit 44)
87echo pipestatus ${PIPESTATUS[@]}
88
89true
90echo pipestatus ${PIPESTATUS[@]}
91
92## STDOUT:
93pipestatus 1
94pipestatus 55 44
95pipestatus 0
96## END
97## N-I dash/zsh STDOUT:
98## END
99
100#### PIPESTATUS with shopt -s lastpipe
101shopt -s lastpipe
102return3() {
103 return 3
104}
105{ sleep 0.03; exit 1; } | { sleep 0.02; exit 2; } | { sleep 0.01; return3; }
106echo ${PIPESTATUS[@]}
107## stdout: 1 2 3
108## N-I dash status: 2
109## N-I dash stdout-json: ""
110## N-I zsh status: 0
111## N-I zsh STDOUT:
112
113## END
114
115#### |&
116stdout_stderr.py |& cat
117## STDOUT:
118STDERR
119STDOUT
120## END
121## status: 0
122## N-I dash/mksh stdout-json: ""
123## N-I dash status: 2
124## N-I osh stdout-json: ""
125## N-I osh status: 1
126
127#### ! turns non-zero into zero
128! $SH -c 'exit 42'; echo $?
129## stdout: 0
130## status: 0
131
132#### ! turns zero into 1
133! $SH -c 'exit 0'; echo $?
134## stdout: 1
135## status: 0
136
137#### ! in if
138if ! echo hi; then
139 echo TRUE
140else
141 echo FALSE
142fi
143## STDOUT:
144hi
145FALSE
146## END
147## status: 0
148
149#### ! with ||
150! echo hi || echo FAILED
151## STDOUT:
152hi
153FAILED
154## END
155## status: 0
156
157#### ! with { }
158! { echo 1; echo 2; } || echo FAILED
159## STDOUT:
1601
1612
162FAILED
163## END
164## status: 0
165
166#### ! with ( )
167! ( echo 1; echo 2 ) || echo FAILED
168## STDOUT:
1691
1702
171FAILED
172## END
173## status: 0
174
175#### ! is not a command
176v='!'
177$v echo hi
178## status: 127
179
180#### Evaluation of argv[0] in pipeline occurs in child
181${cmd=echo} hi | wc -l
182echo "cmd=$cmd"
183## STDOUT:
1841
185cmd=
186## END
187## BUG zsh STDOUT:
1881
189cmd=echo
190## END
191
192#### bash/dash/mksh run the last command is run in its own process
193echo hi | read line
194echo "line=$line"
195## stdout: line=hi
196## OK bash/dash/mksh stdout: line=
197
198#### shopt -s lastpipe (always on in OSH)
199shopt -s lastpipe
200echo hi | read line
201echo "line=$line"
202## stdout: line=hi
203## N-I dash/mksh stdout: line=
204
205#### shopt -s lastpipe (always on in OSH)
206shopt -s lastpipe
207i=0
208seq 3 | while read line; do
209 (( i++ ))
210done
211echo i=$i
212## stdout: i=3
213## N-I dash/mksh stdout: i=0
214
215
216#### SIGPIPE causes pipeline to die (regression for issue #295)
217cat /dev/urandom | sleep 0.1
218echo ${PIPESTATUS[@]}
219
220# hm bash gives '1 0' which seems wrong
221
222## STDOUT:
223141 0
224## END
225## BUG bash STDOUT:
2261 0
227## END
228## N-I zsh stdout:
229## N-I dash status: 2
230## N-I dash stdout-json: ""
231
232#### Nested pipelines
233{ sleep 0.1 | seq 3; } | cat
234{ sleep 0.1 | seq 10; } | { cat | cat; } | wc -l
235## STDOUT:
2361
2372
2383
23910
240## END
241
242#### Pipeline in eval
243ls /dev/null | eval 'cat | cat' | wc -l
244## STDOUT:
2451
246## END
247
248
249#### shopt -s lastpipe and shopt -s no_last_fork interaction
250
251case $SH in dash) exit ;; esac
252
253$SH -c '
254shopt -s lastpipe
255set -o errexit
256set -o pipefail
257
258ls | false | wc -l'
259echo status=$?
260
261# Why does this give status 0? It should fail
262
263$SH -c '
264shopt -s lastpipe
265shopt -s no_fork_last # OSH only
266set -o errexit
267set -o pipefail
268
269ls | false | wc -l'
270echo status=$?
271
272## STDOUT:
2730
274status=1
2750
276status=1
277## END
278
279## N-I dash STDOUT:
280## END