/
builtin-trap.test.sh
206 lines (189 loc) · 2.79 KB
/
builtin-trap.test.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
#!/bin/bash
#### trap -l
trap -l | grep INT >/dev/null
## status: 0
## N-I dash/mksh status: 1
#### trap -p
trap 'echo exit' EXIT
trap -p | grep EXIT >/dev/null
## status: 0
## N-I dash/mksh status: 1
#### Register invalid trap
trap 'foo' SIGINVALID
## status: 1
#### Remove invalid trap
trap - SIGINVALID
## status: 1
#### SIGINT and INT are aliases
trap - SIGINT
echo $?
trap - INT
echo $?
## STDOUT:
0
0
## END
## N-I dash STDOUT:
1
0
## END
#### Invalid trap invocation
trap 'foo'
echo status=$?
## stdout: status=2
## OK dash stdout: status=1
## BUG mksh stdout: status=0
#### exit 1 when trap code string is invalid
# All shells spew warnings to stderr, but don't actually exit! Bad!
trap 'echo <' EXIT
echo status=$?
## stdout: status=1
## BUG mksh status: 1
## BUG mksh stdout: status=0
## BUG dash/bash status: 0
## BUG dash/bash stdout: status=0
#### trap EXIT calling exit
cleanup() {
echo "cleanup [$@]"
exit 42
}
trap 'cleanup x y z' EXIT
## stdout: cleanup [x y z]
## status: 42
#### trap EXIT return status ignored
cleanup() {
echo "cleanup [$@]"
return 42
}
trap 'cleanup x y z' EXIT
## stdout: cleanup [x y z]
## status: 0
#### trap EXIT with PARSE error
trap 'echo FAILED' EXIT
for
## stdout: FAILED
## status: 2
## OK mksh status: 1
#### trap EXIT with PARSE error and explicit exit
trap 'echo FAILED; exit 0' EXIT
for
## stdout: FAILED
## status: 0
#### trap DEBUG
debuglog() {
echo "debuglog [$@]"
}
trap 'debuglog x y' DEBUG
echo 1
echo 2
## STDOUT:
debuglog [x y]
1
debuglog [x y]
2
## END
## N-I dash/mksh STDOUT:
1
2
## END
#### trap RETURN
profile() {
echo "profile [$@]"
}
g() {
echo --
echo g
echo --
return
}
f() {
echo --
echo f
echo --
g
}
# RETURN trap doesn't fire when a function returns, only when a script returns?
# That's not what the manual syas.
trap 'profile x y' RETURN
f
. spec/testdata/return-helper.sh
## status: 42
## STDOUT:
--
f
--
--
g
--
return-helper.sh
profile [x y]
## END
## N-I dash/mksh STDOUT:
--
f
--
--
g
--
return-helper.sh
## END
#### trap ERR and disable it
err() {
echo "err [$@] $?"
}
trap 'err x y' ERR
echo 1
false
echo 2
trap - ERR # disable trap
false
echo 3
## STDOUT:
1
err [x y] 1
2
3
## END
## N-I dash STDOUT:
1
2
3
## END
#### trap 0 is equivalent to EXIT
# not sure why this is, but POSIX wants it.
trap 'echo EXIT' 0
echo status=$?
trap - EXIT
echo status=$?
## status: 0
## STDOUT:
status=0
status=0
## END
#### trap 1 is equivalent to SIGHUP; HUP is equivalent to SIGHUP
trap 'echo HUP' SIGHUP
echo status=$?
trap 'echo HUP' HUP
echo status=$?
trap 'echo HUP' 1
echo status=$?
trap - HUP
echo status=$?
## status: 0
## STDOUT:
status=0
status=0
status=0
status=0
## END
## N-I dash STDOUT:
status=1
status=0
status=0
status=0
## END
#### eval in the exit trap (regression for issue #293)
trap 'eval "echo hi"' 0
## STDOUT:
hi
## END