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
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
|
# These should all be safe
LC_ALL=C
LC_CTYPE=C
LC_COLLATE=C
LC_MESSAGES=C
# these tests should all generate errors
# make sure we don't exit prematurely
set +e
set +o posix
# various alias/unalias errors
# at some point, this may mean to `export' an alias, like ksh, but
# for now it is an error
alias -x foo=barz
unalias -x fooaha
alias hoowah
unalias hoowah
# the iteration variable must be a valid identifier
for 1 in a b c; do echo $1; done
# try to rebind a read-only function
func()
{
echo func
}
readonly -f func
# make sure `readonly' and `declare' play well together
declare -Fr
func()
{
echo bar
}
# bad option
unset -x func
# cannot unset readonly functions or variables
unset -f func
# or make them not readonly
declare -fr func
declare -f +r func
XPATH=$PATH
declare -r XPATH
unset -v XPATH
# cannot unset invalid identifiers
unset /bin/sh
# cannot unset function and variable at the same time
unset -f -v SHELL
# bad option
declare -z
# cannot declare invalid identifiers
declare -- -z
declare /bin/sh
# this is the syntax used to export functions in the environment, but
# it cannot be used with `declare'
declare -f func='() { echo "this is func"; }'
# bad option to exec -- this should not exit the script
exec -i /bin/sh
# try to export -f something that is not a function -- this should be
# an error, not create an `invisible function'
export -f XPATH
# this depends on the setting of BREAK_COMPLAINS in config.h.in
break
continue
# this should not exit the shell; it did in versions before 2.01
shift label
# other shells do not complain about the extra arguments; maybe someday
# we won't either
set -- a b c
shift $# label
# and get rid of the positional parameters
shift $#
# let without an expression is an error, though maybe it should just return
# success
let
# local outside a function is an error
local
# logout of a non-login shell is an error
logout
# try to hash a non-existant command
hash notthere
# bad option to hash, although it may mean `verbose' at some future point
hash -v
# turn off hashing, then try to hash something
set +o hashall
hash -p ${THIS_SH} ${THIS_SH##*/}
# bad identifiers to declare/readonly/export
export AA[4]
readonly AA[4]
declare -a AA
unset AA[-2]
# try to assign to a readonly array
declare -r AA
AA=( one two three )
# make sure `readonly -n' doesn't turn off readonly status
readonly -n AA
AA=(one two three)
# try to assign a readonly array with bad assignment syntax
# NOTE: this works in post-bash-2.05 (at least when I write this)
# readonly -a ZZZ=bbb
# bad counts to `shift'
shopt -s shift_verbose
shift $(( $# + 5 ))
shift -2
# bad shell options
shopt -s no_such_option
shopt no_such_option
# non-octal digits for umask and other errors
umask 09
umask -S u=rwx:g=rwx:o=rx >/dev/null # 002
umask -S u:rwx,g:rwx,o:rx >/dev/null # 002
# at some point, this may mean `invert', but for now it is an error
umask -i
# bad assignments shouldn't change the umask
mask=$(umask)
umask g=u
mask2=$(umask)
if [ "$mask" != "$mask2" ]; then
echo "umask errors change process umask"
fi
# assignment to a readonly variable in environment
VAR=4
readonly VAR
VAR=7 :
# more readonly variable tests
declare VAR=88
declare +r VAR
declare -p unset
# iteration variable in a for statement being readonly
for VAR in 1 2 3 ; do echo $VAR; done
# parser errors
: $( for z in 1 2 3; do )
: $( for z in 1 2 3; done )
# various `cd' errors
( unset HOME ; cd )
( HOME=/tmp/xyz.bash ; cd )
# errors from cd
cd -
cd /bin/sh # error - not a directory
OLDPWD=/tmp/cd-notthere
cd -
# various `source/.' errors
.
source
# maybe someday this will work like in rc
. -i /dev/tty
# make sure that this gives an error rather than setting $1
set -q
# enable non-builtins
enable sh bash
# try to set and unset shell options simultaneously
shopt -s -u checkhash
# this is an error -- bad timeout spec
read -t var < /dev/null
# try to read into an invalid identifier
read /bin/sh < /dev/null
# try to read into a readonly variable
read VAR < /dev/null
# bad option to readonly/export
readonly -x foo
# someday these may mean something, but for now they're errors
eval -i "echo $-"
command -i "echo $-"
# this caused a core dump in bash-2.01 (fixed in bash-2.01.1)
eval echo \$[/bin/sh + 0]
eval echo '$((/bin/sh + 0))'
# error to list trap for an unknown signal
trap -p NOSIG
# maybe someday trap will take a -s argument like kill, but not now
trap -p -s NOSIG
# we have a ksh-like ERR trap, post-bash-2.05
#trap 'echo [$LINENO] -- error' ERR
# can only return from a function or sourced script
return 2
# break and continue with arguments <= 0
for z in 1 2 3; do
break 0
echo $x
done
for z in 1 2 3; do
continue 0
echo $x
done
# builtin with non-builtin
builtin bash
# maybe someday you will be able to use fg/bg when job control is not really
# active, but for now they are errors
bg
fg
# argument required
kill -s
# bad argument
kill -S
# null argument
kill -INT ''
# argument required
kill -INT
# bad shell option names
set -o trackall # bash is not ksh
# problem with versions through bash-4.2
readonly xx=5
echo $((xx=5))
echo $?
${THIS_SH} ./errors1.sub
${THIS_SH} ./errors2.sub
${THIS_SH} ./errors3.sub
${THIS_SH} ./errors4.sub
${THIS_SH} -o posix ./errors4.sub
${THIS_SH} ./errors5.sub
# this must be last!
# in posix mode, a function name must be a valid identifier
# this can't go in posix2.tests, since it causes the shell to exit
# immediately
set -o posix
function !! () { fc -s "$@" ; }
set +o posix
echo end
|