old-www/LDP/abs/html/exit-status.html

682 lines
9.5 KiB
HTML
Raw Permalink Blame History

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML
><HEAD
><TITLE
>Exit and Exit Status</TITLE
><META
NAME="GENERATOR"
CONTENT="Modular DocBook HTML Stylesheet Version 1.7"><LINK
REL="HOME"
TITLE="Advanced Bash-Scripting Guide"
HREF="index.html"><LINK
REL="UP"
TITLE="Basics"
HREF="part2.html"><LINK
REL="PREVIOUS"
TITLE="Escaping"
HREF="escapingsection.html"><LINK
REL="NEXT"
TITLE="Tests"
HREF="tests.html"></HEAD
><BODY
CLASS="CHAPTER"
BGCOLOR="#FFFFFF"
TEXT="#000000"
LINK="#0000FF"
VLINK="#840084"
ALINK="#0000FF"
><DIV
CLASS="NAVHEADER"
><TABLE
SUMMARY="Header navigation table"
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TH
COLSPAN="3"
ALIGN="center"
>Advanced Bash-Scripting Guide: </TH
></TR
><TR
><TD
WIDTH="10%"
ALIGN="left"
VALIGN="bottom"
><A
HREF="escapingsection.html"
ACCESSKEY="P"
>Prev</A
></TD
><TD
WIDTH="80%"
ALIGN="center"
VALIGN="bottom"
></TD
><TD
WIDTH="10%"
ALIGN="right"
VALIGN="bottom"
><A
HREF="tests.html"
ACCESSKEY="N"
>Next</A
></TD
></TR
></TABLE
><HR
ALIGN="LEFT"
WIDTH="100%"></DIV
><DIV
CLASS="CHAPTER"
><H1
><A
NAME="EXIT-STATUS"
></A
>Chapter 6. Exit and Exit Status</H1
><TABLE
BORDER="0"
WIDTH="100%"
CELLSPACING="0"
CELLPADDING="0"
CLASS="EPIGRAPH"
><TR
><TD
WIDTH="45%"
>&nbsp;</TD
><TD
WIDTH="45%"
ALIGN="LEFT"
VALIGN="TOP"
><I
><P
><I
>... there are dark corners in the Bourne shell, and people use all
of them.</I
></P
><P
><I
>--Chet Ramey</I
></P
></I
></TD
></TR
></TABLE
><P
><A
NAME="EXITCOMMANDREF"
></A
>The
<B
CLASS="COMMAND"
>
exit
</B
>
command terminates a script, just as in a <B
CLASS="COMMAND"
>C</B
>
program. It can also return a value, which is available to the
script's parent process.</P
><P
><A
NAME="EXITSTATUSREF"
></A
>Every command returns an
<I
CLASS="FIRSTTERM"
>
exit status
</I
>
(sometimes referred to as a
<I
CLASS="FIRSTTERM"
>
return status
</I
> or <I
CLASS="FIRSTTERM"
>exit code</I
>).
<A
NAME="EXITSUCCESS"
></A
>
A successful command returns a <SPAN
CLASS="RETURNVALUE"
>0</SPAN
>, while
an unsuccessful one returns a <SPAN
CLASS="RETURNVALUE"
>non-zero</SPAN
>
value that usually can be interpreted as an <I
CLASS="FIRSTTERM"
>error
code</I
>. Well-behaved UNIX commands, programs, and
utilities return a <SPAN
CLASS="RETURNVALUE"
>0</SPAN
> exit code upon
successful completion, though there are some exceptions.</P
><P
><A
NAME="FUNCTXSTR"
></A
></P
><P
>Likewise, <A
HREF="functions.html#FUNCTIONREF"
>functions</A
>
within a script and the script itself return an exit
status. The last command executed in the function or
script determines the exit status. Within a script, an
<TT
CLASS="USERINPUT"
><B
>exit <TT
CLASS="REPLACEABLE"
><I
>nnn</I
></TT
></B
></TT
>
command may be used to deliver an
<SPAN
CLASS="RETURNVALUE"
><TT
CLASS="REPLACEABLE"
><I
>nnn</I
></TT
></SPAN
>
exit status to the shell
(<SPAN
CLASS="RETURNVALUE"
><TT
CLASS="REPLACEABLE"
><I
>nnn</I
></TT
></SPAN
>
must be an integer in the <SPAN
CLASS="RETURNVALUE"
>0</SPAN
> -
<SPAN
CLASS="RETURNVALUE"
>255</SPAN
> range).</P
><DIV
CLASS="NOTE"
><P
></P
><TABLE
CLASS="NOTE"
WIDTH="100%"
BORDER="0"
><TR
><TD
WIDTH="25"
ALIGN="CENTER"
VALIGN="TOP"
><IMG
SRC="../images/note.gif"
HSPACE="5"
ALT="Note"></TD
><TD
ALIGN="LEFT"
VALIGN="TOP"
><P
>When a script ends with an <B
CLASS="COMMAND"
>exit</B
> that has
no parameter, the exit status of the script is the exit status
of the last command executed in the script (previous to the
<B
CLASS="COMMAND"
>exit</B
>).</P
><P
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="100%"
><TR
><TD
><FONT
COLOR="#000000"
><PRE
CLASS="PROGRAMLISTING"
>#!/bin/bash
COMMAND_1
. . .
COMMAND_LAST
# Will exit with status of last command.
exit</PRE
></FONT
></TD
></TR
></TABLE
></P
><P
>The equivalent of a bare <B
CLASS="COMMAND"
>exit</B
> is
<B
CLASS="COMMAND"
>exit $?</B
> or even just omitting the
<B
CLASS="COMMAND"
>exit</B
>.</P
><P
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="100%"
><TR
><TD
><FONT
COLOR="#000000"
><PRE
CLASS="PROGRAMLISTING"
>#!/bin/bash
COMMAND_1
. . .
COMMAND_LAST
# Will exit with status of last command.
exit $?</PRE
></FONT
></TD
></TR
></TABLE
></P
><P
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="100%"
><TR
><TD
><FONT
COLOR="#000000"
><PRE
CLASS="PROGRAMLISTING"
>#!/bin/bash
COMMAND1
. . .
COMMAND_LAST
# Will exit with status of last command.</PRE
></FONT
></TD
></TR
></TABLE
></P
></TD
></TR
></TABLE
></DIV
><P
><A
NAME="EXSREF"
></A
></P
><P
> <TT
CLASS="VARNAME"
> $?</TT
> reads the exit status of the last
command executed. After a function returns,
<TT
CLASS="VARNAME"
>$?</TT
> gives the exit status of the last
command executed in the function. This is Bash's way of giving
functions a <SPAN
CLASS="QUOTE"
>"return value."</SPAN
>
<A
NAME="AEN2981"
HREF="#FTN.AEN2981"
><SPAN
CLASS="footnote"
>[1]</SPAN
></A
>
</P
><P
><A
NAME="PIPEEX"
></A
>Following the execution of a <A
HREF="special-chars.html#PIPEREF"
>pipe</A
>, a <TT
CLASS="VARNAME"
>$?</TT
>
gives the exit status of the last command executed.</P
><P
>After a script terminates, a <TT
CLASS="VARNAME"
>$?</TT
> from the
command-line gives the exit status of the script, that is, the
last command executed in the script, which is, by convention,
<TT
CLASS="USERINPUT"
><B
>0</B
></TT
> on success or an integer in the
range <SPAN
CLASS="RETURNVALUE"
>1 - 255</SPAN
> on error.</P
><DIV
CLASS="EXAMPLE"
><A
NAME="EX5"
></A
><P
><B
>Example 6-1. exit / exit status</B
></P
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="100%"
><TR
><TD
><FONT
COLOR="#000000"
><PRE
CLASS="PROGRAMLISTING"
>#!/bin/bash
echo hello
echo $? # Exit status 0 returned because command executed successfully.
lskdf # Unrecognized command.
echo $? # Non-zero exit status returned -- command failed to execute.
echo
exit 113 # Will return 113 to shell.
# To verify this, type "echo $?" after script terminates.
# By convention, an 'exit 0' indicates success,
#+ while a non-zero exit value means an error or anomalous condition.
# See the "Exit Codes With Special Meanings" appendix.</PRE
></FONT
></TD
></TR
></TABLE
></DIV
><P
><A
HREF="internalvariables.html#XSTATVARREF"
>$?</A
> is especially useful
for testing the result of a command in a script (see <A
HREF="filearchiv.html#FILECOMP"
>Example 16-35</A
> and <A
HREF="textproc.html#LOOKUP"
>Example 16-20</A
>).</P
><DIV
CLASS="NOTE"
><P
></P
><TABLE
CLASS="NOTE"
WIDTH="100%"
BORDER="0"
><TR
><TD
WIDTH="25"
ALIGN="CENTER"
VALIGN="TOP"
><IMG
SRC="../images/note.gif"
HSPACE="5"
ALT="Note"></TD
><TD
ALIGN="LEFT"
VALIGN="TOP"
><P
>The <A
HREF="special-chars.html#NOTREF"
>!</A
>, the <I
CLASS="FIRSTTERM"
>logical
not</I
> qualifier, reverses the outcome of a test or
command, and this affects its <A
HREF="exit-status.html#EXITSTATUSREF"
>exit
status</A
>.
<DIV
CLASS="EXAMPLE"
><A
NAME="NEGCOND"
></A
><P
><B
>Example 6-2. Negating a condition using <SPAN
CLASS="TOKEN"
>!</SPAN
></B
></P
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="100%"
><TR
><TD
><FONT
COLOR="#000000"
><PRE
CLASS="PROGRAMLISTING"
>true # The "true" builtin.
echo "exit status of \"true\" = $?" # 0
! true
echo "exit status of \"! true\" = $?" # 1
# Note that the "!" needs a space between it and the command.
# !true leads to a "command not found" error
#
# The '!' operator prefixing a command invokes the Bash history mechanism.
true
!true
# No error this time, but no negation either.
# It just repeats the previous command (true).
# =========================================================== #
# Preceding a _pipe_ with ! inverts the exit status returned.
ls | bogus_command # bash: bogus_command: command not found
echo $? # 127
! ls | bogus_command # bash: bogus_command: command not found
echo $? # 0
# Note that the ! does not change the execution of the pipe.
# Only the exit status changes.
# =========================================================== #
# Thanks, St<53>phane Chazelas and Kristopher Newsome.</PRE
></FONT
></TD
></TR
></TABLE
></DIV
>
</P
></TD
></TR
></TABLE
></DIV
><DIV
CLASS="CAUTION"
><P
></P
><TABLE
CLASS="CAUTION"
WIDTH="100%"
BORDER="0"
><TR
><TD
WIDTH="25"
ALIGN="CENTER"
VALIGN="TOP"
><IMG
SRC="../images/caution.gif"
HSPACE="5"
ALT="Caution"></TD
><TD
ALIGN="LEFT"
VALIGN="TOP"
><P
>Certain exit status codes have <A
HREF="exitcodes.html#EXITCODESREF"
>reserved meanings</A
> and should not
be user-specified in a script. </P
></TD
></TR
></TABLE
></DIV
></DIV
><H3
CLASS="FOOTNOTES"
>Notes</H3
><TABLE
BORDER="0"
CLASS="FOOTNOTES"
WIDTH="100%"
><TR
><TD
ALIGN="LEFT"
VALIGN="TOP"
WIDTH="5%"
><A
NAME="FTN.AEN2981"
HREF="exit-status.html#AEN2981"
><SPAN
CLASS="footnote"
>[1]</SPAN
></A
></TD
><TD
ALIGN="LEFT"
VALIGN="TOP"
WIDTH="95%"
><P
>In those instances when there is no <A
HREF="complexfunct.html#RETURNREF"
>return</A
>
terminating the function.</P
></TD
></TR
></TABLE
><DIV
CLASS="NAVFOOTER"
><HR
ALIGN="LEFT"
WIDTH="100%"><TABLE
SUMMARY="Footer navigation table"
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
><A
HREF="escapingsection.html"
ACCESSKEY="P"
>Prev</A
></TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="index.html"
ACCESSKEY="H"
>Home</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
><A
HREF="tests.html"
ACCESSKEY="N"
>Next</A
></TD
></TR
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
>Escaping</TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="part2.html"
ACCESSKEY="U"
>Up</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
>Tests</TD
></TR
></TABLE
></DIV
></BODY
></HTML
>