Results for var-ref.test.sh

statusbashoshosh_ALT
pass 844
ok 211
N-I 011
FAIL 044
total101010
casebashoshosh_ALTdescription
0pass pass pass var ref ${!a}
1pass FAIL FAIL var ref: positional params
detailsdetails
2pass N-I N-I var ref to $? with '?'
detailsdetails
3pass FAIL FAIL indirection, *then* fancy expansion features
detailsdetails
4pass FAIL FAIL indirection *to* an array reference
detailsdetails
5ok pass pass indirection to nasty complex array references
details
6ok pass pass indirection *to* fancy expansion features bash disallows
details
7pass FAIL FAIL declare -n and ${!a}
detailsdetails
8pass ok ok Bad var ref with ${!a}
detailsdetails
9pass pass pass ${!OPTIND} (used by bash completion
16 passed, 4 OK, 2 not implemented, 0 BUG, 4 failed, 0 timeouts, 0 cases skipped
4 failed under osh

Details on runs that didn't PASS

osh1 var ref: positional params

[osh stdout] Expected '|x|\n|x|y|\n|x y|\n', got '|x|\n|x|y|\n|x|y|\n'

stdout:
|x|
|x|y|
|x|y|
stderr:
osh_ALT1 var ref: positional params

[osh_ALT stdout] Expected '|x|\n|x|y|\n|x y|\n', got '|x|\n|x|y|\n|x|y|\n'

stdout:
|x|
|x|y|
|x|y|
stderr:
osh2 var ref to $? with '?'

stdout:
myfunc
stderr:
    echo ${!ref}
            ^~~
[ stdin ]:3: fatal: Bad indirect expansion: '?'
osh_ALT2 var ref to $? with '?'

stdout:
myfunc
stderr:
    echo ${!ref}
            ^~~
[ stdin ]:3: fatal: Bad indirect expansion: '?'
osh3 indirection, *then* fancy expansion features

[osh stdout] Expected 'ok\n', got '${!b[1]} -> expected asdf, got asdf x\n${!y:-foo} -> expected foo, got y yy\n${!x:-foo} -> expected aaabcc, got x xd xx\nz zip zz vs foo\n$zz -> expected foo, got \nz zip zz vs foo\n$zz -> expected foo, got \nbad success: ${!w:?oops}\nbad err msg: ${!w:?oops} -> 13:32:52 up 18 days, 14:32, 19 users, load average: 5.21, 2.38, 2.46\nUSER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT\n${!x:?oops} -> expected aaabcc, got x xd xx\n${!y:+foo} -> expected , got y yy\n${!x:+foo} -> expected foo, got x xd xx\n${!x:2} -> expected abcc, got \n${!x:2:2} -> expected ab, got \n${!x#*a} -> expected aabcc, got x xd xx\n${!x%%c*} -> expected aaab, got x xd xx\n${!x/a*b/d} -> expected dcc, got \n${!x^a} -> expected Aaabcc, got x xd xx\n${!p@P} -> expected $ , got p pp\nok\n'

stdout:
${!b[1]} -> expected asdf, got asdf x
${!y:-foo} -> expected foo, got y yy
${!x:-foo} -> expected aaabcc, got x xd xx
z zip zz vs foo
$zz -> expected foo, got 
z zip zz vs foo
$zz -> expected foo, got 
bad success: ${!w:?oops}
bad err msg: ${!w:?oops} ->  13:32:52 up 18 days, 14:32, 19 users,  load average: 5.21, 2.38, 2.46
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
${!x:?oops} -> expected aaabcc, got x xd xx
${!y:+foo} -> expected , got y yy
${!x:+foo} -> expected foo, got x xd xx
${!x:2} -> expected abcc, got 
${!x:2:2} -> expected ab, got 
${!x#*a} -> expected aabcc, got x xd xx
${!x%%c*} -> expected aaab, got x xd xx
${!x/a*b/d} -> expected dcc, got 
${!x^a} -> expected Aaabcc, got x xd xx
${!p@P} -> expected $ , got p pp
ok
stderr:
Traceback (most recent call last):
  File "/home/andy/git/oilshell/oil/bin/oil.py", line 918, in <module>
    sys.exit(main(sys.argv))
  File "/home/andy/git/oilshell/oil/bin/oil.py", line 876, in main
    return AppBundleMain(argv)
  File "/home/andy/git/oilshell/oil/bin/oil.py", line 846, in AppBundleMain
    status = ShellMain('osh', argv0, main_argv, login_shell)
  File "/home/andy/git/oilshell/oil/bin/oil.py", line 656, in ShellMain
    status = main_loop.Batch(ex, c_parser, arena, nodes_out=nodes_out)
  File "/home/andy/git/oilshell/oil/core/main_loop.py", line 163, in Batch
    is_return, is_fatal = ex.ExecuteAndCatch(node)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 1574, in ExecuteAndCatch
    status = self._Execute(node, fork_external=fork_external)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 1521, in _Execute
    status, check_errexit = self._Dispatch(node, fork_external)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 864, in _Dispatch
    status = self._RunSimpleCommand(cmd_val, fork_external)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 623, in _RunSimpleCommand
    return self.RunSimpleCommand(cmd_val, fork_external)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 689, in RunSimpleCommand
    status = self._RunProc(func_node, argv[1:])
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 1740, in _RunProc
    status = self._Execute(func_node.body)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 1521, in _Execute
    status, check_errexit = self._Dispatch(node, fork_external)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 1160, in _Dispatch
    status = self._ExecuteList(node.children)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 1542, in _ExecuteList
    status = self._Execute(child)  # last status wins
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 1521, in _Execute
    status, check_errexit = self._Dispatch(node, fork_external)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 1072, in _Dispatch
    val = self.word_ev.EvalRhsWord(pair.rhs)
  File "/home/andy/git/oilshell/oil/osh/word_eval.py", line 1210, in EvalRhsWord
    return self.EvalWordToString(word)
  File "/home/andy/git/oilshell/oil/osh/word_eval.py", line 1124, in EvalWordToString
    self._EvalWordPart(p, part_vals, quoted=False)
  File "/home/andy/git/oilshell/oil/osh/word_eval.py", line 979, in _EvalWordPart
    v = self._EvalCommandSub(part.command_list, quoted)
  File "/home/andy/git/oilshell/oil/osh/word_eval.py", line 1537, in _EvalCommandSub
    stdout = self.ex.RunCommandSub(node)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 1628, in RunCommandSub
    _ = p.Start()
  File "/home/andy/git/oilshell/oil/core/process.py", line 723, in Start
    self.thunk.Run()
  File "/home/andy/git/oilshell/oil/core/process.py", line 564, in Run
    self.ex.ExecuteAndCatch(self.node, fork_external=False)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 1574, in ExecuteAndCatch
    status = self._Execute(node, fork_external=fork_external)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 1521, in _Execute
    status, check_errexit = self._Dispatch(node, fork_external)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 1160, in _Dispatch
    status = self._ExecuteList(node.children)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 1542, in _ExecuteList
    status = self._Execute(child)  # last status wins
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 1521, in _Execute
    status, check_errexit = self._Dispatch(node, fork_external)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 864, in _Dispatch
    status = self._RunSimpleCommand(cmd_val, fork_external)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 623, in _RunSimpleCommand
    return self.RunSimpleCommand(cmd_val, fork_external)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 661, in RunSimpleCommand
    status = self._RunBuiltin(builtin_id, cmd_val, fork_external)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 426, in _RunBuiltin
    status = self._RunBuiltinAndRaise(builtin_id, cmd_val, fork_external)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 381, in _RunBuiltinAndRaise
    status = self._Eval(arg_vec)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 259, in _Eval
    return self._EvalHelper(c_parser, src)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 240, in _EvalHelper
    return main_loop.Batch(self, c_parser, self.arena)
  File "/home/andy/git/oilshell/oil/core/main_loop.py", line 163, in Batch
    is_return, is_fatal = ex.ExecuteAndCatch(node)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 1574, in ExecuteAndCatch
    status = self._Execute(node, fork_external=fork_external)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 1521, in _Execute
    status, check_errexit = self._Dispatch(node, fork_external)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 832, in _Dispatch
    cmd_val = self.word_ev.EvalWordSequence2(words, allow_assign=True)
  File "/home/andy/git/oilshell/oil/osh/word_eval.py", line 1475, in EvalWordSequence2
    self._EvalWordToParts(w, False, part_vals)  # not double quoted
  File "/home/andy/git/oilshell/oil/osh/word_eval.py", line 1084, in _EvalWordToParts
    self._EvalWordPart(p, part_vals, quoted=quoted, is_subst=is_subst)
  File "/home/andy/git/oilshell/oil/osh/word_eval.py", line 974, in _EvalWordPart
    self._EvalDoubleQuoted(part.parts, part_vals)
  File "/home/andy/git/oilshell/oil/osh/word_eval.py", line 569, in _EvalDoubleQuoted
    self._EvalWordPart(p, part_vals, quoted=True)
  File "/home/andy/git/oilshell/oil/osh/word_eval.py", line 993, in _EvalWordPart
    self._EvalBracedVarSub(part, part_vals, quoted)
  File "/home/andy/git/oilshell/oil/osh/word_eval.py", line 733, in _EvalBracedVarSub
    maybe_decay_array = not (quoted and part.suffix_op.op_id == Id.VOp3_At)
AttributeError: 'suffix_op__Slice' object has no attribute 'op_id'
Traceback (most recent call last):
  File "/home/andy/git/oilshell/oil/bin/oil.py", line 918, in <module>
    sys.exit(main(sys.argv))
  File "/home/andy/git/oilshell/oil/bin/oil.py", line 876, in main
    return AppBundleMain(argv)
  File "/home/andy/git/oilshell/oil/bin/oil.py", line 846, in AppBundleMain
    status = ShellMain('osh', argv0, main_argv, login_shell)
  File "/home/andy/git/oilshell/oil/bin/oil.py", line 656, in ShellMain
    status = main_loop.Batch(ex, c_parser, arena, nodes_out=nodes_out)
  File "/home/andy/git/oilshell/oil/core/main_loop.py", line 163, in Batch
    is_return, is_fatal = ex.ExecuteAndCatch(node)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 1574, in ExecuteAndCatch
    status = self._Execute(node, fork_external=fork_external)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 1521, in _Execute
    status, check_errexit = self._Dispatch(node, fork_external)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 864, in _Dispatch
    status = self._RunSimpleCommand(cmd_val, fork_external)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 623, in _RunSimpleCommand
    return self.RunSimpleCommand(cmd_val, fork_external)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 689, in RunSimpleCommand
    status = self._RunProc(func_node, argv[1:])
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 1740, in _RunProc
    status = self._Execute(func_node.body)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 1521, in _Execute
    status, check_errexit = self._Dispatch(node, fork_external)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 1160, in _Dispatch
    status = self._ExecuteList(node.children)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 1542, in _ExecuteList
    status = self._Execute(child)  # last status wins
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 1521, in _Execute
    status, check_errexit = self._Dispatch(node, fork_external)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 1072, in _Dispatch
    val = self.word_ev.EvalRhsWord(pair.rhs)
  File "/home/andy/git/oilshell/oil/osh/word_eval.py", line 1210, in EvalRhsWord
    return self.EvalWordToString(word)
  File "/home/andy/git/oilshell/oil/osh/word_eval.py", line 1124, in EvalWordToString
    self._EvalWordPart(p, part_vals, quoted=False)
  File "/home/andy/git/oilshell/oil/osh/word_eval.py", line 979, in _EvalWordPart
    v = self._EvalCommandSub(part.command_list, quoted)
  File "/home/andy/git/oilshell/oil/osh/word_eval.py", line 1537, in _EvalCommandSub
    stdout = self.ex.RunCommandSub(node)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 1628, in RunCommandSub
    _ = p.Start()
  File "/home/andy/git/oilshell/oil/core/process.py", line 723, in Start
    self.thunk.Run()
  File "/home/andy/git/oilshell/oil/core/process.py", line 564, in Run
    self.ex.ExecuteAndCatch(self.node, fork_external=False)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 1574, in ExecuteAndCatch
    status = self._Execute(node, fork_external=fork_external)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 1521, in _Execute
    status, check_errexit = self._Dispatch(node, fork_external)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 1160, in _Dispatch
    status = self._ExecuteList(node.children)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 1542, in _ExecuteList
    status = self._Execute(child)  # last status wins
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 1521, in _Execute
    status, check_errexit = self._Dispatch(node, fork_external)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 864, in _Dispatch
    status = self._RunSimpleCommand(cmd_val, fork_external)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 623, in _RunSimpleCommand
    return self.RunSimpleCommand(cmd_val, fork_external)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 661, in RunSimpleCommand
    status = self._RunBuiltin(builtin_id, cmd_val, fork_external)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 426, in _RunBuiltin
    status = self._RunBuiltinAndRaise(builtin_id, cmd_val, fork_external)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 381, in _RunBuiltinAndRaise
    status = self._Eval(arg_vec)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 259, in _Eval
    return self._EvalHelper(c_parser, src)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 240, in _EvalHelper
    return main_loop.Batch(self, c_parser, self.arena)
  File "/home/andy/git/oilshell/oil/core/main_loop.py", line 163, in Batch
    is_return, is_fatal = ex.ExecuteAndCatch(node)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 1574, in ExecuteAndCatch
    status = self._Execute(node, fork_external=fork_external)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 1521, in _Execute
    status, check_errexit = self._Dispatch(node, fork_external)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 832, in _Dispatch
    cmd_val = self.word_ev.EvalWordSequence2(words, allow_assign=True)
  File "/home/andy/git/oilshell/oil/osh/word_eval.py", line 1475, in EvalWordSequence2
    self._EvalWordToParts(w, False, part_vals)  # not double quoted
  File "/home/andy/git/oilshell/oil/osh/word_eval.py", line 1084, in _EvalWordToParts
    self._EvalWordPart(p, part_vals, quoted=quoted, is_subst=is_subst)
  File "/home/andy/git/oilshell/oil/osh/word_eval.py", line 974, in _EvalWordPart
    self._EvalDoubleQuoted(part.parts, part_vals)
  File "/home/andy/git/oilshell/oil/osh/word_eval.py", line 569, in _EvalDoubleQuoted
    self._EvalWordPart(p, part_vals, quoted=True)
  File "/home/andy/git/oilshell/oil/osh/word_eval.py", line 993, in _EvalWordPart
    self._EvalBracedVarSub(part, part_vals, quoted)
  File "/home/andy/git/oilshell/oil/osh/word_eval.py", line 733, in _EvalBracedVarSub
    maybe_decay_array = not (quoted and part.suffix_op.op_id == Id.VOp3_At)
AttributeError: 'suffix_op__Slice' object has no attribute 'op_id'
Traceback (most recent call last):
  File "/home/andy/git/oilshell/oil/bin/oil.py", line 918, in <module>
    sys.exit(main(sys.argv))
  File "/home/andy/git/oilshell/oil/bin/oil.py", line 876, in main
    return AppBundleMain(argv)
  File "/home/andy/git/oilshell/oil/bin/oil.py", line 846, in AppBundleMain
    status = ShellMain('osh', argv0, main_argv, login_shell)
  File "/home/andy/git/oilshell/oil/bin/oil.py", line 656, in ShellMain
    status = main_loop.Batch(ex, c_parser, arena, nodes_out=nodes_out)
  File "/home/andy/git/oilshell/oil/core/main_loop.py", line 163, in Batch
    is_return, is_fatal = ex.ExecuteAndCatch(node)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 1574, in ExecuteAndCatch
    status = self._Execute(node, fork_external=fork_external)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 1521, in _Execute
    status, check_errexit = self._Dispatch(node, fork_external)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 864, in _Dispatch
    status = self._RunSimpleCommand(cmd_val, fork_external)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 623, in _RunSimpleCommand
    return self.RunSimpleCommand(cmd_val, fork_external)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 689, in RunSimpleCommand
    status = self._RunProc(func_node, argv[1:])
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 1740, in _RunProc
    status = self._Execute(func_node.body)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 1521, in _Execute
    status, check_errexit = self._Dispatch(node, fork_external)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 1160, in _Dispatch
    status = self._ExecuteList(node.children)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 1542, in _ExecuteList
    status = self._Execute(child)  # last status wins
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 1521, in _Execute
    status, check_errexit = self._Dispatch(node, fork_external)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 1072, in _Dispatch
    val = self.word_ev.EvalRhsWord(pair.rhs)
  File "/home/andy/git/oilshell/oil/osh/word_eval.py", line 1210, in EvalRhsWord
    return self.EvalWordToString(word)
  File "/home/andy/git/oilshell/oil/osh/word_eval.py", line 1124, in EvalWordToString
    self._EvalWordPart(p, part_vals, quoted=False)
  File "/home/andy/git/oilshell/oil/osh/word_eval.py", line 979, in _EvalWordPart
    v = self._EvalCommandSub(part.command_list, quoted)
  File "/home/andy/git/oilshell/oil/osh/word_eval.py", line 1537, in _EvalCommandSub
    stdout = self.ex.RunCommandSub(node)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 1628, in RunCommandSub
    _ = p.Start()
  File "/home/andy/git/oilshell/oil/core/process.py", line 723, in Start
    self.thunk.Run()
  File "/home/andy/git/oilshell/oil/core/process.py", line 564, in Run
    self.ex.ExecuteAndCatch(self.node, fork_external=False)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 1574, in ExecuteAndCatch
    status = self._Execute(node, fork_external=fork_external)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 1521, in _Execute
    status, check_errexit = self._Dispatch(node, fork_external)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 1160, in _Dispatch
    status = self._ExecuteList(node.children)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 1542, in _ExecuteList
    status = self._Execute(child)  # last status wins
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 1521, in _Execute
    status, check_errexit = self._Dispatch(node, fork_external)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 864, in _Dispatch
    status = self._RunSimpleCommand(cmd_val, fork_external)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 623, in _RunSimpleCommand
    return self.RunSimpleCommand(cmd_val, fork_external)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 661, in RunSimpleCommand
    status = self._RunBuiltin(builtin_id, cmd_val, fork_external)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 426, in _RunBuiltin
    status = self._RunBuiltinAndRaise(builtin_id, cmd_val, fork_external)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 381, in _RunBuiltinAndRaise
    status = self._Eval(arg_vec)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 259, in _Eval
    return self._EvalHelper(c_parser, src)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 240, in _EvalHelper
    return main_loop.Batch(self, c_parser, self.arena)
  File "/home/andy/git/oilshell/oil/core/main_loop.py", line 163, in Batch
    is_return, is_fatal = ex.ExecuteAndCatch(node)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 1574, in ExecuteAndCatch
    status = self._Execute(node, fork_external=fork_external)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 1521, in _Execute
    status, check_errexit = self._Dispatch(node, fork_external)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 832, in _Dispatch
    cmd_val = self.word_ev.EvalWordSequence2(words, allow_assign=True)
  File "/home/andy/git/oilshell/oil/osh/word_eval.py", line 1475, in EvalWordSequence2
    self._EvalWordToParts(w, False, part_vals)  # not double quoted
  File "/home/andy/git/oilshell/oil/osh/word_eval.py", line 1084, in _EvalWordToParts
    self._EvalWordPart(p, part_vals, quoted=quoted, is_subst=is_subst)
  File "/home/andy/git/oilshell/oil/osh/word_eval.py", line 974, in _EvalWordPart
    self._EvalDoubleQuoted(part.parts, part_vals)
  File "/home/andy/git/oilshell/oil/osh/word_eval.py", line 569, in _EvalDoubleQuoted
    self._EvalWordPart(p, part_vals, quoted=True)
  File "/home/andy/git/oilshell/oil/osh/word_eval.py", line 993, in _EvalWordPart
    self._EvalBracedVarSub(part, part_vals, quoted)
  File "/home/andy/git/oilshell/oil/osh/word_eval.py", line 733, in _EvalBracedVarSub
    maybe_decay_array = not (quoted and part.suffix_op.op_id == Id.VOp3_At)
AttributeError: 'suffix_op__PatSub' object has no attribute 'op_id'
osh_ALT3 indirection, *then* fancy expansion features

[osh_ALT stdout] Expected 'ok\n', got '${!b[1]} -> expected asdf, got asdf x\n${!y:-foo} -> expected foo, got y yy\n${!x:-foo} -> expected aaabcc, got x xd xx\nz zip zz vs foo\n$zz -> expected foo, got \nz zip zz vs foo\n$zz -> expected foo, got \nbad success: ${!w:?oops}\nbad err msg: ${!w:?oops} -> 13:32:52 up 18 days, 14:32, 19 users, load average: 5.21, 2.38, 2.46\nUSER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT\n${!x:?oops} -> expected aaabcc, got x xd xx\n${!y:+foo} -> expected , got y yy\n${!x:+foo} -> expected foo, got x xd xx\n${!x:2} -> expected abcc, got \n${!x:2:2} -> expected ab, got \n${!x#*a} -> expected aabcc, got x xd xx\n${!x%%c*} -> expected aaab, got x xd xx\n${!x/a*b/d} -> expected dcc, got \n${!x^a} -> expected Aaabcc, got x xd xx\n${!p@P} -> expected $ , got p pp\nok\n'

stdout:
${!b[1]} -> expected asdf, got asdf x
${!y:-foo} -> expected foo, got y yy
${!x:-foo} -> expected aaabcc, got x xd xx
z zip zz vs foo
$zz -> expected foo, got 
z zip zz vs foo
$zz -> expected foo, got 
bad success: ${!w:?oops}
bad err msg: ${!w:?oops} ->  13:32:52 up 18 days, 14:32, 19 users,  load average: 5.21, 2.38, 2.46
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
${!x:?oops} -> expected aaabcc, got x xd xx
${!y:+foo} -> expected , got y yy
${!x:+foo} -> expected foo, got x xd xx
${!x:2} -> expected abcc, got 
${!x:2:2} -> expected ab, got 
${!x#*a} -> expected aabcc, got x xd xx
${!x%%c*} -> expected aaab, got x xd xx
${!x/a*b/d} -> expected dcc, got 
${!x^a} -> expected Aaabcc, got x xd xx
${!p@P} -> expected $ , got p pp
ok
stderr:
Traceback (most recent call last):
  File "/home/andy/git/oilshell/oil/bin/oil.py", line 905, in _cpython_main_hook
    sys.exit(main(sys.argv))
  File "/home/andy/git/oilshell/oil/bin/oil.py", line 876, in main
    return AppBundleMain(argv)
  File "/home/andy/git/oilshell/oil/bin/oil.py", line 846, in AppBundleMain
    status = ShellMain('osh', argv0, main_argv, login_shell)
  File "/home/andy/git/oilshell/oil/bin/oil.py", line 656, in ShellMain
    status = main_loop.Batch(ex, c_parser, arena, nodes_out=nodes_out)
  File "/home/andy/git/oilshell/oil/core/main_loop.py", line 169, in Batch
    return status
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 1574, in ExecuteAndCatch
    status = self._Execute(node, fork_external=fork_external)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 1521, in _Execute
    status, check_errexit = self._Dispatch(node, fork_external)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 879, in _Dispatch
    self.mem.PopTemp()
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 623, in _RunSimpleCommand
    return self.RunSimpleCommand(cmd_val, fork_external)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 689, in RunSimpleCommand
    status = self._RunProc(func_node, argv[1:])
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 1740, in _RunProc
    status = self._Execute(func_node.body)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 1521, in _Execute
    status, check_errexit = self._Dispatch(node, fork_external)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 1160, in _Dispatch
    status = self._ExecuteList(node.children)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 1542, in _ExecuteList
    status = self._Execute(child)  # last status wins
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 1521, in _Execute
    status, check_errexit = self._Dispatch(node, fork_external)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 1106, in _Dispatch
    raise _ControlFlow(node.keyword, val)
  File "/home/andy/git/oilshell/oil/osh/word_eval.py", line 1210, in EvalRhsWord
    return self.EvalWordToString(word)
  File "/home/andy/git/oilshell/oil/osh/word_eval.py", line 1124, in EvalWordToString
    self._EvalWordPart(p, part_vals, quoted=False)
  File "/home/andy/git/oilshell/oil/osh/word_eval.py", line 979, in _EvalWordPart
    v = self._EvalCommandSub(part.command_list, quoted)
  File "/home/andy/git/oilshell/oil/osh/word_eval.py", line 1537, in _EvalCommandSub
    stdout = self.ex.RunCommandSub(node)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 1628, in RunCommandSub
    _ = p.Start()
  File "/home/andy/git/oilshell/oil/core/process.py", line 723, in Start
    self.thunk.Run()
  File "/home/andy/git/oilshell/oil/core/process.py", line 564, in Run
    self.ex.ExecuteAndCatch(self.node, fork_external=False)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 1574, in ExecuteAndCatch
    status = self._Execute(node, fork_external=fork_external)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 1521, in _Execute
    status, check_errexit = self._Dispatch(node, fork_external)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 1160, in _Dispatch
    status = self._ExecuteList(node.children)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 1542, in _ExecuteList
    status = self._Execute(child)  # last status wins
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 1521, in _Execute
    status, check_errexit = self._Dispatch(node, fork_external)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 879, in _Dispatch
    self.mem.PopTemp()
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 623, in _RunSimpleCommand
    return self.RunSimpleCommand(cmd_val, fork_external)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 661, in RunSimpleCommand
    status = self._RunBuiltin(builtin_id, cmd_val, fork_external)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 426, in _RunBuiltin
    status = self._RunBuiltinAndRaise(builtin_id, cmd_val, fork_external)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 415, in _RunBuiltinAndRaise
    status = self._RunBuiltinAndRaise(to_run, cmd_val2, fork_external)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 259, in _Eval
    return self._EvalHelper(c_parser, src)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 240, in _EvalHelper
    return main_loop.Batch(self, c_parser, self.arena)
  File "/home/andy/git/oilshell/oil/core/main_loop.py", line 169, in Batch
    return status
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 1574, in ExecuteAndCatch
    status = self._Execute(node, fork_external=fork_external)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 1521, in _Execute
    status, check_errexit = self._Dispatch(node, fork_external)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 879, in _Dispatch
    self.mem.PopTemp()
  File "/home/andy/git/oilshell/oil/osh/word_eval.py", line 1475, in EvalWordSequence2
    self._EvalWordToParts(w, False, part_vals)  # not double quoted
  File "/home/andy/git/oilshell/oil/osh/word_eval.py", line 1084, in _EvalWordToParts
    self._EvalWordPart(p, part_vals, quoted=quoted, is_subst=is_subst)
  File "/home/andy/git/oilshell/oil/osh/word_eval.py", line 974, in _EvalWordPart
    self._EvalDoubleQuoted(part.parts, part_vals)
  File "/home/andy/git/oilshell/oil/osh/word_eval.py", line 569, in _EvalDoubleQuoted
    self._EvalWordPart(p, part_vals, quoted=True)
  File "/home/andy/git/oilshell/oil/osh/word_eval.py", line 993, in _EvalWordPart
    self._EvalBracedVarSub(part, part_vals, quoted)
  File "/home/andy/git/oilshell/oil/osh/word_eval.py", line 863, in _EvalBracedVarSub
    raise NotImplementedError
AttributeError: 'suffix_op__Slice' object has no attribute 'op_id'
FATAL: couldn't import from app bundle '/home/andy/git/oilshell/oil/_tmp/oil-tar-test/oil-0.7.pre7/_bin/osh' (1)
Stripping the oil.ovm binary may cause this error.
See https://github.com/oilshell/oil/issues/47
Traceback (most recent call last):
  File "/home/andy/git/oilshell/oil/bin/oil.py", line 905, in _cpython_main_hook
    sys.exit(main(sys.argv))
  File "/home/andy/git/oilshell/oil/bin/oil.py", line 876, in main
    return AppBundleMain(argv)
  File "/home/andy/git/oilshell/oil/bin/oil.py", line 846, in AppBundleMain
    status = ShellMain('osh', argv0, main_argv, login_shell)
  File "/home/andy/git/oilshell/oil/bin/oil.py", line 656, in ShellMain
    status = main_loop.Batch(ex, c_parser, arena, nodes_out=nodes_out)
  File "/home/andy/git/oilshell/oil/core/main_loop.py", line 169, in Batch
    return status
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 1574, in ExecuteAndCatch
    status = self._Execute(node, fork_external=fork_external)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 1521, in _Execute
    status, check_errexit = self._Dispatch(node, fork_external)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 879, in _Dispatch
    self.mem.PopTemp()
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 623, in _RunSimpleCommand
    return self.RunSimpleCommand(cmd_val, fork_external)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 689, in RunSimpleCommand
    status = self._RunProc(func_node, argv[1:])
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 1740, in _RunProc
    status = self._Execute(func_node.body)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 1521, in _Execute
    status, check_errexit = self._Dispatch(node, fork_external)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 1160, in _Dispatch
    status = self._ExecuteList(node.children)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 1542, in _ExecuteList
    status = self._Execute(child)  # last status wins
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 1521, in _Execute
    status, check_errexit = self._Dispatch(node, fork_external)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 1106, in _Dispatch
    raise _ControlFlow(node.keyword, val)
  File "/home/andy/git/oilshell/oil/osh/word_eval.py", line 1210, in EvalRhsWord
    return self.EvalWordToString(word)
  File "/home/andy/git/oilshell/oil/osh/word_eval.py", line 1124, in EvalWordToString
    self._EvalWordPart(p, part_vals, quoted=False)
  File "/home/andy/git/oilshell/oil/osh/word_eval.py", line 979, in _EvalWordPart
    v = self._EvalCommandSub(part.command_list, quoted)
  File "/home/andy/git/oilshell/oil/osh/word_eval.py", line 1537, in _EvalCommandSub
    stdout = self.ex.RunCommandSub(node)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 1628, in RunCommandSub
    _ = p.Start()
  File "/home/andy/git/oilshell/oil/core/process.py", line 723, in Start
    self.thunk.Run()
  File "/home/andy/git/oilshell/oil/core/process.py", line 564, in Run
    self.ex.ExecuteAndCatch(self.node, fork_external=False)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 1574, in ExecuteAndCatch
    status = self._Execute(node, fork_external=fork_external)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 1521, in _Execute
    status, check_errexit = self._Dispatch(node, fork_external)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 1160, in _Dispatch
    status = self._ExecuteList(node.children)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 1542, in _ExecuteList
    status = self._Execute(child)  # last status wins
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 1521, in _Execute
    status, check_errexit = self._Dispatch(node, fork_external)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 879, in _Dispatch
    self.mem.PopTemp()
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 623, in _RunSimpleCommand
    return self.RunSimpleCommand(cmd_val, fork_external)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 661, in RunSimpleCommand
    status = self._RunBuiltin(builtin_id, cmd_val, fork_external)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 426, in _RunBuiltin
    status = self._RunBuiltinAndRaise(builtin_id, cmd_val, fork_external)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 415, in _RunBuiltinAndRaise
    status = self._RunBuiltinAndRaise(to_run, cmd_val2, fork_external)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 259, in _Eval
    return self._EvalHelper(c_parser, src)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 240, in _EvalHelper
    return main_loop.Batch(self, c_parser, self.arena)
  File "/home/andy/git/oilshell/oil/core/main_loop.py", line 169, in Batch
    return status
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 1574, in ExecuteAndCatch
    status = self._Execute(node, fork_external=fork_external)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 1521, in _Execute
    status, check_errexit = self._Dispatch(node, fork_external)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 879, in _Dispatch
    self.mem.PopTemp()
  File "/home/andy/git/oilshell/oil/osh/word_eval.py", line 1475, in EvalWordSequence2
    self._EvalWordToParts(w, False, part_vals)  # not double quoted
  File "/home/andy/git/oilshell/oil/osh/word_eval.py", line 1084, in _EvalWordToParts
    self._EvalWordPart(p, part_vals, quoted=quoted, is_subst=is_subst)
  File "/home/andy/git/oilshell/oil/osh/word_eval.py", line 974, in _EvalWordPart
    self._EvalDoubleQuoted(part.parts, part_vals)
  File "/home/andy/git/oilshell/oil/osh/word_eval.py", line 569, in _EvalDoubleQuoted
    self._EvalWordPart(p, part_vals, quoted=True)
  File "/home/andy/git/oilshell/oil/osh/word_eval.py", line 993, in _EvalWordPart
    self._EvalBracedVarSub(part, part_vals, quoted)
  File "/home/andy/git/oilshell/oil/osh/word_eval.py", line 863, in _EvalBracedVarSub
    raise NotImplementedError
AttributeError: 'suffix_op__Slice' object has no attribute 'op_id'
FATAL: couldn't import from app bundle '/home/andy/git/oilshell/oil/_tmp/oil-tar-test/oil-0.7.pre7/_bin/osh' (1)
Stripping the oil.ovm binary may cause this error.
See https://github.com/oilshell/oil/issues/47
Traceback (most recent call last):
  File "/home/andy/git/oilshell/oil/bin/oil.py", line 905, in _cpython_main_hook
    sys.exit(main(sys.argv))
  File "/home/andy/git/oilshell/oil/bin/oil.py", line 876, in main
    return AppBundleMain(argv)
  File "/home/andy/git/oilshell/oil/bin/oil.py", line 846, in AppBundleMain
    status = ShellMain('osh', argv0, main_argv, login_shell)
  File "/home/andy/git/oilshell/oil/bin/oil.py", line 656, in ShellMain
    status = main_loop.Batch(ex, c_parser, arena, nodes_out=nodes_out)
  File "/home/andy/git/oilshell/oil/core/main_loop.py", line 169, in Batch
    return status
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 1574, in ExecuteAndCatch
    status = self._Execute(node, fork_external=fork_external)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 1521, in _Execute
    status, check_errexit = self._Dispatch(node, fork_external)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 879, in _Dispatch
    self.mem.PopTemp()
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 623, in _RunSimpleCommand
    return self.RunSimpleCommand(cmd_val, fork_external)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 689, in RunSimpleCommand
    status = self._RunProc(func_node, argv[1:])
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 1740, in _RunProc
    status = self._Execute(func_node.body)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 1521, in _Execute
    status, check_errexit = self._Dispatch(node, fork_external)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 1160, in _Dispatch
    status = self._ExecuteList(node.children)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 1542, in _ExecuteList
    status = self._Execute(child)  # last status wins
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 1521, in _Execute
    status, check_errexit = self._Dispatch(node, fork_external)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 1106, in _Dispatch
    raise _ControlFlow(node.keyword, val)
  File "/home/andy/git/oilshell/oil/osh/word_eval.py", line 1210, in EvalRhsWord
    return self.EvalWordToString(word)
  File "/home/andy/git/oilshell/oil/osh/word_eval.py", line 1124, in EvalWordToString
    self._EvalWordPart(p, part_vals, quoted=False)
  File "/home/andy/git/oilshell/oil/osh/word_eval.py", line 979, in _EvalWordPart
    v = self._EvalCommandSub(part.command_list, quoted)
  File "/home/andy/git/oilshell/oil/osh/word_eval.py", line 1537, in _EvalCommandSub
    stdout = self.ex.RunCommandSub(node)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 1628, in RunCommandSub
    _ = p.Start()
  File "/home/andy/git/oilshell/oil/core/process.py", line 723, in Start
    self.thunk.Run()
  File "/home/andy/git/oilshell/oil/core/process.py", line 564, in Run
    self.ex.ExecuteAndCatch(self.node, fork_external=False)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 1574, in ExecuteAndCatch
    status = self._Execute(node, fork_external=fork_external)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 1521, in _Execute
    status, check_errexit = self._Dispatch(node, fork_external)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 1160, in _Dispatch
    status = self._ExecuteList(node.children)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 1542, in _ExecuteList
    status = self._Execute(child)  # last status wins
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 1521, in _Execute
    status, check_errexit = self._Dispatch(node, fork_external)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 879, in _Dispatch
    self.mem.PopTemp()
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 623, in _RunSimpleCommand
    return self.RunSimpleCommand(cmd_val, fork_external)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 661, in RunSimpleCommand
    status = self._RunBuiltin(builtin_id, cmd_val, fork_external)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 426, in _RunBuiltin
    status = self._RunBuiltinAndRaise(builtin_id, cmd_val, fork_external)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 415, in _RunBuiltinAndRaise
    status = self._RunBuiltinAndRaise(to_run, cmd_val2, fork_external)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 259, in _Eval
    return self._EvalHelper(c_parser, src)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 240, in _EvalHelper
    return main_loop.Batch(self, c_parser, self.arena)
  File "/home/andy/git/oilshell/oil/core/main_loop.py", line 169, in Batch
    return status
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 1574, in ExecuteAndCatch
    status = self._Execute(node, fork_external=fork_external)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 1521, in _Execute
    status, check_errexit = self._Dispatch(node, fork_external)
  File "/home/andy/git/oilshell/oil/osh/cmd_exec.py", line 879, in _Dispatch
    self.mem.PopTemp()
  File "/home/andy/git/oilshell/oil/osh/word_eval.py", line 1475, in EvalWordSequence2
    self._EvalWordToParts(w, False, part_vals)  # not double quoted
  File "/home/andy/git/oilshell/oil/osh/word_eval.py", line 1084, in _EvalWordToParts
    self._EvalWordPart(p, part_vals, quoted=quoted, is_subst=is_subst)
  File "/home/andy/git/oilshell/oil/osh/word_eval.py", line 974, in _EvalWordPart
    self._EvalDoubleQuoted(part.parts, part_vals)
  File "/home/andy/git/oilshell/oil/osh/word_eval.py", line 569, in _EvalDoubleQuoted
    self._EvalWordPart(p, part_vals, quoted=True)
  File "/home/andy/git/oilshell/oil/osh/word_eval.py", line 993, in _EvalWordPart
    self._EvalBracedVarSub(part, part_vals, quoted)
  File "/home/andy/git/oilshell/oil/osh/word_eval.py", line 863, in _EvalBracedVarSub
    raise NotImplementedError
AttributeError: 'suffix_op__PatSub' object has no attribute 'op_id'
FATAL: couldn't import from app bundle '/home/andy/git/oilshell/oil/_tmp/oil-tar-test/oil-0.7.pre7/_bin/osh' (1)
Stripping the oil.ovm binary may cause this error.
See https://github.com/oilshell/oil/issues/47
osh4 indirection *to* an array reference

[osh stdout] Expected '.\n.x\n.x.y\n.x y\n', got '.\n.x\n.x.y\n.x.y\n'

stdout:
.
.x
.x.y
.x.y
stderr:
osh_ALT4 indirection *to* an array reference

[osh_ALT stdout] Expected '.\n.x\n.x.y\n.x y\n', got '.\n.x\n.x.y\n.x.y\n'

stdout:
.
.x
.x.y
.x.y
stderr:
bash5 indirection to nasty complex array references

stdout:
1 7 8 9 10 11 end
stderr:
main: line 4: {1,0}: syntax error: operand expected (error token is "{1,0}")
main: line 4: <(echo x): syntax error: operand expected (error token is "<(echo x)")
main: line 4: 1 0: syntax error in expression (error token is "0")
main: line 4: b*: syntax error: operand expected (error token is "*")
main: line 4: a[1"]: bad substitution
bash6 indirection *to* fancy expansion features bash disallows

stdout:
done
stderr:
main: line 2: a[0: bad substitution
main: line 2: aa[k: bad substitution
main: line 2: !x: bad substitution
main: line 2: !a[0]: bad substitution
main: line 2: x:-foo: bad substitution
main: line 2: x:=foo: bad substitution
main: line 2: x:?oops: bad substitution
main: line 2: x:+yy: bad substitution
main: line 2: x:0: bad substitution
main: line 2: x:0:1: bad substitution
main: line 2: !a@: bad substitution
main: line 2: #x: bad substitution
main: line 2: x#y: bad substitution
main: line 2: x/y/foo: bad substitution
main: line 2: x@Q: bad substitution
osh7 declare -n and ${!a}

[osh stdout] Expected 'b c\n', got 'c b\n'

stdout:
c b
stderr:
  declare -n a
          ^~
[ stdin ]:1: 'declare' doesn't accept flag -n
osh_ALT7 declare -n and ${!a}

[osh_ALT stdout] Expected 'b c\n', got 'c b\n'

stdout:
c b
stderr:
  declare -n a
          ^~
[ stdin ]:1: 'declare' doesn't accept flag -n
osh8 Bad var ref with ${!a}

stdout:
stderr: 
  echo ref ${!a}
              ^
[ stdin ]:2: fatal: Bad indirect expansion: 'bad var name'
osh_ALT8 Bad var ref with ${!a}

stdout:
stderr: 
  echo ref ${!a}
              ^
[ stdin ]:2: fatal: Bad indirect expansion: 'bad var name'