| 1 | 
 | 
| 2 | #### Incomplete Function
 | 
| 3 | ## code: foo()
 | 
| 4 | ## status: 2
 | 
| 5 | ## BUG mksh status: 0
 | 
| 6 | 
 | 
| 7 | #### Incomplete Function 2
 | 
| 8 | ## code: foo() {
 | 
| 9 | ## status: 2
 | 
| 10 | ## OK mksh status: 1
 | 
| 11 | 
 | 
| 12 | #### Bad function
 | 
| 13 | ## code: foo(ls)
 | 
| 14 | ## status: 2
 | 
| 15 | ## OK mksh status: 1
 | 
| 16 | 
 | 
| 17 | #### Unbraced function body. 
 | 
| 18 | # dash allows this, but bash does not.  The POSIX grammar might not allow
 | 
| 19 | # this?  Because a function body needs a compound command.
 | 
| 20 | # function_body    : compound_command
 | 
| 21 | #                  | compound_command redirect_list  /* Apply rule 9 */
 | 
| 22 | ## code: one_line() ls; one_line;
 | 
| 23 | ## status: 0
 | 
| 24 | ## OK bash/osh status: 2
 | 
| 25 | 
 | 
| 26 | #### Function with spaces, to see if ( and ) are separate tokens.
 | 
| 27 | # NOTE: Newline after ( is not OK.
 | 
| 28 | fun ( ) { echo in-func; }; fun
 | 
| 29 | ## stdout: in-func
 | 
| 30 | 
 | 
| 31 | #### subshell function
 | 
| 32 | # bash allows this.
 | 
| 33 | i=0
 | 
| 34 | j=0
 | 
| 35 | inc() { i=$((i+5)); }
 | 
| 36 | inc_subshell() ( j=$((j+5)); )
 | 
| 37 | inc
 | 
| 38 | inc_subshell
 | 
| 39 | echo $i $j
 | 
| 40 | ## stdout: 5 0
 | 
| 41 | 
 | 
| 42 | #### Hard case, function with } token in it
 | 
| 43 | rbrace() { echo }; }; rbrace
 | 
| 44 | ## stdout: }
 | 
| 45 | 
 | 
| 46 | #### . in function name
 | 
| 47 | # bash accepts; dash doesn't
 | 
| 48 | func-name.ext ( ) { echo func-name.ext; }
 | 
| 49 | func-name.ext
 | 
| 50 | ## stdout: func-name.ext
 | 
| 51 | ## OK dash status: 2
 | 
| 52 | ## OK dash stdout-json: ""
 | 
| 53 | 
 | 
| 54 | #### = in function name
 | 
| 55 | # WOW, bash is so lenient. foo=bar is a command, I suppose.  I  think I'm doing
 | 
| 56 | # to disallow this one.
 | 
| 57 | func-name=ext ( ) { echo func-name=ext; }
 | 
| 58 | func-name=ext
 | 
| 59 | ## stdout: func-name=ext
 | 
| 60 | ## OK dash status: 2
 | 
| 61 | ## OK dash stdout-json: ""
 | 
| 62 | ## OK mksh status: 1
 | 
| 63 | ## OK mksh stdout-json: ""
 | 
| 64 | 
 | 
| 65 | #### Function name with $
 | 
| 66 | $foo-bar() { ls ; }
 | 
| 67 | ## status: 2
 | 
| 68 | ## OK bash/mksh status: 1
 | 
| 69 | 
 | 
| 70 | #### Function name with command sub
 | 
| 71 | foo-$(echo hi)() { ls ; }
 | 
| 72 | ## status: 2
 | 
| 73 | ## OK bash/mksh status: 1
 | 
| 74 | 
 | 
| 75 | #### Function name with !
 | 
| 76 | # bash allows this; dash doesn't.
 | 
| 77 | foo!bar() { ls ; }
 | 
| 78 | ## status: 0
 | 
| 79 | ## OK dash status: 2
 | 
| 80 | 
 | 
| 81 | #### Function name with -
 | 
| 82 | # bash allows this; dash doesn't.
 | 
| 83 | foo-bar() { ls ; }
 | 
| 84 | ## status: 0
 | 
| 85 | ## OK dash status: 2
 | 
| 86 | 
 | 
| 87 | #### Break after ) is OK.
 | 
| 88 | # newline is always a token in "normal" state.
 | 
| 89 | echo hi; fun ( )
 | 
| 90 | { echo in-func; }
 | 
| 91 | fun
 | 
| 92 | ## STDOUT:
 | 
| 93 | hi
 | 
| 94 | in-func
 | 
| 95 | ## END
 | 
| 96 | 
 | 
| 97 | #### Nested definition
 | 
| 98 | # A function definition is a command, so it can be nested
 | 
| 99 | fun() {
 | 
| 100 |   nested_func() { echo nested; }
 | 
| 101 |   nested_func
 | 
| 102 | }
 | 
| 103 | fun
 | 
| 104 | ## stdout: nested
 | 
| 105 | 
 |