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:
14 two
15 one
16 ## END
17
18 #### For loop starts pipeline
19 for w in one two; do
20 echo $w
21 done | tac
22 ## STDOUT:
23 two
24 one
25 ## END
26
27 #### While Loop ends pipeline
28 seq 3 | while read i
29 do
30 echo ".$i"
31 done
32 ## STDOUT:
33 .1
34 .2
35 .3
36 ## END
37
38 #### Redirect in Pipeline
39 echo hi 1>&2 | wc -l
40 ## stdout: 0
41 ## BUG zsh stdout: 1
42
43 #### Pipeline comments
44 echo abcd | # input
45 # blank line
46 tr a-z A-Z # transform
47 ## stdout: ABCD
48
49 #### Exit code is last status
50 echo a | egrep '[0-9]+'
51 ## status: 1
52
53 #### Initial value of PIPESTATUS is empty string
54 case $SH in dash|zsh) exit ;; esac
55
56 echo pipestatus ${PIPESTATUS[@]}
57 ## STDOUT:
58 pipestatus
59 ## END
60 ## BUG mksh STDOUT:
61 pipestatus 0
62 ## END
63 ## N-I dash/zsh STDOUT:
64 ## END
65
66 #### PIPESTATUS
67 return3() {
68 return 3
69 }
70 { sleep 0.03; exit 1; } | { sleep 0.02; exit 2; } | { sleep 0.01; return3; }
71 echo ${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
81 case $SH in dash|zsh) exit ;; esac
82
83 false
84 echo pipestatus ${PIPESTATUS[@]}
85
86 exit 55 | (exit 44)
87 echo pipestatus ${PIPESTATUS[@]}
88
89 true
90 echo pipestatus ${PIPESTATUS[@]}
91
92 ## STDOUT:
93 pipestatus 1
94 pipestatus 55 44
95 pipestatus 0
96 ## END
97 ## N-I dash/zsh STDOUT:
98 ## END
99
100 #### PIPESTATUS with shopt -s lastpipe
101 shopt -s lastpipe
102 return3() {
103 return 3
104 }
105 { sleep 0.03; exit 1; } | { sleep 0.02; exit 2; } | { sleep 0.01; return3; }
106 echo ${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 #### |&
116 stdout_stderr.py |& cat
117 ## STDOUT:
118 STDERR
119 STDOUT
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
138 if ! echo hi; then
139 echo TRUE
140 else
141 echo FALSE
142 fi
143 ## STDOUT:
144 hi
145 FALSE
146 ## END
147 ## status: 0
148
149 #### ! with ||
150 ! echo hi || echo FAILED
151 ## STDOUT:
152 hi
153 FAILED
154 ## END
155 ## status: 0
156
157 #### ! with { }
158 ! { echo 1; echo 2; } || echo FAILED
159 ## STDOUT:
160 1
161 2
162 FAILED
163 ## END
164 ## status: 0
165
166 #### ! with ( )
167 ! ( echo 1; echo 2 ) || echo FAILED
168 ## STDOUT:
169 1
170 2
171 FAILED
172 ## END
173 ## status: 0
174
175 #### ! is not a command
176 v='!'
177 $v echo hi
178 ## status: 127
179
180 #### Evaluation of argv[0] in pipeline occurs in child
181 ${cmd=echo} hi | wc -l
182 echo "cmd=$cmd"
183 ## STDOUT:
184 1
185 cmd=
186 ## END
187 ## BUG zsh STDOUT:
188 1
189 cmd=echo
190 ## END
191
192 #### bash/dash/mksh run the last command is run in its own process
193 echo hi | read line
194 echo "line=$line"
195 ## stdout: line=hi
196 ## OK bash/dash/mksh stdout: line=
197
198 #### shopt -s lastpipe (always on in OSH)
199 shopt -s lastpipe
200 echo hi | read line
201 echo "line=$line"
202 ## stdout: line=hi
203 ## N-I dash/mksh stdout: line=
204
205 #### shopt -s lastpipe (always on in OSH)
206 shopt -s lastpipe
207 i=0
208 seq 3 | while read line; do
209 (( i++ ))
210 done
211 echo 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)
217 cat /dev/urandom | sleep 0.1
218 echo ${PIPESTATUS[@]}
219
220 # hm bash gives '1 0' which seems wrong
221
222 ## STDOUT:
223 141 0
224 ## END
225 ## BUG bash STDOUT:
226 1 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:
236 1
237 2
238 3
239 10
240 ## END
241
242 #### Pipeline in eval
243 ls /dev/null | eval 'cat | cat' | wc -l
244 ## STDOUT:
245 1
246 ## END
247
248
249 #### shopt -s lastpipe and shopt -s no_last_fork interaction
250
251 case $SH in dash) exit ;; esac
252
253 $SH -c '
254 shopt -s lastpipe
255 set -o errexit
256 set -o pipefail
257
258 ls | false | wc -l'
259 echo status=$?
260
261 # Why does this give status 0? It should fail
262
263 $SH -c '
264 shopt -s lastpipe
265 shopt -s no_fork_last # OSH only
266 set -o errexit
267 set -o pipefail
268
269 ls | false | wc -l'
270 echo status=$?
271
272 ## STDOUT:
273 0
274 status=1
275 0
276 status=1
277 ## END
278
279 ## N-I dash STDOUT:
280 ## END