1411 lines
20 KiB
HTML
1411 lines
20 KiB
HTML
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
|
|
<HTML
|
|
><HEAD
|
|
><TITLE
|
|
>Job Control Commands</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="Internal Commands and Builtins"
|
|
HREF="internal.html"><LINK
|
|
REL="PREVIOUS"
|
|
TITLE="Internal Commands and Builtins"
|
|
HREF="internal.html"><LINK
|
|
REL="NEXT"
|
|
TITLE="External Filters, Programs and Commands"
|
|
HREF="external.html"></HEAD
|
|
><BODY
|
|
CLASS="SECT1"
|
|
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="internal.html"
|
|
ACCESSKEY="P"
|
|
>Prev</A
|
|
></TD
|
|
><TD
|
|
WIDTH="80%"
|
|
ALIGN="center"
|
|
VALIGN="bottom"
|
|
>Chapter 15. Internal Commands and Builtins</TD
|
|
><TD
|
|
WIDTH="10%"
|
|
ALIGN="right"
|
|
VALIGN="bottom"
|
|
><A
|
|
HREF="external.html"
|
|
ACCESSKEY="N"
|
|
>Next</A
|
|
></TD
|
|
></TR
|
|
></TABLE
|
|
><HR
|
|
ALIGN="LEFT"
|
|
WIDTH="100%"></DIV
|
|
><DIV
|
|
CLASS="SECT1"
|
|
><H1
|
|
CLASS="SECT1"
|
|
><A
|
|
NAME="AEN9644"
|
|
></A
|
|
>15.1. Job Control Commands</H1
|
|
><P
|
|
>Certain of the following job control commands take a
|
|
<I
|
|
CLASS="FIRSTTERM"
|
|
>job identifier</I
|
|
> as an argument. See
|
|
the <A
|
|
HREF="x9644.html#JOBIDTABLE"
|
|
>table</A
|
|
> at end of the
|
|
chapter.</P
|
|
><P
|
|
></P
|
|
><DIV
|
|
CLASS="VARIABLELIST"
|
|
><DL
|
|
><DT
|
|
><A
|
|
NAME="JOBSREF"
|
|
></A
|
|
><B
|
|
CLASS="COMMAND"
|
|
>jobs</B
|
|
></DT
|
|
><DD
|
|
><P
|
|
>Lists the jobs running in the background, giving
|
|
the <I
|
|
CLASS="FIRSTTERM"
|
|
>job number</I
|
|
>.
|
|
Not as useful as <A
|
|
HREF="system.html#PPSSREF"
|
|
>ps</A
|
|
>.</P
|
|
><DIV
|
|
CLASS="NOTE"
|
|
><P
|
|
></P
|
|
><TABLE
|
|
CLASS="NOTE"
|
|
WIDTH="90%"
|
|
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
|
|
>It is all too easy to confuse
|
|
<I
|
|
CLASS="FIRSTTERM"
|
|
>jobs</I
|
|
> and
|
|
<I
|
|
CLASS="FIRSTTERM"
|
|
>processes</I
|
|
>. Certain <A
|
|
HREF="internal.html#BUILTINREF"
|
|
>builtins</A
|
|
>, such as
|
|
<B
|
|
CLASS="COMMAND"
|
|
>kill</B
|
|
>, <B
|
|
CLASS="COMMAND"
|
|
>disown</B
|
|
>, and
|
|
<B
|
|
CLASS="COMMAND"
|
|
>wait</B
|
|
> accept either a job number or a
|
|
process number as an argument. The <A
|
|
HREF="x9644.html#FGREF"
|
|
>fg</A
|
|
>,
|
|
<A
|
|
HREF="x9644.html#BGREF"
|
|
>bg</A
|
|
> and <B
|
|
CLASS="COMMAND"
|
|
>jobs</B
|
|
>
|
|
commands accept only a job number.</P
|
|
><P
|
|
> <TABLE
|
|
BORDER="1"
|
|
BGCOLOR="#E0E0E0"
|
|
WIDTH="90%"
|
|
><TR
|
|
><TD
|
|
><FONT
|
|
COLOR="#000000"
|
|
><PRE
|
|
CLASS="SCREEN"
|
|
><TT
|
|
CLASS="PROMPT"
|
|
>bash$ </TT
|
|
><TT
|
|
CLASS="USERINPUT"
|
|
><B
|
|
>sleep 100 &</B
|
|
></TT
|
|
>
|
|
<TT
|
|
CLASS="COMPUTEROUTPUT"
|
|
>[1] 1384</TT
|
|
>
|
|
|
|
<TT
|
|
CLASS="PROMPT"
|
|
>bash $ </TT
|
|
><TT
|
|
CLASS="USERINPUT"
|
|
><B
|
|
>jobs</B
|
|
></TT
|
|
>
|
|
<TT
|
|
CLASS="COMPUTEROUTPUT"
|
|
>[1]+ Running sleep 100 &</TT
|
|
></PRE
|
|
></FONT
|
|
></TD
|
|
></TR
|
|
></TABLE
|
|
>
|
|
</P
|
|
><P
|
|
><SPAN
|
|
CLASS="QUOTE"
|
|
>"1"</SPAN
|
|
> is the job number (jobs are
|
|
maintained by the current shell). <SPAN
|
|
CLASS="QUOTE"
|
|
>"1384"</SPAN
|
|
>
|
|
is the <A
|
|
HREF="internalvariables.html#PPIDREF"
|
|
>PID</A
|
|
> or <I
|
|
CLASS="FIRSTTERM"
|
|
>process ID
|
|
number</I
|
|
> (processes are maintained by the system). To kill
|
|
this job/process, either a <B
|
|
CLASS="COMMAND"
|
|
>kill %1</B
|
|
>
|
|
or a <B
|
|
CLASS="COMMAND"
|
|
>kill 1384</B
|
|
> works.</P
|
|
><P
|
|
><EM
|
|
>Thanks, S.C.</EM
|
|
></P
|
|
></TD
|
|
></TR
|
|
></TABLE
|
|
></DIV
|
|
></DD
|
|
><DT
|
|
><A
|
|
NAME="DISOWNREF"
|
|
></A
|
|
><B
|
|
CLASS="COMMAND"
|
|
>disown</B
|
|
></DT
|
|
><DD
|
|
><P
|
|
>Remove job(s) from the shell's table of active jobs.</P
|
|
></DD
|
|
><DT
|
|
><A
|
|
NAME="FGREF"
|
|
></A
|
|
><B
|
|
CLASS="COMMAND"
|
|
>fg</B
|
|
>, <A
|
|
NAME="BGREF"
|
|
></A
|
|
><B
|
|
CLASS="COMMAND"
|
|
>bg</B
|
|
></DT
|
|
><DD
|
|
><P
|
|
>The <B
|
|
CLASS="COMMAND"
|
|
>fg</B
|
|
> command switches a job
|
|
running in the background into the foreground. The
|
|
<B
|
|
CLASS="COMMAND"
|
|
>bg</B
|
|
> command restarts a suspended job, and
|
|
runs it in the background. If no job number is specified,
|
|
then the <B
|
|
CLASS="COMMAND"
|
|
>fg</B
|
|
> or <B
|
|
CLASS="COMMAND"
|
|
>bg</B
|
|
>
|
|
command acts upon the currently running job.</P
|
|
></DD
|
|
><DT
|
|
><A
|
|
NAME="WAITREF"
|
|
></A
|
|
><B
|
|
CLASS="COMMAND"
|
|
>wait</B
|
|
></DT
|
|
><DD
|
|
><P
|
|
>Suspend script execution until all jobs running in
|
|
background have terminated, or until the job number or
|
|
process ID specified as an option terminates. Returns the <A
|
|
HREF="exit-status.html#EXITSTATUSREF"
|
|
>exit status</A
|
|
> of waited-for
|
|
command.</P
|
|
><P
|
|
>You may use the <B
|
|
CLASS="COMMAND"
|
|
>wait</B
|
|
> command
|
|
to prevent a script from exiting before a background
|
|
job finishes executing (this would create a dreaded
|
|
<A
|
|
HREF="x9644.html#ZOMBIEREF"
|
|
>orphan process</A
|
|
>).</P
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="EX39"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 15-26. Waiting for a process to finish before proceeding</B
|
|
></P
|
|
><TABLE
|
|
BORDER="0"
|
|
BGCOLOR="#E0E0E0"
|
|
WIDTH="90%"
|
|
><TR
|
|
><TD
|
|
><FONT
|
|
COLOR="#000000"
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#!/bin/bash
|
|
|
|
ROOT_UID=0 # Only users with $UID 0 have root privileges.
|
|
E_NOTROOT=65
|
|
E_NOPARAMS=66
|
|
|
|
if [ "$UID" -ne "$ROOT_UID" ]
|
|
then
|
|
echo "Must be root to run this script."
|
|
# "Run along kid, it's past your bedtime."
|
|
exit $E_NOTROOT
|
|
fi
|
|
|
|
if [ -z "$1" ]
|
|
then
|
|
echo "Usage: `basename $0` find-string"
|
|
exit $E_NOPARAMS
|
|
fi
|
|
|
|
|
|
echo "Updating 'locate' database..."
|
|
echo "This may take a while."
|
|
updatedb /usr & # Must be run as root.
|
|
|
|
wait
|
|
# Don't run the rest of the script until 'updatedb' finished.
|
|
# You want the the database updated before looking up the file name.
|
|
|
|
locate $1
|
|
|
|
# Without the 'wait' command, in the worse case scenario,
|
|
#+ the script would exit while 'updatedb' was still running,
|
|
#+ leaving it as an orphan process.
|
|
|
|
exit 0</PRE
|
|
></FONT
|
|
></TD
|
|
></TR
|
|
></TABLE
|
|
></DIV
|
|
><P
|
|
>Optionally, <B
|
|
CLASS="COMMAND"
|
|
>wait</B
|
|
> can take a <I
|
|
CLASS="FIRSTTERM"
|
|
>job
|
|
identifier</I
|
|
> as an argument, for example,
|
|
<TT
|
|
CLASS="REPLACEABLE"
|
|
><I
|
|
>wait%1</I
|
|
></TT
|
|
> or <TT
|
|
CLASS="REPLACEABLE"
|
|
><I
|
|
>wait
|
|
$PPID</I
|
|
></TT
|
|
>.
|
|
|
|
<A
|
|
NAME="AEN9753"
|
|
HREF="#FTN.AEN9753"
|
|
><SPAN
|
|
CLASS="footnote"
|
|
>[1]</SPAN
|
|
></A
|
|
>
|
|
|
|
See the <A
|
|
HREF="x9644.html#JOBIDTABLE"
|
|
>job id table</A
|
|
>.</P
|
|
><P
|
|
><A
|
|
NAME="WAITHANG"
|
|
></A
|
|
></P
|
|
><DIV
|
|
CLASS="TIP"
|
|
><P
|
|
></P
|
|
><TABLE
|
|
CLASS="TIP"
|
|
WIDTH="90%"
|
|
BORDER="0"
|
|
><TR
|
|
><TD
|
|
WIDTH="25"
|
|
ALIGN="CENTER"
|
|
VALIGN="TOP"
|
|
><IMG
|
|
SRC="../images/tip.gif"
|
|
HSPACE="5"
|
|
ALT="Tip"></TD
|
|
><TD
|
|
ALIGN="LEFT"
|
|
VALIGN="TOP"
|
|
><P
|
|
>Within a script, running a command in the background
|
|
with an ampersand (&) may cause the script
|
|
to hang until <B
|
|
CLASS="KEYCAP"
|
|
>ENTER</B
|
|
> is hit. This
|
|
seems to occur with commands that write to
|
|
<TT
|
|
CLASS="FILENAME"
|
|
>stdout</TT
|
|
>. It can be a major annoyance.
|
|
<TABLE
|
|
BORDER="0"
|
|
BGCOLOR="#E0E0E0"
|
|
WIDTH="90%"
|
|
><TR
|
|
><TD
|
|
><FONT
|
|
COLOR="#000000"
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#!/bin/bash
|
|
# test.sh
|
|
|
|
ls -l &
|
|
echo "Done."</PRE
|
|
></FONT
|
|
></TD
|
|
></TR
|
|
></TABLE
|
|
>
|
|
<TABLE
|
|
BORDER="1"
|
|
BGCOLOR="#E0E0E0"
|
|
WIDTH="90%"
|
|
><TR
|
|
><TD
|
|
><FONT
|
|
COLOR="#000000"
|
|
><PRE
|
|
CLASS="SCREEN"
|
|
><TT
|
|
CLASS="PROMPT"
|
|
>bash$ </TT
|
|
><TT
|
|
CLASS="USERINPUT"
|
|
><B
|
|
>./test.sh</B
|
|
></TT
|
|
>
|
|
<TT
|
|
CLASS="COMPUTEROUTPUT"
|
|
>Done.
|
|
[bozo@localhost test-scripts]$ total 1
|
|
-rwxr-xr-x 1 bozo bozo 34 Oct 11 15:09 test.sh
|
|
_</TT
|
|
>
|
|
</PRE
|
|
></FONT
|
|
></TD
|
|
></TR
|
|
></TABLE
|
|
>
|
|
</P
|
|
><A
|
|
NAME="AEN9768"
|
|
></A
|
|
><BLOCKQUOTE
|
|
CLASS="BLOCKQUOTE"
|
|
><P
|
|
CLASS="LITERALLAYOUT"
|
|
> As Walter Brameld IV explains it:<br>
|
|
<br>
|
|
As far as I can tell, such scripts don't actually hang. It just<br>
|
|
seems that they do because the background command writes text to<br>
|
|
the console after the prompt. The user gets the impression that<br>
|
|
the prompt was never displayed. Here's the sequence of events:<br>
|
|
<br>
|
|
1. Script launches background command.<br>
|
|
2. Script exits.<br>
|
|
3. Shell displays the prompt.<br>
|
|
4. Background command continues running and writing text to the<br>
|
|
console.<br>
|
|
5. Background command finishes.<br>
|
|
6. User doesn't see a prompt at the bottom of the output, thinks script<br>
|
|
is hanging.<br>
|
|
</P
|
|
></BLOCKQUOTE
|
|
><P
|
|
>Placing a <B
|
|
CLASS="COMMAND"
|
|
>wait</B
|
|
> after the background
|
|
command seems to remedy this.
|
|
<TABLE
|
|
BORDER="0"
|
|
BGCOLOR="#E0E0E0"
|
|
WIDTH="90%"
|
|
><TR
|
|
><TD
|
|
><FONT
|
|
COLOR="#000000"
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#!/bin/bash
|
|
# test.sh
|
|
|
|
ls -l &
|
|
echo "Done."
|
|
wait</PRE
|
|
></FONT
|
|
></TD
|
|
></TR
|
|
></TABLE
|
|
>
|
|
<TABLE
|
|
BORDER="1"
|
|
BGCOLOR="#E0E0E0"
|
|
WIDTH="90%"
|
|
><TR
|
|
><TD
|
|
><FONT
|
|
COLOR="#000000"
|
|
><PRE
|
|
CLASS="SCREEN"
|
|
><TT
|
|
CLASS="PROMPT"
|
|
>bash$ </TT
|
|
><TT
|
|
CLASS="USERINPUT"
|
|
><B
|
|
>./test.sh</B
|
|
></TT
|
|
>
|
|
<TT
|
|
CLASS="COMPUTEROUTPUT"
|
|
>Done.
|
|
[bozo@localhost test-scripts]$ total 1
|
|
-rwxr-xr-x 1 bozo bozo 34 Oct 11 15:09 test.sh</TT
|
|
>
|
|
</PRE
|
|
></FONT
|
|
></TD
|
|
></TR
|
|
></TABLE
|
|
>
|
|
<A
|
|
HREF="io-redirection.html#IOREDIRREF"
|
|
>Redirecting</A
|
|
> the
|
|
output of the command to a file or even to
|
|
<TT
|
|
CLASS="FILENAME"
|
|
>/dev/null</TT
|
|
> also takes care of this
|
|
problem.
|
|
</P
|
|
></TD
|
|
></TR
|
|
></TABLE
|
|
></DIV
|
|
></DD
|
|
><DT
|
|
><A
|
|
NAME="SUSPENDREF"
|
|
></A
|
|
><B
|
|
CLASS="COMMAND"
|
|
>suspend</B
|
|
></DT
|
|
><DD
|
|
><P
|
|
>This has a similar effect to
|
|
<B
|
|
CLASS="KEYCAP"
|
|
>Control</B
|
|
>-<B
|
|
CLASS="KEYCAP"
|
|
>Z</B
|
|
>,
|
|
but it suspends the shell (the shell's parent process should
|
|
resume it at an appropriate time).</P
|
|
></DD
|
|
><DT
|
|
><A
|
|
NAME="LOGOUTREF"
|
|
></A
|
|
><B
|
|
CLASS="COMMAND"
|
|
>logout</B
|
|
></DT
|
|
><DD
|
|
><P
|
|
>Exit a login shell, optionally specifying an <A
|
|
HREF="exit-status.html#EXITSTATUSREF"
|
|
>exit status</A
|
|
>.</P
|
|
></DD
|
|
><DT
|
|
><A
|
|
NAME="TIMESREF"
|
|
></A
|
|
><B
|
|
CLASS="COMMAND"
|
|
>times</B
|
|
></DT
|
|
><DD
|
|
><P
|
|
>Gives statistics on the system time elapsed when
|
|
executing commands, in the following form:
|
|
<TABLE
|
|
BORDER="1"
|
|
BGCOLOR="#E0E0E0"
|
|
WIDTH="90%"
|
|
><TR
|
|
><TD
|
|
><FONT
|
|
COLOR="#000000"
|
|
><PRE
|
|
CLASS="SCREEN"
|
|
><TT
|
|
CLASS="COMPUTEROUTPUT"
|
|
>0m0.020s 0m0.020s</TT
|
|
></PRE
|
|
></FONT
|
|
></TD
|
|
></TR
|
|
></TABLE
|
|
></P
|
|
><P
|
|
>This capability is of relatively limited value, since it is not common to
|
|
profile and benchmark shell scripts.</P
|
|
></DD
|
|
><DT
|
|
><A
|
|
NAME="KILLREF"
|
|
></A
|
|
><B
|
|
CLASS="COMMAND"
|
|
>kill</B
|
|
></DT
|
|
><DD
|
|
><P
|
|
>Forcibly terminate a process by sending it an
|
|
appropriate <I
|
|
CLASS="FIRSTTERM"
|
|
>terminate</I
|
|
> signal
|
|
(see <A
|
|
HREF="system.html#KILLPROCESS"
|
|
>Example 17-6</A
|
|
>).</P
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="SELFDESTRUCT"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 15-27. A script that kills itself</B
|
|
></P
|
|
><TABLE
|
|
BORDER="0"
|
|
BGCOLOR="#E0E0E0"
|
|
WIDTH="90%"
|
|
><TR
|
|
><TD
|
|
><FONT
|
|
COLOR="#000000"
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#!/bin/bash
|
|
# self-destruct.sh
|
|
|
|
kill $$ # Script kills its own process here.
|
|
# Recall that "$$" is the script's PID.
|
|
|
|
echo "This line will not echo."
|
|
# Instead, the shell sends a "Terminated" message to stdout.
|
|
|
|
exit 0 # Normal exit? No!
|
|
|
|
# After this script terminates prematurely,
|
|
#+ what exit status does it return?
|
|
#
|
|
# sh self-destruct.sh
|
|
# echo $?
|
|
# 143
|
|
#
|
|
# 143 = 128 + 15
|
|
# TERM signal</PRE
|
|
></FONT
|
|
></TD
|
|
></TR
|
|
></TABLE
|
|
></DIV
|
|
><P
|
|
><A
|
|
NAME="ZOMBIEREF"
|
|
></A
|
|
></P
|
|
><DIV
|
|
CLASS="NOTE"
|
|
><P
|
|
></P
|
|
><TABLE
|
|
CLASS="NOTE"
|
|
WIDTH="90%"
|
|
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
|
|
><TT
|
|
CLASS="USERINPUT"
|
|
><B
|
|
>kill -l</B
|
|
></TT
|
|
> lists all the
|
|
<A
|
|
HREF="debugging.html#SIGNALD"
|
|
>signals</A
|
|
> (as does the
|
|
file <TT
|
|
CLASS="FILENAME"
|
|
>/usr/include/asm/signal.h</TT
|
|
>).
|
|
A <TT
|
|
CLASS="USERINPUT"
|
|
><B
|
|
>kill -9</B
|
|
></TT
|
|
> is a <I
|
|
CLASS="FIRSTTERM"
|
|
>sure
|
|
kill</I
|
|
>, which will usually terminate a
|
|
process that stubbornly refuses to die with a plain
|
|
<B
|
|
CLASS="COMMAND"
|
|
>kill</B
|
|
>. Sometimes, a <TT
|
|
CLASS="USERINPUT"
|
|
><B
|
|
>kill
|
|
-15</B
|
|
></TT
|
|
> works. A <I
|
|
CLASS="FIRSTTERM"
|
|
>zombie</I
|
|
> process,
|
|
that is, a child process that has terminated, but that
|
|
the <A
|
|
HREF="internal.html#FORKREF"
|
|
>parent process</A
|
|
>
|
|
has not (yet) killed, cannot be killed by a logged-on
|
|
user -- you can't kill something that is already dead --
|
|
but <B
|
|
CLASS="COMMAND"
|
|
>init</B
|
|
> will generally clean it up
|
|
sooner or later.</P
|
|
></TD
|
|
></TR
|
|
></TABLE
|
|
></DIV
|
|
></DD
|
|
><DT
|
|
><A
|
|
NAME="KILLALLREF"
|
|
></A
|
|
><B
|
|
CLASS="COMMAND"
|
|
>killall</B
|
|
></DT
|
|
><DD
|
|
><P
|
|
>The <B
|
|
CLASS="COMMAND"
|
|
>killall</B
|
|
> command
|
|
kills a running process by <I
|
|
CLASS="FIRSTTERM"
|
|
>name</I
|
|
>,
|
|
rather than by <A
|
|
HREF="special-chars.html#PROCESSIDREF"
|
|
>process ID</A
|
|
>.
|
|
If there are multiple instances of a particular command running,
|
|
then doing a <I
|
|
CLASS="FIRSTTERM"
|
|
>killall</I
|
|
> on that command will
|
|
terminate them <EM
|
|
>all</EM
|
|
>.</P
|
|
><DIV
|
|
CLASS="NOTE"
|
|
><P
|
|
></P
|
|
><TABLE
|
|
CLASS="NOTE"
|
|
WIDTH="90%"
|
|
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
|
|
>This refers to the <B
|
|
CLASS="COMMAND"
|
|
>killall</B
|
|
>
|
|
command in <TT
|
|
CLASS="FILENAME"
|
|
>/usr/bin</TT
|
|
>,
|
|
<EM
|
|
>not</EM
|
|
> the <A
|
|
HREF="sysscripts.html#KILLALL2REF"
|
|
>killall script</A
|
|
> in <TT
|
|
CLASS="FILENAME"
|
|
>/etc/rc.d/init.d</TT
|
|
>.</P
|
|
></TD
|
|
></TR
|
|
></TABLE
|
|
></DIV
|
|
></DD
|
|
><DT
|
|
><A
|
|
NAME="COMMANDREF"
|
|
></A
|
|
><B
|
|
CLASS="COMMAND"
|
|
>command</B
|
|
></DT
|
|
><DD
|
|
><P
|
|
>The <B
|
|
CLASS="COMMAND"
|
|
>command</B
|
|
> directive
|
|
disables aliases and functions for the command immediately
|
|
following it.</P
|
|
><P
|
|
> <TABLE
|
|
BORDER="1"
|
|
BGCOLOR="#E0E0E0"
|
|
WIDTH="90%"
|
|
><TR
|
|
><TD
|
|
><FONT
|
|
COLOR="#000000"
|
|
><PRE
|
|
CLASS="SCREEN"
|
|
><TT
|
|
CLASS="PROMPT"
|
|
>bash$ </TT
|
|
><TT
|
|
CLASS="USERINPUT"
|
|
><B
|
|
>command ls</B
|
|
></TT
|
|
>
|
|
</PRE
|
|
></FONT
|
|
></TD
|
|
></TR
|
|
></TABLE
|
|
>
|
|
</P
|
|
><DIV
|
|
CLASS="NOTE"
|
|
><P
|
|
></P
|
|
><TABLE
|
|
CLASS="NOTE"
|
|
WIDTH="90%"
|
|
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
|
|
>This is one of three shell directives that
|
|
effect script command processing. The others are
|
|
<A
|
|
HREF="x9644.html#BLTREF"
|
|
>builtin</A
|
|
> and <A
|
|
HREF="x9644.html#ENABLEREF"
|
|
>enable</A
|
|
>.</P
|
|
></TD
|
|
></TR
|
|
></TABLE
|
|
></DIV
|
|
></DD
|
|
><DT
|
|
><A
|
|
NAME="BLTREF"
|
|
></A
|
|
><B
|
|
CLASS="COMMAND"
|
|
>builtin</B
|
|
></DT
|
|
><DD
|
|
><P
|
|
>Invoking <B
|
|
CLASS="COMMAND"
|
|
>builtin
|
|
BUILTIN_COMMAND</B
|
|
> runs the command
|
|
<TT
|
|
CLASS="REPLACEABLE"
|
|
><I
|
|
>BUILTIN_COMMAND</I
|
|
></TT
|
|
> as a shell <A
|
|
HREF="internal.html#BUILTINREF"
|
|
>builtin</A
|
|
>, temporarily disabling
|
|
both functions and external system commands with the
|
|
same name.</P
|
|
></DD
|
|
><DT
|
|
><A
|
|
NAME="ENABLEREF"
|
|
></A
|
|
><B
|
|
CLASS="COMMAND"
|
|
>enable</B
|
|
></DT
|
|
><DD
|
|
><P
|
|
>This either enables or disables a shell
|
|
builtin command. As an example, <TT
|
|
CLASS="REPLACEABLE"
|
|
><I
|
|
>enable -n
|
|
kill</I
|
|
></TT
|
|
> disables the shell builtin <A
|
|
HREF="x9644.html#KILLREF"
|
|
>kill</A
|
|
>, so that when Bash
|
|
subsequently encounters <I
|
|
CLASS="FIRSTTERM"
|
|
>kill</I
|
|
>, it invokes
|
|
the external command <TT
|
|
CLASS="FILENAME"
|
|
>/bin/kill</TT
|
|
>.</P
|
|
><P
|
|
><A
|
|
NAME="ENABLEREF1"
|
|
></A
|
|
>The <TT
|
|
CLASS="OPTION"
|
|
>-a</TT
|
|
>
|
|
option to <I
|
|
CLASS="FIRSTTERM"
|
|
>enable</I
|
|
> lists all the
|
|
shell builtins, indicating whether or not they
|
|
are enabled. The <TT
|
|
CLASS="OPTION"
|
|
>-f filename</TT
|
|
>
|
|
option lets <I
|
|
CLASS="FIRSTTERM"
|
|
>enable</I
|
|
> load a <A
|
|
HREF="internal.html#BUILTINREF"
|
|
>builtin</A
|
|
> as a shared library
|
|
(DLL) module from a properly compiled object file.
|
|
<A
|
|
NAME="AEN9928"
|
|
HREF="#FTN.AEN9928"
|
|
><SPAN
|
|
CLASS="footnote"
|
|
>[2]</SPAN
|
|
></A
|
|
>.
|
|
</P
|
|
></DD
|
|
><DT
|
|
><A
|
|
NAME="AUTOLOADREF"
|
|
></A
|
|
><B
|
|
CLASS="COMMAND"
|
|
>autoload</B
|
|
></DT
|
|
><DD
|
|
><P
|
|
>This is a port to Bash of the
|
|
<I
|
|
CLASS="FIRSTTERM"
|
|
>ksh</I
|
|
> autoloader. With
|
|
<B
|
|
CLASS="COMMAND"
|
|
>autoload</B
|
|
> in place, a function with
|
|
an <I
|
|
CLASS="FIRSTTERM"
|
|
>autoload</I
|
|
> declaration will load from an
|
|
external file at its first invocation.
|
|
<A
|
|
NAME="AEN9949"
|
|
HREF="#FTN.AEN9949"
|
|
><SPAN
|
|
CLASS="footnote"
|
|
>[3]</SPAN
|
|
></A
|
|
>
|
|
This saves system resources.</P
|
|
><P
|
|
>Note that <I
|
|
CLASS="FIRSTTERM"
|
|
>autoload</I
|
|
> is not a part of the
|
|
core Bash installation. It needs to be loaded in with
|
|
<TT
|
|
CLASS="REPLACEABLE"
|
|
><I
|
|
>enable -f</I
|
|
></TT
|
|
> (see above).</P
|
|
></DD
|
|
></DL
|
|
></DIV
|
|
><P
|
|
><A
|
|
NAME="JOBIDTABLE0"
|
|
></A
|
|
></P
|
|
><DIV
|
|
CLASS="TABLE"
|
|
><A
|
|
NAME="JOBIDTABLE"
|
|
></A
|
|
><P
|
|
><B
|
|
>Table 15-1. Job identifiers</B
|
|
></P
|
|
><TABLE
|
|
BORDER="1"
|
|
CLASS="CALSTABLE"
|
|
><THEAD
|
|
><TR
|
|
><TH
|
|
ALIGN="LEFT"
|
|
VALIGN="TOP"
|
|
>Notation</TH
|
|
><TH
|
|
ALIGN="LEFT"
|
|
VALIGN="TOP"
|
|
>Meaning</TH
|
|
></TR
|
|
></THEAD
|
|
><TBODY
|
|
><TR
|
|
><TD
|
|
ALIGN="LEFT"
|
|
VALIGN="TOP"
|
|
><TT
|
|
CLASS="OPTION"
|
|
>%N</TT
|
|
></TD
|
|
><TD
|
|
ALIGN="LEFT"
|
|
VALIGN="TOP"
|
|
>Job number [N]</TD
|
|
></TR
|
|
><TR
|
|
><TD
|
|
ALIGN="LEFT"
|
|
VALIGN="TOP"
|
|
><TT
|
|
CLASS="OPTION"
|
|
>%S</TT
|
|
></TD
|
|
><TD
|
|
ALIGN="LEFT"
|
|
VALIGN="TOP"
|
|
>Invocation (command-line) of job begins with string <EM
|
|
>S</EM
|
|
></TD
|
|
></TR
|
|
><TR
|
|
><TD
|
|
ALIGN="LEFT"
|
|
VALIGN="TOP"
|
|
><TT
|
|
CLASS="OPTION"
|
|
>%?S</TT
|
|
></TD
|
|
><TD
|
|
ALIGN="LEFT"
|
|
VALIGN="TOP"
|
|
>Invocation (command-line) of job contains within it string <EM
|
|
>S</EM
|
|
></TD
|
|
></TR
|
|
><TR
|
|
><TD
|
|
ALIGN="LEFT"
|
|
VALIGN="TOP"
|
|
><TT
|
|
CLASS="OPTION"
|
|
>%%</TT
|
|
></TD
|
|
><TD
|
|
ALIGN="LEFT"
|
|
VALIGN="TOP"
|
|
><SPAN
|
|
CLASS="QUOTE"
|
|
>"current"</SPAN
|
|
> job (last job stopped in
|
|
foreground or started in background)</TD
|
|
></TR
|
|
><TR
|
|
><TD
|
|
ALIGN="LEFT"
|
|
VALIGN="TOP"
|
|
><TT
|
|
CLASS="OPTION"
|
|
>%+</TT
|
|
></TD
|
|
><TD
|
|
ALIGN="LEFT"
|
|
VALIGN="TOP"
|
|
><SPAN
|
|
CLASS="QUOTE"
|
|
>"current"</SPAN
|
|
> job (last job stopped in
|
|
foreground or started in background)</TD
|
|
></TR
|
|
><TR
|
|
><TD
|
|
ALIGN="LEFT"
|
|
VALIGN="TOP"
|
|
><TT
|
|
CLASS="OPTION"
|
|
>%-</TT
|
|
></TD
|
|
><TD
|
|
ALIGN="LEFT"
|
|
VALIGN="TOP"
|
|
>Last job</TD
|
|
></TR
|
|
><TR
|
|
><TD
|
|
ALIGN="LEFT"
|
|
VALIGN="TOP"
|
|
><TT
|
|
CLASS="OPTION"
|
|
>$!</TT
|
|
></TD
|
|
><TD
|
|
ALIGN="LEFT"
|
|
VALIGN="TOP"
|
|
>Last background process</TD
|
|
></TR
|
|
></TBODY
|
|
></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.AEN9753"
|
|
HREF="x9644.html#AEN9753"
|
|
><SPAN
|
|
CLASS="footnote"
|
|
>[1]</SPAN
|
|
></A
|
|
></TD
|
|
><TD
|
|
ALIGN="LEFT"
|
|
VALIGN="TOP"
|
|
WIDTH="95%"
|
|
><P
|
|
>This only applies to <I
|
|
CLASS="FIRSTTERM"
|
|
>child
|
|
processes</I
|
|
>, of course.</P
|
|
></TD
|
|
></TR
|
|
><TR
|
|
><TD
|
|
ALIGN="LEFT"
|
|
VALIGN="TOP"
|
|
WIDTH="5%"
|
|
><A
|
|
NAME="FTN.AEN9928"
|
|
HREF="x9644.html#AEN9928"
|
|
><SPAN
|
|
CLASS="footnote"
|
|
>[2]</SPAN
|
|
></A
|
|
></TD
|
|
><TD
|
|
ALIGN="LEFT"
|
|
VALIGN="TOP"
|
|
WIDTH="95%"
|
|
><P
|
|
>The C source for a number of loadable builtins is
|
|
typically found in the <TT
|
|
CLASS="FILENAME"
|
|
>/usr/share/doc/bash-?.??/functions</TT
|
|
>
|
|
directory.</P
|
|
><P
|
|
>Note that the <TT
|
|
CLASS="OPTION"
|
|
>-f</TT
|
|
> option to
|
|
<B
|
|
CLASS="COMMAND"
|
|
>enable</B
|
|
> is not <A
|
|
HREF="portabilityissues.html"
|
|
>portable</A
|
|
> to all
|
|
systems.</P
|
|
></TD
|
|
></TR
|
|
><TR
|
|
><TD
|
|
ALIGN="LEFT"
|
|
VALIGN="TOP"
|
|
WIDTH="5%"
|
|
><A
|
|
NAME="FTN.AEN9949"
|
|
HREF="x9644.html#AEN9949"
|
|
><SPAN
|
|
CLASS="footnote"
|
|
>[3]</SPAN
|
|
></A
|
|
></TD
|
|
><TD
|
|
ALIGN="LEFT"
|
|
VALIGN="TOP"
|
|
WIDTH="95%"
|
|
><P
|
|
>The same effect as
|
|
<B
|
|
CLASS="COMMAND"
|
|
>autoload</B
|
|
> can be achieved with <A
|
|
HREF="declareref.html"
|
|
>typeset -fu</A
|
|
>.</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="internal.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="external.html"
|
|
ACCESSKEY="N"
|
|
>Next</A
|
|
></TD
|
|
></TR
|
|
><TR
|
|
><TD
|
|
WIDTH="33%"
|
|
ALIGN="left"
|
|
VALIGN="top"
|
|
>Internal Commands and Builtins</TD
|
|
><TD
|
|
WIDTH="34%"
|
|
ALIGN="center"
|
|
VALIGN="top"
|
|
><A
|
|
HREF="internal.html"
|
|
ACCESSKEY="U"
|
|
>Up</A
|
|
></TD
|
|
><TD
|
|
WIDTH="33%"
|
|
ALIGN="right"
|
|
VALIGN="top"
|
|
>External Filters, Programs and Commands</TD
|
|
></TR
|
|
></TABLE
|
|
></DIV
|
|
></BODY
|
|
></HTML
|
|
> |