OILS / spec / func-parsing.test.sh View on Github | oilshell.org

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