Results for osh-only.test.sh

statusoshosh_.pyosh_.cc
pass 400
FAIL 044
total444
caseoshosh_.pyosh_.ccdescription
0pass FAIL FAIL --debug-file
detailsdetails
1pass FAIL FAIL crash dump
detailsdetails
2pass FAIL FAIL crash dump with source
detailsdetails
3pass FAIL FAIL help index
detailsdetails
4 passed, 0 OK, 0 not implemented, 0 BUG, 8 failed, 0 timeouts, 0 cases skipped

Details on runs that didn't PASS

osh_.py0 --debug-file

[osh_.py stdout] Expected 'yes\n', got "(cmd_value.Argv argv:[--debug-file '/debug.txt' -c true] arg_spids:[2 4 7 9])\n(cmd_value.Argv argv:[grep 'OSH started with' '/debug.txt'] arg_spids:[13 15 19])\nyes\n"

stdout:
(cmd_value.Argv argv:[--debug-file '/debug.txt' -c true] arg_spids:[2 4 7 9])
(cmd_value.Argv argv:[grep 'OSH started with' '/debug.txt'] arg_spids:[13 15 19])
yes
stderr:
Unhandled SimpleCommand
Unhandled SimpleCommand
osh_.cc0 --debug-file

[osh_.cc stdout] Expected 'yes\n', got "(cmd_value.Argv argv:[--debug-file '/debug.txt' -c true] arg_spids:[2 4 7 9])\n(cmd_value.Argv argv:[grep 'OSH started with' '/debug.txt'] arg_spids:[13 15 19])\nyes\n"

stdout:
(cmd_value.Argv argv:[--debug-file '/debug.txt' -c true] arg_spids:[2 4 7 9])
(cmd_value.Argv argv:[grep 'OSH started with' '/debug.txt'] arg_spids:[13 15 19])
yes
stderr:
Unhandled SimpleCommand
Unhandled SimpleCommand
osh_.py1 crash dump

[osh_.py stdout] Expected 'status=1\nstatus=0\n', got '(cmd_value.Argv argv:[rm -f \'/*.json\'] arg_spids:[0 2 4])\n(cmd_value.Argv\n argv: [\n -c\n\'\\ng() {\\n local glocal="glocal"\\n echo $(( 1 / 0 ))\\n}\\nf() {\\n local flocal="flocal"\\n shift\\n FOO=bar g\\n}\\nreadonly array=(A B C)\\nf "${array[@]}"\\n\'\n dummy\n a\n b\n c\n ]\n arg_spids: [14 16 31 33 35 37]\n)\nstatus=0\n(cmd_value.Argv argv:[python2 -m json.tool \'/*.json\'] arg_spids:[44 46 48 50])\nstatus=0\n'

stdout:
(cmd_value.Argv argv:[rm -f '/*.json'] arg_spids:[0 2 4])
(cmd_value.Argv
  argv: [
    -c
'\ng() {\n  local glocal="glocal"\n  echo $(( 1 / 0 ))\n}\nf() {\n  local flocal="flocal"\n  shift\n  FOO=bar g\n}\nreadonly array=(A B C)\nf "${array[@]}"\n'
    dummy
    a
    b
    c
  ]
  arg_spids: [14 16 31 33 35 37]
)
status=0
(cmd_value.Argv argv:[python2 -m json.tool '/*.json'] arg_spids:[44 46 48 50])
status=0
stderr:
Unhandled SimpleCommand
Unhandled SimpleCommand
Unhandled SimpleCommand
osh_.cc1 crash dump

[osh_.cc stdout] Expected 'status=1\nstatus=0\n', got '(cmd_value.Argv argv:[rm -f \'/*.json\'] arg_spids:[0 2 4])\n(cmd_value.Argv\n argv: [\n -c\n\'\\ng() {\\n local glocal="glocal"\\n echo $(( 1 / 0 ))\\n}\\nf() {\\n local flocal="flocal"\\n shift\\n FOO=bar g\\n}\\nreadonly array=(A B C)\\nf "${array[@]}"\\n\'\n dummy\n a\n b\n c\n ]\n arg_spids: [14 16 31 33 35 37]\n)\nstatus=0\n(cmd_value.Argv argv:[python2 -m json.tool \'/*.json\'] arg_spids:[44 46 48 50])\nstatus=0\n'

stdout:
(cmd_value.Argv argv:[rm -f '/*.json'] arg_spids:[0 2 4])
(cmd_value.Argv
  argv: [
    -c
'\ng() {\n  local glocal="glocal"\n  echo $(( 1 / 0 ))\n}\nf() {\n  local flocal="flocal"\n  shift\n  FOO=bar g\n}\nreadonly array=(A B C)\nf "${array[@]}"\n'
    dummy
    a
    b
    c
  ]
  arg_spids: [14 16 31 33 35 37]
)
status=0
(cmd_value.Argv argv:[python2 -m json.tool '/*.json'] arg_spids:[44 46 48 50])
status=0
stderr:
Unhandled SimpleCommand
Unhandled SimpleCommand
Unhandled SimpleCommand
osh_.py2 crash dump with source

[osh_.py stdout] Expected 'status=1\nOK\n', got "(cmd_value.Argv argv:[-c '\\nset -o errexit\\nsource spec/testdata/crash.sh\\n'] arg_spids:[5 7])\nstatus=0\n"

stdout:
(cmd_value.Argv argv:[-c '\nset -o errexit\nsource spec/testdata/crash.sh\n'] arg_spids:[5 7])
status=0
stderr:
Unhandled SimpleCommand
+ set -o errexit
+ (lvalue.Named name:ok spids:[32]) = (value.Str s:0)
+ test -s '/*.json'
+ test 0 -ge 1
osh_.cc2 crash dump with source

[osh_.cc stdout] Expected 'status=1\nOK\n', got "(cmd_value.Argv argv:[-c '\\nset -o errexit\\nsource spec/testdata/crash.sh\\n'] arg_spids:[5 7])\nstatus=0\n"

stdout:
(cmd_value.Argv argv:[-c '\nset -o errexit\nsource spec/testdata/crash.sh\n'] arg_spids:[5 7])
status=0
stderr:
Unhandled SimpleCommand
+ set -o errexit
osh_.py3 help index

[osh_.py stdout] Expected 'index 0\nindex groups 0\nindex ZZZ 1\n', got '\x1b[7m Overview \x1b[0;0m\n\n [Usage] bundle-usage osh-usage oil-usage config startup\n line-editing prompt\n [Lexing] comment # line-continuation \\\n [Oil Lexing] X single-command %%% X docstring ###\n\n\x1b[7m Command Language \x1b[0;0m\n\n [Commands] simple-command semicolon ;\n [Conditional] case if true false colon :\n bang ! and && or || dbracket [[\n [Iteration] while until for for-expr-sh ((\n [Control Flow] break continue return exit\n [Grouping] function block { subshell (\n [Concurrency] pipe | X |&\n ampersand &\n [Redirects] redir-file > >> >| < <> X &>\n redir-desc >& <&\n here-doc << <<- <<<\n [Other Command] dparen (( time X coproc X select\n [Oil Keywords] proc return equal =\n\n\x1b[7m Variable Assignments \x1b[0;0m\n\n [Operators] assign str=\'xyz\'\n append str+=\'abc\'\n [Compound Data] array array=(a b c) array[1]=B "${a[@]}"\n assoc assoc=([\'a\']=1 [\'b\']=2) assoc[\'x\']=b\n [Builtins] local readonly export unset shift\n declare typeset X let\n [Oil Keywords] const var setvar set setlocal setglobal setref\n\n\x1b[7m Oil Expression Language \x1b[0;0m\n\n [Functions] proc-decl proc p (x, y, @rest, &block) { echo hi }\n func-call f(x, y)\n [Literals] oil-string c\'line\\n\' r\'[a-z]\\n\'\n oil-array @(a b c)\n [Regexes] re-literal /d+/\n re-compound ~ (group) <capture> sequence\n re-primitive %zero Subpattern @subpattern\n \'sq\' "dq" $x ${x}\n named-classes dot digit space word d s w\n class-literal [c a-z \'abc\' \\\\ \\xFF \\u0100]\n re-flags ignorecase etc.\n re-multiline ///\n re-glob-ops ~ !~\n\n\x1b[7m Word Language \x1b[0;0m\n\n [Quotes] quotes \'abc\' $\'\\n\' "$var"\n [Substitutions] com-sub $(command) `command`\n var-sub ${var} $0 $9 \n arith-sub $((1 + 2))\n tilde-sub ~/src\n proc-sub diff <(sort L.txt) <(sort R.txt)\n [Var Ops] op-test ${x:-default} \n op-unary ${x%%suffix} etc.\n op-str ${x//y/z}\n op-slice ${a[@]:0:1}\n op-format ${x@P}\n [Oil Word] inline-call $strfunc(x, y) @arrayfunc(z)\n splice @array @ARGV\n X oil-printf ${x %.3f}\n X oil-format ${x|html}\n\n\x1b[7m Other Shell Sublanguages \x1b[0;0m\n\n [Arithmetic] arith-context Where legacy arithmetic is allowed\n num-literals 0xFF 0755 etc.\n math 1 + 2*3\n arith-logical !a && b\n bitwise ~a ^ b\n arith-assign a *= 2\n [Boolean] dbracket [[ vs. the test builtin\n bool-expr [[ ! $x && $y || $z ]]\n test ! $x -a $y -o $z\n bool-infix [[ $a -nt $b ]] [[ $x == $y ]]\n bool-path [[ -d /etc ]]\n bool-str [[ -z \'\' ]]\n bool-other [[ -o errexit ]]\n [Patterns] glob *.py\n extglob @(*.py|*.sh)\n regex [[ foo =~ [a-z]+ ]]\n [Brace Expand] braces {alice,bob}@example.com\n [History] histsub !$ !! !n\n\n\x1b[7m Builtin Commands \x1b[0;0m\n\n [I/O] read echo \n X readarray X mapfile\n [Run Code] source . eval trap\n [Set Options] set shopt\n [Working Dir] cd pwd pushd popd dirs\n [Completion] complete compgen compopt compadjust\n [Shell Process] exec X logout \n umask X ulimit X times\n [Child Process] jobs wait ampersand &\n fg X bg X disown \n [External] test [ printf getopts X kill\n [Introspection] help hash type X caller\n [Word Lookup] command builtin\n [Interactive] alias unalias history X fc X bind\nX [Unsupported] enable\n [Oil Builtins] cd X shopt X env compatible, and takes a block\n X fork X wait replaces & and (), takes a block\n X fopen Many open streams, takes a block\n X use source with namespace, file-relative \n X opts getopts replacement\n push add elements to end of array\n repr Show debug representation of vars\n getline Instead of read -raw :name\n write like echo, but with --, -sep, -end\n X log X die common functions (polyfill)\n [Data Formats] json X tsv2 X html X struct/binary\nX [External Lang] BEGIN END when (awk)\n rule (make) each (xargs) fs (find)\nX [Testing] check\n\n\x1b[7m Shell Options \x1b[0;0m\n\n [Errors] nounset pipefail errexit inherit_errexit\n [Globbing] noglob nullglob X failglob dashglob\n [Debugging] xtrace X verbose X extdebug\n [Interactive] emacs vi\n [Other Option] X noclobber\n [strict:all] * All options starting with \'strict_\'\n strict_argv No empty argv\n strict_arith Fatal parse errors (on by default)\n strict_array Arrays don\'t decay to strings\n strict_control_flow trap misplaced break/continue\n strict_echo echo takes 0 or 1 arguments\n strict_errexit Disallow code that ignores failure\n strict_eval_builtin eval takes exactly 1 argument\n strict_nameref trap invalid variable names\n strict_word_eval Expose unicode and slicing errors\n strict_tilde Tilde subst can result in error\n X strict_backslash Parse the sublanguage more strictly\n X strict_glob Parse the sublanguage more strictly\n X strict_trap Function name only\n parse_ignored Parse and silently ignore?\n [oil:basic] * Enable Oil functionality\n parse_at echo @array @arrayfunc(x, y)\n parse_brace if true { ... }; cd ~/src { ... }\n parse_paren if (x > 0) ...\n X parse_redir_expr >> var x << \'here string\'\n X longopts test -file, read -delim, etc.\n more_errexit More errexit checks -- at command sub\n simple_word_eval No splitting, static globbing\n dashglob Disabled to avoid files like -rf\n [oil:nice] * The full Oil language\n parse_equals x = \'s\' (for cleaner config blocks)\n parse_set instead of setvar\n X parse_amp echo hi &2 > /dev/null\n X parse_dollar_slash egrep $/ d+ / *.txt\n X parse_dparen remove ((\n X parse_rawc r\'\\\' c\'\\n\' c"$x\\n"\n X simple_test_builtin Only file tests, remove [, status 2\n X no_old_builtins local/declare/etc. pushd/popd/dirs\n ... source unset printf [un]alias\n ... getopts\n X no_old_syntax [[ $(( )) ${x%prefix} $$\n $\'\\n\' @(*.sh|*.py) `echo comsub`\n ${a[@]}\n [Compatibility] eval_unsafe_arith parse_dynamic_arith\n verbose_errexit\n\n\x1b[7m Environment Variables \x1b[0;0m\n\n [Shell Options] SHELLOPTS X BASHOPTS\n [Other Env] HOME PATH IFS\n [Oil Paths] ?builtins ?completion_plugins ?coprocesses\n\n\x1b[7m Special Variables \x1b[0;0m\n\n [POSIX Special] $@ $* $# $? $- $$ $! $0 $9\n [Other Special] BASH_REMATCH @PIPESTATUS\n [Oil Special] ARGV STATUS M\n [Platform] HOSTNAME OSTYPE OIL_VERSION\n [Call Stack] @BASH_SOURCE @FUNCNAME @BASH_LINENO \n X @BASH_ARGV X @BASH_ARGC\n [Tracing] LINENO SOURCE_NAME\n [Process State] X BASHPID X PPID UID EUID \nX [Process Stack] BASH_SUBSHELL SHLVL\nX [Shell State] BASH_CMDS @DIRSTACK\n [Completion] @COMP_WORDS COMP_CWORD COMP_LINE COMP_POINT\n COMP_WORDBREAKS @COMPREPLY X COMP_KEY\n X COMP_TYPE COMP_ARGV\n [cd] PWD OLDPWD X CDPATH\n [getopts] OPTIND OPTARG X OPTERR\n [read] REPLY IFS\n [Functions] X RANDOM X SECONDS\n\n\x1b[7m Plugins and Hooks \x1b[0;0m\n\n [Signals] SIGTERM X SIGINT X SIGABRT SIG...\n [Traps] EXIT X ERR X DEBUG X RETURN\n [Words] PS1 X PS2 X PS3 PS4\n [Completion] complete\n [Other Plugin] X command_not_found PROMPT_COMMAND\n\n\x1b[7m Oil Libraries \x1b[0;0m\n\n [Collections] len() copy()\n [Pattern] regmatch() fnmatch()\n [String] find() sub() join() \n split() $IFS, awk algorithm, regex\n [Word] glob() maybe()\n [Better Syntax] shquote()\n lstrip() rstrip() lstripglob() rstripglob()\n upper() lower()\n strftime()\n [Arrays] index()\n [Assoc Arrays] @names() @values()\n [Block] setvar() for procs to set in outer scope\n evalblock() procs evaluate block to namespace\nX [Hashing] sha1 sha256 (etc.)\n\nindex 0\n\x1b[7m Command Language \x1b[0;0m\n\n [Commands] simple-command semicolon ;\n [Conditional] case if true false colon :\n bang ! and && or || dbracket [[\n [Iteration] while until for for-expr-sh ((\n [Control Flow] break continue return exit\n [Grouping] function block { subshell (\n [Concurrency] pipe | X |&\n ampersand &\n [Redirects] redir-file > >> >| < <> X &>\n redir-desc >& <&\n here-doc << <<- <<<\n [Other Command] dparen (( time X coproc X select\n [Oil Keywords] proc return equal =\n\n\x1b[7m Variable Assignments \x1b[0;0m\n\n [Operators] assign str=\'xyz\'\n append str+=\'abc\'\n [Compound Data] array array=(a b c) array[1]=B "${a[@]}"\n assoc assoc=([\'a\']=1 [\'b\']=2) assoc[\'x\']=b\n [Builtins] local readonly export unset shift\n declare typeset X let\n [Oil Keywords] const var setvar set setlocal setglobal setref\n\nindex groups 0\nindex ZZZ 1\n'

stdout:
 Overview 

  [Usage]         bundle-usage   osh-usage   oil-usage   config   startup
                  line-editing   prompt
  [Lexing]        comment #   line-continuation \
  [Oil Lexing]    X single-command %%%   X docstring ###

 Command Language 

  [Commands]      simple-command   semicolon ;
  [Conditional]   case   if   true   false   colon :
                  bang !   and &&   or ||   dbracket [[
  [Iteration]     while   until   for   for-expr-sh ((
  [Control Flow]  break   continue   return   exit
  [Grouping]      function   block {   subshell (
  [Concurrency]   pipe   |   X |&
                  ampersand &
  [Redirects]     redir-file  >  >>  >|  <  <>   X &>
                  redir-desc  >&  <&
                  here-doc    <<  <<-  <<<
  [Other Command] dparen ((   time   X coproc   X select
  [Oil Keywords]  proc   return   equal =

 Variable Assignments 

  [Operators]     assign        str='xyz'
                  append        str+='abc'
  [Compound Data] array         array=(a b c)   array[1]=B   "${a[@]}"
                  assoc         assoc=(['a']=1 ['b']=2)   assoc['x']=b
  [Builtins]      local   readonly   export   unset   shift
                  declare   typeset   X let
  [Oil Keywords]  const   var   setvar   set   setlocal   setglobal   setref

 Oil Expression Language 

  [Functions]     proc-decl     proc p (x, y, @rest, &block) { echo hi }
                  func-call     f(x, y)
  [Literals]      oil-string    c'line\n'  r'[a-z]\n'
                  oil-array     @(a b c)
  [Regexes]       re-literal    /d+/
                  re-compound   ~   (group)   <capture>   sequence
                  re-primitive  %zero   Subpattern   @subpattern
                                'sq'   "dq"   $x   ${x}
                  named-classes dot  digit  space  word  d  s  w
                  class-literal [c a-z 'abc' \\ \xFF \u0100]
                  re-flags      ignorecase etc.
                  re-multiline  ///
                  re-glob-ops   ~   !~

 Word Language 

  [Quotes]        quotes        'abc'  $'\n'  "$var"
  [Substitutions] com-sub       $(command)   `command`
                  var-sub       ${var}   $0   $9   
                  arith-sub     $((1 + 2))
                  tilde-sub     ~/src
                  proc-sub      diff <(sort L.txt) <(sort R.txt)
  [Var Ops]       op-test       ${x:-default}  
                  op-unary      ${x%%suffix}  etc.
                  op-str        ${x//y/z}
                  op-slice      ${a[@]:0:1}
                  op-format     ${x@P}
  [Oil Word]      inline-call   $strfunc(x, y) @arrayfunc(z)
                  splice        @array @ARGV
                  X oil-printf  ${x %.3f}
                  X oil-format  ${x|html}

 Other Shell Sublanguages 

  [Arithmetic]    arith-context Where legacy arithmetic is allowed
                  num-literals  0xFF  0755  etc.
                  math          1 + 2*3
                  arith-logical !a && b
                  bitwise       ~a ^ b
                  arith-assign  a *= 2
  [Boolean]       dbracket      [[ vs. the test builtin
                  bool-expr       [[ ! $x && $y || $z ]]
                                test ! $x -a $y -o $z
                  bool-infix    [[ $a -nt $b ]]  [[ $x == $y ]]
                  bool-path     [[ -d /etc ]]
                  bool-str      [[ -z '' ]]
                  bool-other    [[ -o errexit ]]
  [Patterns]      glob          *.py
                  extglob       @(*.py|*.sh)
                  regex         [[ foo =~ [a-z]+ ]]
  [Brace Expand]  braces        {alice,bob}@example.com
  [History]       histsub       !$  !!  !n

 Builtin Commands 

  [I/O]           read   echo 
                  X readarray   X mapfile
  [Run Code]      source .   eval   trap
  [Set Options]   set   shopt
  [Working Dir]   cd   pwd   pushd   popd   dirs
  [Completion]    complete   compgen   compopt   compadjust
  [Shell Process] exec   X logout 
                  umask   X ulimit   X times
  [Child Process] jobs   wait   ampersand &
                  fg   X bg   X disown 
  [External]      test [   printf   getopts   X kill
  [Introspection] help   hash   type   X caller
  [Word Lookup]   command   builtin
  [Interactive]   alias   unalias   history   X fc   X bind
X [Unsupported]   enable
  [Oil Builtins]  cd   X shopt   X env   compatible, and takes a block
                  X fork   X wait        replaces & and (), takes a block
                  X fopen                Many open streams, takes a block
                  X use                  source with namespace, file-relative 
                  X opts                 getopts replacement
                  push                   add elements to end of array
                  repr                   Show debug representation of vars
                  getline                Instead of read -raw :name
                  write                  like echo, but with --, -sep, -end
                  X log   X die          common functions (polyfill)
  [Data Formats]  json   X tsv2   X html   X struct/binary
X [External Lang] BEGIN   END   when (awk)
                  rule (make)   each (xargs)   fs (find)
X [Testing]       check

 Shell Options 

  [Errors]        nounset   pipefail   errexit   inherit_errexit
  [Globbing]      noglob   nullglob   X failglob   dashglob
  [Debugging]     xtrace   X verbose   X extdebug
  [Interactive]   emacs   vi
  [Other Option]  X noclobber
  [strict:all]    * All options starting with 'strict_'
                  strict_argv            No empty argv
                  strict_arith           Fatal parse errors (on by default)
                  strict_array           Arrays don't decay to strings
                  strict_control_flow    trap misplaced break/continue
                  strict_echo            echo takes 0 or 1 arguments
                  strict_errexit         Disallow code that ignores failure
                  strict_eval_builtin    eval takes exactly 1 argument
                  strict_nameref         trap invalid variable names
                  strict_word_eval       Expose unicode and slicing errors
                  strict_tilde           Tilde subst can result in error
                  X strict_backslash     Parse the sublanguage more strictly
                  X strict_glob          Parse the sublanguage more strictly
                  X strict_trap          Function name only
                  parse_ignored          Parse and silently ignore?
  [oil:basic]     * Enable Oil functionality
                  parse_at               echo @array @arrayfunc(x, y)
                  parse_brace            if true { ... }; cd ~/src { ... }
                  parse_paren            if (x > 0) ...
                  X parse_redir_expr     >> var x   << 'here string'
                  X longopts             test -file, read -delim, etc.
                  more_errexit           More errexit checks --  at command sub
                  simple_word_eval       No splitting, static globbing
                  dashglob               Disabled to avoid files like -rf
  [oil:nice]      * The full Oil language
                  parse_equals           x = 's' (for cleaner config blocks)
                  parse_set              instead of setvar
                  X parse_amp            echo hi &2 > /dev/null
                  X parse_dollar_slash   egrep $/ d+ / *.txt
                  X parse_dparen         remove ((
                  X parse_rawc           r'\'   c'\n'   c"$x\n"
                  X simple_test_builtin  Only file tests, remove [, status 2
                  X no_old_builtins      local/declare/etc.  pushd/popd/dirs
                                         ... source  unset  printf  [un]alias
                                         ... getopts
                  X no_old_syntax        [[   $(( ))  ${x%prefix}   $$
                                         $'\n'   @(*.sh|*.py)  `echo comsub`
                                         ${a[@]}
  [Compatibility] eval_unsafe_arith   parse_dynamic_arith
                  verbose_errexit

 Environment Variables 

  [Shell Options] SHELLOPTS   X BASHOPTS
  [Other Env]     HOME   PATH   IFS
  [Oil Paths]     ?builtins   ?completion_plugins   ?coprocesses

 Special Variables 

  [POSIX Special] $@  $*  $#     $?  $-     $$  $!   $0  $9
  [Other Special] BASH_REMATCH   @PIPESTATUS
  [Oil Special]   ARGV   STATUS   M
  [Platform]      HOSTNAME   OSTYPE   OIL_VERSION
  [Call Stack]    @BASH_SOURCE   @FUNCNAME   @BASH_LINENO   
                  X @BASH_ARGV   X @BASH_ARGC
  [Tracing]       LINENO   SOURCE_NAME
  [Process State] X BASHPID   X PPID   UID   EUID   
X [Process Stack] BASH_SUBSHELL   SHLVL
X [Shell State]   BASH_CMDS   @DIRSTACK
  [Completion]    @COMP_WORDS   COMP_CWORD   COMP_LINE   COMP_POINT
                  COMP_WORDBREAKS   @COMPREPLY   X COMP_KEY
                  X COMP_TYPE   COMP_ARGV
  [cd]            PWD   OLDPWD   X CDPATH
  [getopts]       OPTIND   OPTARG   X OPTERR
  [read]          REPLY   IFS
  [Functions]     X RANDOM   X SECONDS

 Plugins and Hooks 

  [Signals]       SIGTERM   X SIGINT   X SIGABRT   SIG...
  [Traps]         EXIT   X ERR   X DEBUG   X RETURN
  [Words]         PS1   X PS2   X PS3   PS4
  [Completion]    complete
  [Other Plugin]  X command_not_found   PROMPT_COMMAND

 Oil Libraries 

  [Collections]   len()   copy()
  [Pattern]       regmatch()   fnmatch()
  [String]        find()   sub()   join() 
                  split()             $IFS, awk algorithm, regex
  [Word]          glob()   maybe()
  [Better Syntax] shquote()
                  lstrip()   rstrip()   lstripglob()   rstripglob()
                  upper()   lower()
                  strftime()
  [Arrays]        index()
  [Assoc Arrays]  @names()   @values()
  [Block]         setvar()            for procs to set in outer scope
                  evalblock()         procs evaluate block to namespace
X [Hashing]       sha1   sha256 (etc.)

index 0
 Command Language 

  [Commands]      simple-command   semicolon ;
  [Conditional]   case   if   true   false   colon :
                  bang !   and &&   or ||   dbracket [[
  [Iteration]     while   until   for   for-expr-sh ((
  [Control Flow]  break   continue   return   exit
  [Grouping]      function   block {   subshell (
  [Concurrency]   pipe   |   X |&
                  ampersand &
  [Redirects]     redir-file  >  >>  >|  <  <>   X &>
                  redir-desc  >&  <&
                  here-doc    <<  <<-  <<<
  [Other Command] dparen ((   time   X coproc   X select
  [Oil Keywords]  proc   return   equal =

 Variable Assignments 

  [Operators]     assign        str='xyz'
                  append        str+='abc'
  [Compound Data] array         array=(a b c)   array[1]=B   "${a[@]}"
                  assoc         assoc=(['a']=1 ['b']=2)   assoc['x']=b
  [Builtins]      local   readonly   export   unset   shift
                  declare   typeset   X let
  [Oil Keywords]  const   var   setvar   set   setlocal   setglobal   setref

index groups 0
index ZZZ 1
stderr:
[??? no location ???] Invalid help index group: 'ZZZ'
osh_.cc3 help index

[osh_.cc stdout] Expected 'index 0\nindex groups 0\nindex ZZZ 1\n', got ''
[osh_.cc status] Expected 0, got -6

stdout:
stderr: 
osh_eval.dbg: mycpp/mylib.cc:179: List<Str *> *Str::splitlines(bool): Assertion `keep == true' failed.