[Toybox] Imported toysh blog test cases into OSH
Andy Chu
andychup at gmail.com
Fri Jun 26 12:52:29 PDT 2020
(contributor from 4 years ago here, no longer on the list)
Hi Rob, I noticed that you've again been trying to figure out bash on
the blog: http://landley.net/notes.html
I imported 28 shell snippets as test cases into my shell test framework:
http://travis-ci.oilshell.org/jobs/2020-06-26__18-40-53.wwz/_tmp/spec/survey/toysh.html
(7 cases running against 3 shells)
http://travis-ci.oilshell.org/jobs/2020-06-26__18-40-53.wwz/_tmp/spec/survey/toysh-posix.html
(21 cases running against 6 shells)
(these specific links will go away but they're always 2 clicks away
from http://travis-ci.oilshell.org/jobs/ -- ovm- tarball -> spec
tests )
Summary:
- OSH passes 22 cases, more than any other shell
- The cases found 3 divergences/bugs in OSH, 2 unimplemented features,
and 3 (documented) known differences
Results: https://github.com/oilshell/oil/issues/780
So thanks for posting these cases.
For background, OSH is able to run many real bash scripts -- in fact
Aboriginal Linux and other Linux distro scripts in January 2018 was a
significant milestone. Now it can run neofetch (a 10K line bash
script) and Lisp/brainfuck/JSON in bash.
http://www.oilshell.org/blog/
-----
While I'm grateful for the test cases, reading the blog is a bit
painful because it's clear you will never finish your shell with the
current strategy (and this is an informed opinion, after doing it
myself).
I think you're less than 10% done with 3K lines of code. I think you
will agree with my assessment if you scroll through this issue:
https://github.com/oilshell/oil/issues/653
Your test cases are good, but there are so many features you haven't
even begun to think about.
A couple things I would suggest:
1) Learn about grammars and parsing, and look at the POSIX shell
grammar, which all shells obey. There are a few test cases that are
completely non-controversial and answered by POSIX that you were
confused by -- e.g. test case #12 on for loop parsing, #5 on
pipelines, #21 on pipelines all run under 6 shells. It's POSIX, and
shells follow the POSIX grammar. POSIX is necessary but not
sufficient (I would say it covers ~25% of bash's syntax).
Parsing and grammars are a compact way of reasoning about corner cases
-- more compact than C code. Run say
osh -n -c 'echo ${@@Q}'
to see that in action.
2) Use some of the test cases and framework I developed and automated:
http://travis-ci.oilshell.org/jobs/2020-06-26__18-40-53.wwz/_tmp/spec/survey/osh.html
This test suite includes knowledge from other people, e.g. the author
of what I believe is the biggest bash program in the world (ble.sh at
30K+ lines). Another shell semantic for you to ponder:
https://github.com/oilshell/oil/issues/706#issuecomment-615578349
Summary: bash is inconsistent with itself regarding "unset". After
much analysis, OSH chose a simpler behavior that can run the biggest
bash programs in the world.
Andy
More information about the Toybox
mailing list