die
LIST
Outside of an
eval
, this function prints the concatenated value of
LIST
to
STDERR
and exits with the current value of
$!
(
errno
). If
$!
is 0, it exits with the value of
($? >> 8)
(which is the status of the last reaped child from a
system
,
wait
,
close
on a pipe, or `command`). If
($? >> 8)
is 0, it exits with 255. If
LIST
is unspecified, the current value of the
$@
variable is propagated, if any. Otherwise the string
"Died"
is used as the default.
Equivalent examples:
die "Can't cd to spool: $!\n" unless chdir '/usr/spool/news'; chdir '/usr/spool/news' or die "Can't cd to spool: $!\n"
(The second form is generally preferred, since the important part is the chdir .)
Within an eval , the function sets the $@ variable equal to the error message that would have been produced otherwise, and aborts the eval , which then returns the undefined value. The die function can thus be used to raise named exceptions that can be caught at a higher level in the program. See the section on the eval function later in this chapter.
If the final value of
LIST
does not end in a newline, the current script filename, line number, and input line number (if any) are appended to the message, as well as a newline. Hint: sometimes appending
", stopped"
to your message will cause it to make better sense when the string
"at scriptname line 123"
is appended. Suppose you are running script
canasta
:
die "/etc/games is no good"; die "/etc/games is no good, stopped";
which produces, respectively:
/etc/games is no good at canasta line 123. /etc/games is no good, stopped at canasta line 123.
If you want your own error messages reporting the filename and linenumber, use the
__FILE__
and
__LINE__
special tokens:
die '"', __FILE__, '", line ', __LINE__, ", phooey on you!\n";
This produces output like:
"canasta", line 38, phooey on you!