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