1 ## oils_failures_allowed: 0
2
3 #### Customize PS4
4 shopt -s ysh:upgrade
5 set -x
6
7 # Reuse the default
8 PS4=$['$LINENO ' ++ PS4]
9 echo 1; echo 2
10 echo 3
11 ## STDOUT:
12 1
13 2
14 3
15 ## END
16 ## STDERR:
17 5 . builtin echo 1
18 5 . builtin echo 2
19 6 . builtin echo 3
20 ## END
21
22
23 #### no_xtrace_osh doesn't show [[ ]] etc.
24 shopt -s ysh:upgrade
25 set -x
26
27 dir=/
28 if [[ -d $dir ]]; then
29 (( a = 42 ))
30 fi
31 cd /
32
33 ## stdout-json: ""
34 ## STDERR:
35 . builtin cd /
36 ## END
37
38 #### no_xtrace_osh UNSET, and xtrace_rich set
39 shopt --set ysh:upgrade
40 shopt --unset no_xtrace_osh
41 shopt --unset errexit
42 set -x
43
44 {
45 env false
46 set +x
47 } 2>err.txt
48
49 sed --regexp-extended 's/[[:digit:]]{2,}/12345/g' err.txt >&2
50
51 ## STDOUT:
52 ## END
53 ## STDERR:
54 | command 12345: env 'false'
55 ; process 12345: status 1
56 . builtin set '+x'
57 ## END
58
59 #### proc and shell function
60 shopt --set ysh:upgrade
61 set -x
62
63 shfunc() {
64 : $1
65 }
66
67 proc p (x) {
68 : $x
69 }
70
71 shfunc 1
72 p 2
73 ## stdout-json: ""
74 ## STDERR:
75 > proc shfunc 1
76 . builtin ':' 1
77 < proc shfunc
78 > proc p 2
79 . builtin ':' 2
80 < proc p
81 ## END
82
83 #### eval
84 shopt --set ysh:upgrade
85 set -x
86
87 eval 'echo 1; echo 2'
88 ## STDOUT:
89 1
90 2
91 ## END
92 ## STDERR:
93 > eval
94 . builtin echo 1
95 . builtin echo 2
96 < eval
97 ## END
98
99 #### source
100 echo 'echo "\$1 = $1"' > lib.sh
101
102 shopt --set ysh:upgrade
103 set -x
104
105 source lib.sh a b c
106
107 # Test the quoting style. TODO: Don't use bash style in YSH.
108
109 source lib.sh x $'\xfe' $'\xff'
110
111 ## STDOUT:
112 $1 = a
113 $1 = x
114 ## END
115 ## STDERR:
116 > source lib.sh a b c
117 . builtin echo '$1 = a'
118 < source lib.sh
119 > source lib.sh x $'\xfe' $'\xff'
120 . builtin echo '$1 = x'
121 < source lib.sh
122 ## END
123
124 #### external and builtin
125 shopt --set ysh:upgrade
126 shopt --unset errexit
127 set -x
128
129 {
130 env false
131 true
132 set +x
133 } 2>err.txt
134
135 # normalize PIDs, assumed to be 2 or more digits
136 sed --regexp-extended 's/[[:digit:]]{2,}/12345/g' err.txt >&2
137
138 ## stdout-json: ""
139 ## STDERR:
140 | command 12345: env 'false'
141 ; process 12345: status 1
142 . builtin 'true'
143 . builtin set '+x'
144 ## END
145
146 #### subshell
147 shopt --set ysh:upgrade
148 shopt --unset errexit
149 set -x
150
151 proc p {
152 : p
153 }
154
155 {
156 : begin
157 (
158 : 1
159 p
160 exit 3
161 )
162 set +x
163 } 2>err.txt
164
165 # Hack: sort for determinism
166 sed --regexp-extended 's/[[:digit:]]{2,}/12345/g' err.txt | LANG=C sort >&2
167
168 ## stdout-json: ""
169 ## STDERR:
170 . 12345 builtin ':' p
171 + 12345 exit 3
172 . 12345 builtin ':' 1
173 < 12345 proc p
174 > 12345 proc p
175 . builtin ':' begin
176 . builtin set '+x'
177 ; process 12345: status 3
178 | forkwait 12345
179 ## END
180
181 #### command sub
182 shopt --set ysh:upgrade
183 set -x
184
185 {
186 echo foo=$(echo bar)
187 set +x
188
189 } 2>err.txt
190
191 # HACK: sort because xtrace output has non-determinism.
192 # This is arguably a bug -- see issue #995.
193 # The real fix might be to sys.stderr.flush() in few places?
194 sed --regexp-extended 's/[[:digit:]]{2,}/12345/g' err.txt | LANG=C sort >&2
195
196 ## STDOUT:
197 foo=bar
198 ## END
199 ## STDERR:
200 . 12345 builtin echo bar
201 . builtin echo 'foo=bar'
202 . builtin set '+x'
203 ; process 12345: status 0
204 | command sub 12345
205 ## END
206
207 #### process sub (nondeterministic)
208 shopt --set ysh:upgrade
209 shopt --unset errexit
210 set -x
211
212 # we wait() for them all at the end
213
214 {
215 : begin
216 tac <(seq 3 4) <(echo 1)
217 set +x
218 } 2>err.txt
219
220 # SORT for determinism
221 sed --regexp-extended 's/[[:digit:]]{2,}/12345/g; s|/fd/.|/fd/N|g' err.txt |
222 LC_ALL=C sort >&2
223 #cat err.txt >&2
224
225 ## STDOUT:
226 4
227 3
228 1
229 ## END
230
231 ## STDERR:
232 . 12345 builtin echo 1
233 . 12345 exec seq 3 4
234 . builtin ':' begin
235 . builtin set '+x'
236 ; process 12345: status 0
237 ; process 12345: status 0
238 ; process 12345: status 0
239 | command 12345: tac /dev/fd/N /dev/fd/N
240 | proc sub 12345
241 | proc sub 12345
242 ## END
243
244 #### pipeline (nondeterministic)
245 shopt --set ysh:upgrade
246 set -x
247
248 myfunc() {
249 echo 1
250 echo 2
251 }
252
253 {
254 : begin
255 myfunc | sort | wc -l
256 set +x
257 } 2>err.txt
258
259 do_sort=1
260
261 if test -n $do_sort; then
262 # SORT for determinism
263 sed --regexp-extended 's/[[:digit:]]{2,}/12345/g; s|/fd/.|/fd/N|g' err.txt |
264 LC_ALL=C sort >&2
265 else
266 cat err.txt
267 fi
268
269 ## STDOUT:
270 2
271 ## END
272 ## STDERR:
273 . 12345 builtin echo 1
274 . 12345 builtin echo 2
275 . 12345 exec sort
276 < 12345 proc myfunc
277 > 12345 proc myfunc
278 ; process 12345: status 0
279 ; process 12345: status 0
280 ; process 12345: status 0
281 | command 12345: wc -l
282 | part 12345
283 | part 12345
284 . builtin ':' begin
285 . builtin set '+x'
286 < pipeline
287 > pipeline
288 ## END
289
290 #### singleton pipeline
291
292 # Hm extra tracing
293
294 shopt --set ysh:upgrade
295 set -x
296
297 : begin
298 ! false
299 : end
300
301 ## stdout-json: ""
302 ## STDERR:
303 . builtin ':' begin
304 . builtin 'false'
305 . builtin ':' end
306 ## END
307
308 #### Background pipeline (separate code path)
309
310 shopt --set ysh:upgrade
311 shopt --unset errexit
312 set -x
313
314 myfunc() {
315 echo 2
316 echo 1
317 }
318
319 {
320 : begin
321 myfunc | sort | grep ZZZ &
322 wait
323 echo status=$?
324 set +x
325 } 2>err.txt
326
327 # SORT for determinism
328 sed --regexp-extended 's/[[:digit:]]{2,}/12345/g' err.txt |
329 LC_ALL=C sort >&2
330
331 ## STDOUT:
332 status=0
333 ## END
334 ## STDERR:
335 . 12345 builtin echo 1
336 . 12345 builtin echo 2
337 . 12345 exec grep ZZZ
338 . 12345 exec sort
339 ; process 12345: status 0
340 ; process 12345: status 0
341 ; process 12345: status 1
342 < 12345 proc myfunc
343 > 12345 proc myfunc
344 . builtin ':' begin
345 . builtin echo 'status=0'
346 . builtin set '+x'
347 < wait
348 > wait
349 | part 12345
350 | part 12345
351 | part 12345
352 ## END
353
354 #### Background process with fork and & (nondeterministic)
355 shopt --set ysh:upgrade
356 set -x
357
358 {
359 sleep 0.1 &
360 wait
361
362 shopt -s ysh:upgrade
363
364 fork {
365 sleep 0.1
366 }
367 wait
368 set +x
369 } 2>err.txt
370
371 # SORT for determinism
372 sed --regexp-extended 's/[[:digit:]]{2,}/12345/g' err.txt |
373 LC_ALL=C sort >&2
374
375 ## stdout-json: ""
376 ## STDERR:
377 . 12345 exec sleep 0.1
378 . 12345 exec sleep 0.1
379 ; process 12345: status 0
380 ; process 12345: status 0
381 . builtin fork
382 . builtin set '+x'
383 . builtin shopt -s 'ysh:upgrade'
384 < wait
385 < wait
386 > wait
387 > wait
388 | fork 12345
389 | fork 12345
390 ## END
391
392 # others: redirects?
393
394 #### Here doc
395 shopt --set ysh:upgrade
396 shopt --unset errexit
397 set -x
398
399 {
400 : begin
401 tac <<EOF
402 3
403 2
404 EOF
405
406 set +x
407 } 2>err.txt
408
409 sed --regexp-extended 's/[[:digit:]]{2,}/12345/g' err.txt >&2
410
411 ## STDOUT:
412 2
413 3
414 ## END
415 ## STDERR:
416 . builtin ':' begin
417 | command 12345: tac
418 ; process 12345: status 0
419 . builtin set '+x'
420 ## END
421
422 #### Two here docs
423
424 # BUG: This trace shows an extra process?
425
426 shopt --set ysh:upgrade
427 shopt --unset errexit
428 set -x
429
430 {
431 tac - /dev/fd/3 <<EOF 3<<EOF2
432 xx
433 yy
434 EOF
435 zz
436 EOF2
437
438 set +x
439 } 2>err.txt
440
441 sed --regexp-extended 's/[[:digit:]]{2,}/12345/g' err.txt >&2
442
443 ## STDOUT:
444 yy
445 xx
446 zz
447 ## END
448 ## STDERR:
449 | command 12345: tac - /dev/fd/3
450 ; process 12345: status 0
451 . builtin set '+x'
452 ## END
453
454 #### Here doc greater than 4096 bytes
455
456 {
457 echo 'wc -l <<EOF'
458 seq 2000
459 echo 'EOF'
460 } > big-here.sh
461
462 wc -l big-here.sh
463
464 $SH -o ysh:upgrade -x big-here.sh 2>err.txt
465
466 sed --regexp-extended 's/[[:digit:]]{2,}/12345/g' err.txt >&2
467
468 ## STDOUT:
469 2002 big-here.sh
470 2000
471 ## END
472 ## STDERR:
473 | here doc 12345
474 | command 12345: wc -l
475 ; process 12345: status 0
476 ; process 12345: status 0
477 ## END
478
479 #### Control Flow
480 shopt --set ysh:upgrade
481 set -x
482
483 for i in 1 2 3 {
484 echo $i
485 if (i === '2') {
486 break
487 }
488 }
489
490 for j in a b {
491 for k in y z {
492 echo $j $k
493 if (k === 'y') {
494 continue
495 }
496 }
497 }
498
499 proc zero {
500 return 0
501 }
502
503 proc one {
504 return 1
505 }
506
507 zero
508 # one
509
510 ## STDOUT:
511 1
512 2
513 a y
514 a z
515 b y
516 b z
517 ## END
518 ## STDERR:
519 . builtin echo 1
520 . builtin echo 2
521 + break 1
522 . builtin echo a y
523 + continue 1
524 . builtin echo a z
525 . builtin echo b y
526 + continue 1
527 . builtin echo b z
528 > proc zero
529 + return 0
530 < proc zero
531 ## END
532
533 #### use builtin and invokable module
534 shopt --set ysh:upgrade
535
536 # make the trace deterministic
537 cp $REPO_ROOT/spec/testdata/module2/for-xtrace.ysh .
538
539 set -x
540
541 source for-xtrace.ysh
542 echo
543
544 # problem with PS4 here
545 use for-xtrace.ysh # --all-provided
546
547 for-xtrace increment foo bar
548
549 ## STDOUT:
550 [for-xtrace]
551 counter = 5
552
553 [for-xtrace]
554 counter = 5
555 counter = 6
556 ## END
557
558 ## STDERR:
559 > source for-xtrace.ysh
560 . builtin echo '[for-xtrace]'
561 > proc increment
562 . builtin echo 'counter = 5'
563 < proc increment
564 < source for-xtrace.ysh
565 . builtin echo
566 > use for-xtrace.ysh
567 . builtin echo '[for-xtrace]'
568 > proc increment
569 . builtin echo 'counter = 5'
570 < proc increment
571 < use for-xtrace.ysh
572 > module-invoke for-xtrace increment foo bar
573 . builtin echo 'counter = 6'
574 < module-invoke for-xtrace
575 ## END
576
577 #### Encoded argv uses shell encoding, not J8
578
579 shopt --set ysh:upgrade
580 set -x
581
582 echo $'one two\n' $'\u03bc'
583 ## STDOUT:
584 one two
585 μ
586 ## END
587 ## STDERR:
588 . builtin echo $'one two\n' 'μ'
589 ## END