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
|