status | bash | mksh | zsh | osh | |
pass | 7 | 3 | 5 | 4 | |
ok | 0 | 0 | 1 | 0 | |
BUG | 0 | 4 | 1 | 0 | |
FAIL | 0 | 0 | 0 | 3 | |
total | 7 | 7 | 7 | 7 | |
case | bash | mksh | zsh | osh | description |
0 | pass | pass | pass | pass | OSH source code doesn't have to be valid Unicode (like other shells) |
1 | pass | pass | pass | pass | Unicode escapes \u03bc \U000003bc in $'', echo -e, printf |
2 | pass | BUG | pass | FAIL | Max code point U+10ffff can escaped with $'' printf echo -e |
details | details | ||||
3 | pass | BUG | pass | pass | $'' does NOT check that 0x110000 is too big at parse time |
details | |||||
4 | pass | pass | ok | pass | $'' does not check for surrogate range at parse time |
details | |||||
5 | pass | BUG | pass | FAIL | printf / echo -e do NOT check max code point at runtime |
details | details | ||||
6 | pass | BUG | BUG | FAIL | printf / echo -e do NOT check surrogates at runtime |
details | details | details |
19 passed, 1 OK, 0 not implemented, 5 BUG, 3 failed, 0 timeouts, 0 cases skipped 3 failed under osh
mksh | 2 Max code point U+10ffff can escaped with $'' printf echo -e stdout: '\xef\xbf\xbd' '\xef\xbf\xbd' '\xf4\x8f\xbf\xbf'stderr: |
osh | 2 Max code point U+10ffff can escaped with $'' printf echo -e [osh stdout] Expected "'\\xf4\\x8f\\xbf\\xbf'\n'\\xf4\\x8f\\xbf\\xbf'\n'\\xf4\\x8f\\xbf\\xbf'\n" Got "'\\xf4\\x8f\\xbf\\xbf'\n" [osh status] Expected 0, got 1 [osh stderr] Found 'Traceback (most recent' stdout: '\xf4\x8f\xbf\xbf'stderr: Traceback (most recent call last): File "/home/uke/oil/bin/oils_for_unix.py", line 202, in <module> sys.exit(main(sys.argv)) File "/home/uke/oil/bin/oils_for_unix.py", line 171, in main return AppBundleMain(argv) File "/home/uke/oil/bin/oils_for_unix.py", line 141, in AppBundleMain return shell.Main('osh', arg_r, environ, login_shell, loader, readline) File "/home/uke/oil/core/shell.py", line 1266, in Main cmd_flags=cmd_eval.IsMainProgram) File "/home/uke/oil/core/main_loop.py", line 336, in Batch was_parsed, status = Batch2(cmd_ev, c_parser, errfmt, cmd_flags=cmd_flags) File "/home/uke/oil/core/main_loop.py", line 401, in Batch2 is_return, is_fatal = cmd_ev.ExecuteAndCatch(node, cmd_flags) File "/home/uke/oil/osh/cmd_eval.py", line 2285, in ExecuteAndCatch status = self._Execute(node) File "/home/uke/oil/osh/cmd_eval.py", line 2084, in _Execute status = self._Dispatch(node, cmd_st) File "/home/uke/oil/osh/cmd_eval.py", line 1811, in _Dispatch status = self._DoSimple(node, cmd_st) File "/home/uke/oil/osh/cmd_eval.py", line 1054, in _DoSimple allow_assign=True) File "/home/uke/oil/osh/word_eval.py", line 2529, in EvalWordSequence2 self._EvalWordToParts(w, part_vals, EXTGLOB_FILES) File "/home/uke/oil/osh/word_eval.py", line 1983, in _EvalWordToParts self._EvalWordPart(p, word_part_vals, eval_flags) File "/home/uke/oil/osh/word_eval.py", line 1875, in _EvalWordPart quoted) # type: part_value_t File "/home/uke/oil/osh/word_eval.py", line 2623, in _EvalCommandSub stdout_str = self.shell_ex.RunCommandSub(cs_part) File "/home/uke/oil/core/executor.py", line 693, in RunCommandSub status, stdout_str, stderr_str = self.CaptureStdout(node) File "/home/uke/oil/core/executor.py", line 621, in CaptureStdout fds = pyos.WaitForInputs([r, r2]) File "/home/uke/oil/core/pyos.py", line 288, in WaitForInputs r, w, exc = select.select(fd, [], [fd]) TypeError: argument must be an int, or have a fileno() method |
mksh | 3 $'' does NOT check that 0x110000 is too big at parse time stdout: '\xef\xbf\xbd'stderr: |
zsh | 4 $'' does not check for surrogate range at parse time stdout: stderr: zsh: character not in range |
mksh | 5 printf / echo -e do NOT check max code point at runtime stdout: stderr: |
osh | 5 printf / echo -e do NOT check max code point at runtime [osh stdout] Expected "status=0\n'\\xf4\\x90\\x80\\x80'\nstatus=0\n'\\xf4\\x90\\x80\\x80'\n" Got '' [osh status] Expected 0, got 1 [osh stderr] Found 'Traceback (most recent' stdout: stderr: Traceback (most recent call last): File "/home/uke/oil/bin/oils_for_unix.py", line 202, in <module> sys.exit(main(sys.argv)) File "/home/uke/oil/bin/oils_for_unix.py", line 171, in main return AppBundleMain(argv) File "/home/uke/oil/bin/oils_for_unix.py", line 141, in AppBundleMain return shell.Main('osh', arg_r, environ, login_shell, loader, readline) File "/home/uke/oil/core/shell.py", line 1266, in Main cmd_flags=cmd_eval.IsMainProgram) File "/home/uke/oil/core/main_loop.py", line 336, in Batch was_parsed, status = Batch2(cmd_ev, c_parser, errfmt, cmd_flags=cmd_flags) File "/home/uke/oil/core/main_loop.py", line 401, in Batch2 is_return, is_fatal = cmd_ev.ExecuteAndCatch(node, cmd_flags) File "/home/uke/oil/osh/cmd_eval.py", line 2285, in ExecuteAndCatch status = self._Execute(node) File "/home/uke/oil/osh/cmd_eval.py", line 2084, in _Execute status = self._Dispatch(node, cmd_st) File "/home/uke/oil/osh/cmd_eval.py", line 1821, in _Dispatch status = self._DoShAssignment(node, cmd_st) File "/home/uke/oil/osh/cmd_eval.py", line 1177, in _DoShAssignment rhs = self.word_ev.EvalRhsWord(pair.rhs) File "/home/uke/oil/osh/word_eval.py", line 2188, in EvalRhsWord return self.EvalWordToString(w) File "/home/uke/oil/osh/word_eval.py", line 2097, in EvalWordToString self._EvalWordPart(p, part_vals, 0) File "/home/uke/oil/osh/word_eval.py", line 1867, in _EvalWordPart self._EvalDoubleQuoted(part.parts, part_vals) File "/home/uke/oil/osh/word_eval.py", line 1388, in _EvalDoubleQuoted self._EvalWordPart(p, part_vals, QUOTED) File "/home/uke/oil/osh/word_eval.py", line 1875, in _EvalWordPart quoted) # type: part_value_t File "/home/uke/oil/osh/word_eval.py", line 2623, in _EvalCommandSub stdout_str = self.shell_ex.RunCommandSub(cs_part) File "/home/uke/oil/core/executor.py", line 693, in RunCommandSub status, stdout_str, stderr_str = self.CaptureStdout(node) File "/home/uke/oil/core/executor.py", line 621, in CaptureStdout fds = pyos.WaitForInputs([r, r2]) File "/home/uke/oil/core/pyos.py", line 288, in WaitForInputs r, w, exc = select.select(fd, [], [fd]) TypeError: argument must be an int, or have a fileno() method |
mksh | 6 printf / echo -e do NOT check surrogates at runtime stdout: stderr: |
zsh | 6 printf / echo -e do NOT check surrogates at runtime stdout: status=0 '' status=0 '' status=0 '' status=0 ''stderr: zsh: character not in range zsh: character not in range zsh: character not in range zsh: character not in range |
osh | 6 printf / echo -e do NOT check surrogates at runtime [osh stdout] Expected "status=0\n'\\xed\\xb0\\x80'\nstatus=0\n'\\xed\\xb0\\x80'\nstatus=0\n'\\xed\\xb0\\x80'\nstatus=0\n'\\xed\\xb0\\x80'\n" Got '' [osh status] Expected 0, got 1 [osh stderr] Found 'Traceback (most recent' stdout: stderr: Traceback (most recent call last): File "/home/uke/oil/bin/oils_for_unix.py", line 202, in <module> sys.exit(main(sys.argv)) File "/home/uke/oil/bin/oils_for_unix.py", line 171, in main return AppBundleMain(argv) File "/home/uke/oil/bin/oils_for_unix.py", line 141, in AppBundleMain return shell.Main('osh', arg_r, environ, login_shell, loader, readline) File "/home/uke/oil/core/shell.py", line 1266, in Main cmd_flags=cmd_eval.IsMainProgram) File "/home/uke/oil/core/main_loop.py", line 336, in Batch was_parsed, status = Batch2(cmd_ev, c_parser, errfmt, cmd_flags=cmd_flags) File "/home/uke/oil/core/main_loop.py", line 401, in Batch2 is_return, is_fatal = cmd_ev.ExecuteAndCatch(node, cmd_flags) File "/home/uke/oil/osh/cmd_eval.py", line 2285, in ExecuteAndCatch status = self._Execute(node) File "/home/uke/oil/osh/cmd_eval.py", line 2084, in _Execute status = self._Dispatch(node, cmd_st) File "/home/uke/oil/osh/cmd_eval.py", line 1821, in _Dispatch status = self._DoShAssignment(node, cmd_st) File "/home/uke/oil/osh/cmd_eval.py", line 1177, in _DoShAssignment rhs = self.word_ev.EvalRhsWord(pair.rhs) File "/home/uke/oil/osh/word_eval.py", line 2188, in EvalRhsWord return self.EvalWordToString(w) File "/home/uke/oil/osh/word_eval.py", line 2097, in EvalWordToString self._EvalWordPart(p, part_vals, 0) File "/home/uke/oil/osh/word_eval.py", line 1867, in _EvalWordPart self._EvalDoubleQuoted(part.parts, part_vals) File "/home/uke/oil/osh/word_eval.py", line 1388, in _EvalDoubleQuoted self._EvalWordPart(p, part_vals, QUOTED) File "/home/uke/oil/osh/word_eval.py", line 1875, in _EvalWordPart quoted) # type: part_value_t File "/home/uke/oil/osh/word_eval.py", line 2623, in _EvalCommandSub stdout_str = self.shell_ex.RunCommandSub(cs_part) File "/home/uke/oil/core/executor.py", line 693, in RunCommandSub status, stdout_str, stderr_str = self.CaptureStdout(node) File "/home/uke/oil/core/executor.py", line 621, in CaptureStdout fds = pyos.WaitForInputs([r, r2]) File "/home/uke/oil/core/pyos.py", line 288, in WaitForInputs r, w, exc = select.select(fd, [], [fd]) TypeError: argument must be an int, or have a fileno() method |