Changes for version 0.03 - 2026-11-03
- Proc::ShellSubset::Large accepts forms dash and bash run alike (items P1-P4 of "Shell Corpus Gaps"): '{' and '}' inside words where no brace expansion can start; $( ), `...`, ${#NAME} and $((...)) inside $((...)); setting PS1, PS4, HOSTNAME, PIPESTATUS and BASH; export $v[=value]; exit N above 255; umask -S; command -p PROGRAM. '{' or '}' as a command name, and '{NAME}' right before a redirection (bash: a named descriptor), stay rejected (tests LS:212-245).
- Proc::ShellSpawn, Proc::ShellSpawn::Large: run those forms ($( ) inside $(( )) expanded first; exit N modulo 256; umask -S; command -p with /usr/bin:/bin; export with a name from an expansion, checked at run time).
- The borrowed test pool: the scripts that made t/parser/shell-subset-corpus-tests.pl are now in doc/parsers/tools/ (extract, run, group, gentests, prov, verify and the reports), with the grouping of 2026-10-29 (groups.tsv); doc/test-pools.md says how to rebuild every pool and measurement from the pinned sources (checked: all 612 snippet IDs restore their texts exactly).
- Measuring against dash and bash by the shells alone: doc/large-subset/large-subset-state.md (the rules, which beats which, the figures, the work list); large-subset-dialect-features.md (every probed feature, blatant or subtle, with who decided it); tools/large-subset-features.pl (the detector, and the per-test record t/parser/large-subset-shells.tsv), tools/large-subset-verdicts.txt (verdicts kept by hand, postponed ones as free text), and a new tools/large-subset-yardsticks.pl (the old one sorted our parser's own messages).
- doc/pspawn-known-issues.md: X21 (the programs echo, [, printf, kill on Windows), X22 (bash 5.2.21 goes on after some special-builtin errors, against its manual).
- Items the user agreed to on "Shell Corpus Gaps" (2026-11-03): B1 alias and unalias (the parser expands aliases in the lines after a top-level definition, as both shells do; the executor keeps the table for eval and . text); B2 history, fc, bind, help, compopt, logout and set -o history do nothing by default (parser and run() option interactive => reject|nop|dash), and the executor looks command names up in a list of tables, @Proc::ShellSpawn::CMDS, which other modules can extend; B3 jobs, bg, fg, hash, type, times and reading ulimit, with dash's texts and statuses, in the new module Proc::ShellSpawn::Builtins; P5 and R1 [ and test are the program, and '<' or '>' between two operands need the parser option test_lt_gt; Y2 a backslash at the very end is a literal \; Y3 tldr's <Enter> in one-line here-documents, and lines with keystrokes left out of the measurement; Q1 kill with a SIG signal name is rejected (both shells refuse it).
- Every measured figure in doc/ names the version it was measured on (pre-0.01, 0.01, 0.02, early-post-0.02, 0.03; the table is in doc/README.md). The figures of 0.03 were measured again on the release: the corpus yardsticks, the work list and the totals over the tests came out the same. Corrected: spec section 8's ShellCheck figures (now as in the ceiling document), test-pools.md's size of the per-test record (1,066 lines), and the count of samples accepted only thanks to class X (258, not 259); test-pools.md's regrouping count is of 0.03 (577 groups, checked).
- doc/checklists/corpus-gaps.html is the page "Shell Corpus Gaps" as published (its third version, with the figures of 0.03), and doc/large-subset/pages/gaps-items.txt.lede its lede (the lede had been edited only in the published page). t/dash-known.txt no longer lists the line of largebattery.txt with an alias as a known difference: since B1 it agrees with dash, so a change there now fails t/dash.t.
- lib/Proc/Spawner/Docs.pod: a map of the Markdown documents in doc/; doc/large-subset/large-subset-state.md.html: the same text as the .md, with a Markdeep footer (an experiment in how MetaCPAN shows them).
- Proc::ShellSubset::Large no longer claims the package name Proc::ShellSubset for the PAUSE indexer (MetaCPAN showed it as the home of Proc::ShellSubset).
Documentation
a map of the design documents shipped in doc/ (EXPERIMENTAL)
Modules
builtins of the large shell subset: alias, the job builtins, and the interactive ones (EXPERIMENTAL)
parse a Bourne-shell subset into a tree (EXPERIMENTAL)
parse as much of POSIX sh as dash and bash run alike (EXPERIMENTAL)
the Proc::ShellSubset grammar with its options frozen (EXPERIMENTAL)
start children with posix_spawn(3) and run the one event loop (EXPERIMENTAL)
Provides
in lib/Proc/ShellSpawn.pm
in lib/Proc/ShellSpawn/Large.pm
in lib/Proc/Spawner/Graph.pm