1 #!/bin/bash
2
3 ### trap -l
4 trap -l | grep INT >/dev/null
5 ## status: 0
6 ## N-I dash/mksh status: 1
7
8 ### trap -p
9 trap 'echo exit' EXIT
10 trap -p | grep EXIT >/dev/null
11 ## status: 0
12 ## N-I dash/mksh status: 1
13
14 ### Register invalid trap
15 trap 'foo' SIGINVALID
16 ## status: 1
17
18 ### Remove invalid trap
19 trap - SIGINVALID
20 ## status: 1
21
22 ### SIGINT and INT are aliases
23 trap - SIGINT
24 echo $?
25 trap - INT
26 echo $?
27 ## STDOUT:
28 0
29 0
30 ## END
31 ## N-I dash STDOUT:
32 1
33 0
34 ## END
35
36 ### Invalid trap invocation
37 trap 'foo'
38 echo status=$?
39 ## stdout: status=1
40 ## OK bash stdout: status=2
41 ## BUG mksh stdout: status=0
42
43 ### exit 1 when trap code string is invalid
44 # All shells spew warnings to stderr, but don't actually exit! Bad!
45 trap 'echo <' EXIT
46 echo status=$?
47 ## stdout: status=1
48 ## BUG mksh status: 1
49 ## BUG mksh stdout: status=0
50 ## BUG dash/bash status: 0
51 ## BUG dash/bash stdout: status=0
52
53 ### trap EXIT
54 cleanup() {
55 echo "cleanup [$@]"
56 }
57 trap 'cleanup x y z' EXIT
58 ## stdout: cleanup [x y z]
59
60 ### trap DEBUG
61 debuglog() {
62 echo "debuglog [$@]"
63 }
64 trap 'debuglog x y' DEBUG
65 echo 1
66 echo 2
67 ## STDOUT:
68 debuglog [x y]
69 1
70 debuglog [x y]
71 2
72 ## END
73 ## N-I dash/mksh STDOUT:
74 1
75 2
76 ## END
77
78 ### trap RETURN
79 profile() {
80 echo "profile [$@]"
81 }
82 g() {
83 echo --
84 echo g
85 echo --
86 return
87 }
88 f() {
89 echo --
90 echo f
91 echo --
92 g
93 }
94 # RETURN trap doesn't fire when a function returns, only when a script returns?
95 # That's not what the manual syas.
96 trap 'profile x y' RETURN
97 f
98 . spec/testdata/return-helper.sh
99 ## status: 42
100 ## STDOUT:
101 --
102 f
103 --
104 --
105 g
106 --
107 return-helper.sh
108 profile [x y]
109 ## END
110 ## N-I dash/mksh STDOUT:
111 --
112 f
113 --
114 --
115 g
116 --
117 return-helper.sh
118 ## END
119
120 ### trap ERR and disable it
121 err() {
122 echo "err [$@] $?"
123 }
124 trap 'err x y' ERR
125 echo 1
126 false
127 echo 2
128 trap - ERR # disable trap
129 false
130 echo 3
131 ## STDOUT:
132 1
133 err [x y] 1
134 2
135 3
136 ## END
137 # N-I dash STDOUT:
138 1
139 2
140 3
141 ## END