1 ## compare_shells: bash
2 ## oils_failures_allowed: 1
3
4 #### invoke usage
5 case $SH in bash) exit ;; esac
6
7 invoke
8 echo status=$?
9
10 invoke --
11 echo status=$?
12
13 echo
14
15 invoke sleep 0
16 echo status=$?
17
18 invoke -- sleep 0
19 echo status=$?
20
21 invoke --builtin -- sleep 0
22 echo status=$?
23
24 ## STDOUT:
25 status=2
26 status=2
27
28 status=2
29 status=2
30 status=0
31 ## END
32 ## N-I bash STDOUT:
33 ## END
34
35 #### invoke nonexistent name
36 case $SH in bash) exit ;; esac
37
38 invoke zz
39 echo status=$?
40
41 invoke --builtin zz
42 echo status=$?
43
44 invoke --builtin -- zz
45 echo status=$?
46
47 ## STDOUT:
48 status=2
49 status=127
50 status=127
51 ## END
52 ## N-I bash STDOUT:
53 ## END
54
55 #### invoke fails to find tools
56 case $SH in bash) exit ;; esac
57
58 invoke --builtin ls
59 echo status=$?
60
61 invoke --sh-func ls
62 echo status=$?
63
64 invoke --proc ls
65 echo status=$?
66
67 invoke --extern zzz
68 echo status=$?
69
70 ## STDOUT:
71 status=127
72 status=127
73 status=127
74 status=127
75 ## END
76 ## N-I bash STDOUT:
77 ## END
78
79 #### invoke --proc --sh-func --builtin --extern
80 case $SH in bash) exit ;; esac
81
82 true() {
83 echo 'sh-func true'
84 }
85
86 shopt --set ysh:all
87
88 proc true {
89 echo 'proc true'
90 }
91
92 # Now INVOKE each one
93
94 echo --sh-func
95 invoke --sh-func true
96 echo status=$?
97 echo
98
99 echo --proc
100 invoke --proc true
101 echo status=$?
102 echo
103
104 echo --builtin
105 invoke --builtin true --help || true
106 echo status=$?
107 echo
108
109 echo --extern
110 invoke --extern true
111 echo status=$?
112 echo
113
114 ## STDOUT:
115 --sh-func
116 sh-func true
117 status=0
118
119 --proc
120 proc true
121 status=0
122
123 --builtin
124 status=0
125
126 --extern
127 status=0
128
129 ## END
130 ## N-I bash STDOUT:
131 ## END
132
133 #### invoke --proc doesn't run shell functions
134 case $SH in bash) exit ;; esac
135
136 true() {
137 echo sh-func true
138 }
139
140 invoke --proc true
141 echo status=$?
142
143 ## STDOUT:
144 status=127
145 ## END
146 ## N-I bash STDOUT:
147 ## END
148
149 #### type and command builtin don't find private sleep
150
151 remove-path() { sed 's;/.*/;;'; }
152
153 type -t sleep
154 type sleep | remove-path
155 echo
156
157 # this is meant to find the "first word"
158 type -a sleep | remove-path | uniq
159 echo
160
161 command -v sleep | remove-path
162
163 ## STDOUT:
164 file
165 sleep is sleep
166
167 sleep is sleep
168
169 sleep
170 ## END
171
172 #### but invoke --show finds the private builtin
173 case $SH in bash) exit ;; esac
174
175 invoke --show sleep | grep builtin
176
177 ## STDOUT:
178 sleep builtin private
179 ## END
180
181 ## N-I bash STDOUT:
182 ## END
183
184 #### invoke --show with many types
185 case $SH in bash) exit ;; esac
186
187 # TODO: CRASH bug!
188 # use ///osh/bash-strict.sh
189
190 my-name() { echo sh-func; }
191
192 alias my-name=$'echo my \u03bc \xff alias'
193
194 mkdir -p dir
195 echo 'echo hi' > dir/my-name
196 chmod +x dir/my-name
197
198 # BUG:
199 # 1. we start with OSH, and initialize $PATH
200 # 2. then we mutate $PATH
201 # 3. shopt --set ysh:all
202 # 4. now we look at ENV.PATH, which isn't changed
203 PATH=$PWD/dir:$PATH
204 #echo $PATH
205
206 if false; then
207 command -v my-name
208 echo
209 type -a my-name #bash-strict
210 echo
211 fi
212
213 shopt --set ysh:all
214
215 proc my-name { echo proc }
216
217 proc myInvoke { echo hi }
218 var methods = Obj.new({__invoke__: myInvoke})
219 var myobj = Obj.new({}, methods)
220
221 if false {
222 type -a my-name #bash-strict
223 echo
224 }
225
226 invoke --show my-name myobj eval cd zzz | sed 's/#.qtt8/%.qtt8/'
227
228 ## STDOUT:
229 %.qtt8 name kind detail
230 my-name alias b'echo my μ \yff alias'
231 my-name proc -
232 my-name sh-func -
233 myobj proc invokable
234 eval builtin special
235 cd builtin -
236 zzz - -
237 ## END
238
239 ## N-I bash STDOUT:
240 ## END
241
242
243 #### invoke --show does proper quoting
244 case $SH in bash) exit ;; esac
245
246 alias $'bad-alias=echo \xff\necho z'
247
248 bad-alias | od -A n -t x1
249
250 # sed hack for test framework bug
251 invoke --show bad-alias | sed 's/#.qtt8/%.qtt8/'
252
253 #alias $'bad=hi\xffname=echo hi'
254 #$'bad\xffname'
255
256 ## STDOUT:
257 ff 0a 7a 0a
258 %.qtt8 name kind detail
259 bad-alias alias b'echo \yff\necho z'
260 ## END
261
262 ## N-I bash STDOUT:
263 ## END
264
265 #### builtin sleep behaves like external sleep
266 case $SH in
267 *osh) prefix='builtin' ;;
268 *) prefix='' ;;
269 esac
270
271 $prefix sleep
272 if test "$?" != 0; then
273 echo ok
274 fi
275
276 # This is different! OSH is stricter
277 if false; then
278 $prefix sleep --
279 if test "$?" != 0; then
280 echo ok
281 fi
282 fi
283
284 $prefix sleep -2
285 if test "$?" != 0; then
286 echo ok
287 fi
288
289 $prefix sleep -- -2
290 if test "$?" != 0; then
291 echo ok
292 fi
293
294 $prefix sleep zz
295 if test "$?" != 0; then
296 echo ok
297 fi
298
299 $prefix sleep 0
300 echo status=$?
301
302 $prefix sleep -- 0
303 echo status=$?
304
305 $prefix sleep '0.0005'
306 echo status=$?
307
308 $prefix sleep '+0.0005'
309 echo status=$?
310
311 ## STDOUT:
312 ok
313 ok
314 ok
315 ok
316 status=0
317 status=0
318 status=0
319 status=0
320 ## END
321
322 #### builtin sleep usage errors
323 case $SH in bash) exit ;; esac
324
325 builtin sleep 0.5s
326 echo status=$?
327
328 builtin sleep 0.1 extra
329 echo status=$?
330
331 ## STDOUT:
332 status=2
333 status=2
334 ## END
335 ## N-I bash STDOUT:
336 ## END
337
338 #### sleep without prefix is still external
339
340 # should not work
341 builtin sleep --version
342 if test "$?" != '0'; then
343 echo ok
344 fi
345
346 sleep --version | head -n 1 >& 2
347 echo status=$?
348
349 ## STDOUT:
350 ok
351 status=0
352 ## END
353
354 #### builtin cat
355
356 case $SH in
357 *osh) prefix='builtin' ;;
358 *) prefix='' ;;
359 esac
360
361 seq 2 3 | $prefix cat
362 echo ---
363
364 # from file
365 #echo FOO > foo
366 #$prefix cat foo foo
367
368 ## STDOUT:
369 2
370 3
371 ---
372 ## END
373
374 #### builtin cat usage
375 case $SH in
376 *osh) prefix='builtin' ;;
377 *) prefix='' ;;
378 esac
379
380 $prefix cat --bad >/dev/null
381 if test "$?" != 0; then
382 echo ok
383 fi
384
385 $prefix cat -z
386 if test "$?" != 0; then
387 echo ok
388 fi
389
390 seq 3 4 | $prefix cat --
391 echo status=$?
392
393 ## STDOUT:
394 ok
395 ok
396 3
397 4
398 status=0
399 ## END
400
401 #### builtin cat non nonexistent file
402 case $SH in
403 *osh) prefix='builtin' ;;
404 *) prefix='' ;;
405 esac
406
407 echo FOO > foo
408
409 $prefix cat foo nonexistent foo
410 echo status=$?
411
412 ## STDOUT:
413 FOO
414 FOO
415 status=1
416 ## END
417
418 #### builtin cat accept - for stdin
419 case $SH in
420 *osh) prefix='builtin' ;;
421 *) prefix='' ;;
422 esac
423
424 echo FOO > foo
425 seq 3 4 | $prefix cat foo - foo foo
426
427 echo ---
428
429 # second - is a no-op
430 seq 5 6 | $prefix cat - -
431
432 ## STDOUT:
433 FOO
434 3
435 4
436 FOO
437 FOO
438 ---
439 5
440 6
441 ## END
442
443 #### builtin rm: usage, removing files
444 case $SH in
445 *osh) prefix='builtin' ;;
446 *) prefix='' ;;
447 esac
448
449 $prefix rm
450 if test "$?" != 0; then echo ok; fi
451
452 $prefix rm --
453 if test "$?" != 0; then echo ok; fi
454
455 $prefix rm -- nonexistent
456 echo status=$?
457
458 touch foo bar
459 $prefix rm -- foo bar
460 echo status=$?
461
462 if test -f foo; then echo fail; fi
463 if test -f bar; then echo fail; fi
464
465 ## STDOUT:
466 ok
467 ok
468 status=1
469 status=0
470 ## END
471
472 #### builtin rm -f - ignores arguments that don't exist
473 case $SH in
474 *osh) prefix='builtin' ;;
475 *) prefix='' ;;
476 esac
477
478 touch foo bar
479 $prefix rm -- foo OOPS bar
480 echo status=$?
481
482 if test -f foo; then echo fail; fi
483 if test -f bar; then echo fail; fi
484
485 touch foo bar
486 $prefix rm -f -- foo OOPS bar
487 echo status=$?
488
489 if test -f foo; then echo fail; fi
490 if test -f bar; then echo fail; fi
491
492 ## STDOUT:
493 status=1
494 status=0
495 ## END
496
497 #### builtin rm -f - still fails when file can't be removed
498
499 mkdir read-only
500 touch read-only/stuck
501 chmod -w read-only
502 ls -l stuck
503
504 touch foo bar
505 $prefix rm -- read-only/stuck foo bar
506 echo status=$?
507
508 if test -f foo; then echo fail; fi
509 if test -f bar; then echo fail; fi
510
511 ls read-only/stuck
512
513 touch foo bar
514 $prefix rm -- read-only/stuck foo bar
515 echo status=$?
516
517 # Clean up for real
518 chmod +w read-only
519 $prefix rm -- read-only/stuck
520 echo status=$?
521
522 if test -f read-only/stuck; then echo fail; fi
523
524 ## STDOUT:
525 status=1
526 read-only/stuck
527 status=1
528 status=0
529 ## END
530
531 #### builtin rm -f allows empty arg list
532 case $SH in
533 *osh) prefix='builtin' ;;
534 *) prefix='' ;;
535 esac
536
537 $prefix rm -f
538 echo status=$?
539
540 ## STDOUT:
541 status=0
542 ## END
543
544 #### builtin rm always fails on directories (regardless of -f)
545 case $SH in
546 *osh) prefix='builtin' ;;
547 *) prefix='' ;;
548 esac
549
550 touch foo bar
551 mkdir -p tmp
552 $prefix rm -- foo tmp bar
553 echo status=$?
554
555 if test -f foo; then echo fail; fi
556 if test -f bar; then echo fail; fi
557
558 touch foo bar
559 mkdir -p tmp
560 $prefix rm -f -- foo tmp bar
561 echo status=$?
562
563 if test -f foo; then echo fail; fi
564 if test -f bar; then echo fail; fi
565
566 ## STDOUT:
567 status=1
568 status=1
569 ## END
570
571 #### builtin readlink
572 case $SH in bash) exit ;; esac
573
574 echo TODO
575
576 # turn this into a builtin
577 # does that mean any builtin can be externalized?
578 # - [ aka test is a good candiate
579 # - we have stubs from true/false
580
581 ## STDOUT:
582 ## END
583
584 ## N-I bash STDOUT:
585 ## END
586
587 #### compgen -A builtin doesn't find private builtins
588
589 compgen -A builtin slee
590 echo status=$?
591
592 ## STDOUT:
593 status=1
594 ## END