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 shopt --unset no_osh_builtins # for alias
188
189 # TODO: CRASH bug!
190 # use ///osh/bash-strict.sh
191
192 my-name() { echo sh-func; }
193
194 alias my-name=$'echo my \u03bc \xff alias'
195
196 mkdir -p dir
197 echo 'echo hi' > dir/my-name
198 chmod +x dir/my-name
199
200 # BUG:
201 # 1. we start with OSH, and initialize $PATH
202 # 2. then we mutate $PATH
203 # 3. shopt --set ysh:all
204 # 4. now we look at ENV.PATH, which isn't changed
205 PATH=$PWD/dir:$PATH
206 #echo $PATH
207
208 if false; then
209 command -v my-name
210 echo
211 type -a my-name #bash-strict
212 echo
213 fi
214
215 shopt --set ysh:all
216
217 proc my-name { echo proc }
218
219 proc myInvoke { echo hi }
220 var methods = Obj.new({__invoke__: myInvoke})
221 var myobj = Obj.new({}, methods)
222
223 if false {
224 type -a my-name #bash-strict
225 echo
226 }
227
228 invoke --show my-name myobj eval cd zzz | sed 's/#.qtt8/%.qtt8/'
229
230 ## STDOUT:
231 %.qtt8 name kind detail
232 my-name alias b'echo my μ \yff alias'
233 my-name proc -
234 my-name sh-func -
235 myobj proc invokable
236 eval builtin special
237 cd builtin -
238 zzz - -
239 ## END
240
241 ## N-I bash STDOUT:
242 ## END
243
244
245 #### invoke --show does proper quoting
246 case $SH in bash) exit ;; esac
247
248 alias $'bad-alias=echo \xff\necho z'
249
250 bad-alias | od -A n -t x1
251
252 # sed hack for test framework bug
253 invoke --show bad-alias | sed 's/#.qtt8/%.qtt8/'
254
255 #alias $'bad=hi\xffname=echo hi'
256 #$'bad\xffname'
257
258 ## STDOUT:
259 ff 0a 7a 0a
260 %.qtt8 name kind detail
261 bad-alias alias b'echo \yff\necho z'
262 ## END
263
264 ## N-I bash STDOUT:
265 ## END
266
267 #### builtin sleep behaves like external sleep
268 case $SH in
269 *osh) prefix='builtin' ;;
270 *) prefix='' ;;
271 esac
272
273 $prefix sleep
274 if test "$?" != 0; then
275 echo ok
276 fi
277
278 # This is different! OSH is stricter
279 if false; then
280 $prefix sleep --
281 if test "$?" != 0; then
282 echo ok
283 fi
284 fi
285
286 $prefix sleep -2
287 if test "$?" != 0; then
288 echo ok
289 fi
290
291 $prefix sleep -- -2
292 if test "$?" != 0; then
293 echo ok
294 fi
295
296 $prefix sleep zz
297 if test "$?" != 0; then
298 echo ok
299 fi
300
301 $prefix sleep 0
302 echo status=$?
303
304 $prefix sleep -- 0
305 echo status=$?
306
307 $prefix sleep '0.0005'
308 echo status=$?
309
310 $prefix sleep '+0.0005'
311 echo status=$?
312
313 ## STDOUT:
314 ok
315 ok
316 ok
317 ok
318 status=0
319 status=0
320 status=0
321 status=0
322 ## END
323
324 #### builtin sleep usage errors
325 case $SH in bash) exit ;; esac
326
327 builtin sleep 0.5s
328 echo status=$?
329
330 builtin sleep 0.1 extra
331 echo status=$?
332
333 ## STDOUT:
334 status=2
335 status=2
336 ## END
337 ## N-I bash STDOUT:
338 ## END
339
340 #### sleep without prefix is still external
341
342 # should not work
343 builtin sleep --version
344 if test "$?" != '0'; then
345 echo ok
346 fi
347
348 sleep --version | head -n 1 >& 2
349 echo status=$?
350
351 ## STDOUT:
352 ok
353 status=0
354 ## END
355
356 #### builtin cat
357
358 case $SH in
359 *osh) prefix='builtin' ;;
360 *) prefix='' ;;
361 esac
362
363 seq 2 3 | $prefix cat
364 echo ---
365
366 # from file
367 #echo FOO > foo
368 #$prefix cat foo foo
369
370 ## STDOUT:
371 2
372 3
373 ---
374 ## END
375
376 #### builtin cat usage
377 case $SH in
378 *osh) prefix='builtin' ;;
379 *) prefix='' ;;
380 esac
381
382 $prefix cat --bad >/dev/null
383 if test "$?" != 0; then
384 echo ok
385 fi
386
387 $prefix cat -z
388 if test "$?" != 0; then
389 echo ok
390 fi
391
392 seq 3 4 | $prefix cat --
393 echo status=$?
394
395 ## STDOUT:
396 ok
397 ok
398 3
399 4
400 status=0
401 ## END
402
403 #### builtin cat non nonexistent file
404 case $SH in
405 *osh) prefix='builtin' ;;
406 *) prefix='' ;;
407 esac
408
409 echo FOO > foo
410
411 $prefix cat foo nonexistent foo
412 echo status=$?
413
414 ## STDOUT:
415 FOO
416 FOO
417 status=1
418 ## END
419
420 #### builtin cat accept - for stdin
421 case $SH in
422 *osh) prefix='builtin' ;;
423 *) prefix='' ;;
424 esac
425
426 echo FOO > foo
427 seq 3 4 | $prefix cat foo - foo foo
428
429 echo ---
430
431 # second - is a no-op
432 seq 5 6 | $prefix cat - -
433
434 ## STDOUT:
435 FOO
436 3
437 4
438 FOO
439 FOO
440 ---
441 5
442 6
443 ## END
444
445 #### builtin rm: usage, removing files
446 case $SH in
447 *osh) prefix='builtin' ;;
448 *) prefix='' ;;
449 esac
450
451 $prefix rm
452 if test "$?" != 0; then echo ok; fi
453
454 $prefix rm --
455 if test "$?" != 0; then echo ok; fi
456
457 $prefix rm -- nonexistent
458 echo status=$?
459
460 touch foo bar
461 $prefix rm -- foo bar
462 echo status=$?
463
464 if test -f foo; then echo fail; fi
465 if test -f bar; then echo fail; fi
466
467 ## STDOUT:
468 ok
469 ok
470 status=1
471 status=0
472 ## END
473
474 #### builtin rm -f - ignores arguments that don't exist
475 case $SH in
476 *osh) prefix='builtin' ;;
477 *) prefix='' ;;
478 esac
479
480 touch foo bar
481 $prefix rm -- foo OOPS bar
482 echo status=$?
483
484 if test -f foo; then echo fail; fi
485 if test -f bar; then echo fail; fi
486
487 touch foo bar
488 $prefix rm -f -- foo OOPS bar
489 echo status=$?
490
491 if test -f foo; then echo fail; fi
492 if test -f bar; then echo fail; fi
493
494 ## STDOUT:
495 status=1
496 status=0
497 ## END
498
499 #### builtin rm -f - still fails when file can't be removed
500
501 mkdir read-only
502 touch read-only/stuck
503 chmod -w read-only
504 ls -l stuck
505
506 touch foo bar
507 $prefix rm -- read-only/stuck foo bar
508 echo status=$?
509
510 if test -f foo; then echo fail; fi
511 if test -f bar; then echo fail; fi
512
513 ls read-only/stuck
514
515 touch foo bar
516 $prefix rm -- read-only/stuck foo bar
517 echo status=$?
518
519 # Clean up for real
520 chmod +w read-only
521 $prefix rm -- read-only/stuck
522 echo status=$?
523
524 if test -f read-only/stuck; then echo fail; fi
525
526 ## STDOUT:
527 status=1
528 read-only/stuck
529 status=1
530 status=0
531 ## END
532
533 #### builtin rm -f allows empty arg list
534 case $SH in
535 *osh) prefix='builtin' ;;
536 *) prefix='' ;;
537 esac
538
539 $prefix rm -f
540 echo status=$?
541
542 ## STDOUT:
543 status=0
544 ## END
545
546 #### builtin rm always fails on directories (regardless of -f)
547 case $SH in
548 *osh) prefix='builtin' ;;
549 *) prefix='' ;;
550 esac
551
552 touch foo bar
553 mkdir -p tmp
554 $prefix rm -- foo tmp bar
555 echo status=$?
556
557 if test -f foo; then echo fail; fi
558 if test -f bar; then echo fail; fi
559
560 touch foo bar
561 mkdir -p tmp
562 $prefix rm -f -- foo tmp bar
563 echo status=$?
564
565 if test -f foo; then echo fail; fi
566 if test -f bar; then echo fail; fi
567
568 ## STDOUT:
569 status=1
570 status=1
571 ## END
572
573 #### builtin readlink
574 case $SH in bash) exit ;; esac
575
576 echo TODO
577
578 # turn this into a builtin
579 # does that mean any builtin can be externalized?
580 # - [ aka test is a good candiate
581 # - we have stubs from true/false
582
583 ## STDOUT:
584 ## END
585
586 ## N-I bash STDOUT:
587 ## END
588
589 #### compgen -A builtin doesn't find private builtins
590
591 compgen -A builtin slee
592 echo status=$?
593
594 ## STDOUT:
595 status=1
596 ## END