home *** CD-ROM | disk | FTP | other *** search
/ The Datafile PD-CD 4 / DATAFILE_PDCD4.iso / unix / riscbsd / 1_1_contri / usd / 03_shell / t2 < prev    next >
Encoding:
Text File  |  1986-05-22  |  18.1 KB  |  831 lines

  1. .\"    @(#)t2    6.1 (Berkeley) 5/22/86
  2. .\"
  3. .SH
  4. 2.0\ Shell\ procedures
  5. .LP
  6. The shell may be used to read and execute commands
  7. contained in a file.
  8. For example,
  9. .DS
  10.     sh file [ args \*(ZZ ]
  11. .DE
  12. calls the shell to read commands from \fIfile.\fP
  13. Such a file is called a \fIcommand procedure\fP
  14. or \fIshell procedure.\fP
  15. Arguments may be supplied with the call
  16. and are referred to in \fIfile\fP
  17. using the positional parameters
  18. \fB$1, $2, \*(ZZ\|.\fR
  19. For example, if the file \fIwg\fP contains
  20. .DS
  21.     who \*(VT grep $1
  22. .DE
  23. then
  24. .DS
  25.     sh wg fred
  26. .DE
  27. is equivalent to
  28. .DS
  29.     who \*(VT grep fred
  30. .DE
  31. .LP
  32. UNIX files have three independent attributes,
  33. \fIread,\fP \fIwrite\fP and \fIexecute.\fP
  34. The UNIX command \fIchmod\fP (1) may be used
  35. to make a file executable.
  36. For example,
  37. .DS
  38.     chmod +x wg
  39. .DE
  40. will ensure that the file \fIwg\fP has execute status.
  41. Following this, the command
  42. .DS
  43.     wg fred
  44. .DE
  45. is equivalent to
  46. .DS
  47.     sh wg fred
  48. .DE
  49. This allows shell procedures and programs
  50. to be used interchangeably.
  51. In either case a new process is created to
  52. run the command.
  53. .LP
  54. As well as providing names for the positional
  55. parameters,
  56. the number of positional parameters in the call
  57. is available as \fB$#\|.\fP
  58. The name of the file being executed
  59. is available as \fB$0\|.\fP
  60. .LP
  61. A special shell parameter \fB$\*(ST\fP
  62. is used to substitute for all positional parameters
  63. except \fB$0\|.\fP
  64. A typical use of this is to provide
  65. some default arguments,
  66. as in,
  67. .DS
  68.     nroff \(miT450 \(mims $\*(ST
  69. .DE
  70. which simply prepends some arguments
  71. to those already given.
  72. .SH
  73. 2.1\ Control\ flow\ -\ for
  74. .LP
  75. A frequent use of shell procedures is to loop
  76. through the arguments (\fB$1, $2, \*(ZZ\fR)
  77. executing commands once for each argument.
  78. An example of such a procedure is
  79. \fItel\fP that searches the file
  80. \fB/usr/lib/telnos\fR
  81. that contains lines of the form
  82. .DS
  83.     \*(ZZ
  84.     fred mh0123
  85.     bert mh0789
  86.     \*(ZZ
  87. .DE
  88. The text of \fItel\fP is
  89. .DS
  90.     for i
  91.     do grep $i /usr/lib/telnos; done
  92. .DE
  93. The command
  94. .DS
  95.     tel fred
  96. .DE
  97. prints those lines in \fB/usr/lib/telnos\fR
  98. that contain the string \fIfred\|.\fP
  99. .DS
  100.     tel fred bert
  101. .DE
  102. prints those lines containing \fIfred\fP
  103. followed by those for \fIbert.\fP
  104. .LP
  105. The \fBfor\fP loop notation is recognized by the shell
  106. and has the general form
  107. .DS
  108.     \fBfor\fR \fIname\fR \fBin\fR \fIw1 w2 \*(ZZ\fR
  109.     \fBdo\fR \fIcommand-list\fR
  110.     \fBdone\fR
  111. .DE
  112. A \fIcommand-list\fP is a sequence of one or more
  113. simple commands separated or terminated by a newline or semicolon.
  114. Furthermore, reserved words
  115. like \fBdo\fP and \fBdone\fP are only
  116. recognized following a newline or
  117. semicolon.
  118. \fIname\fP is a shell variable that is set
  119. to the words \fIw1 w2 \*(ZZ\fR in turn each time the \fIcommand-list\fP
  120. following \fBdo\fP
  121. is executed.
  122. If \fBin\fR \fIw1 w2 \*(ZZ\fR
  123. is omitted then the loop
  124. is executed once for each positional parameter;
  125. that is, \fBin\fR \fI$\*(ST\fR is assumed.
  126. .LP
  127. Another example of the use of the \fBfor\fP
  128. loop is the \fIcreate\fP command
  129. whose text is
  130. .DS
  131.     for i do >$i; done
  132. .DE
  133. The command
  134. .DS
  135.     create alpha beta
  136. .DE
  137. ensures that two empty files
  138. \fIalpha\fP and \fIbeta\fP exist
  139. and are empty.
  140. The notation \fI>file\fP may be used on its
  141. own to create or clear the contents of a file.
  142. Notice also that a semicolon (or newline) is required before \fBdone.\fP
  143. .SH
  144. 2.2\ Control\ flow\ -\ case
  145. .LP
  146. A multiple way branch is provided for by the
  147. \fBcase\fP notation.
  148. For example,
  149. .DS
  150.     case $# in
  151.     \*(Ca1)    cat \*(AP$1 ;;
  152.     \*(Ca2)    cat \*(AP$2 <$1 ;;
  153.     \*(Ca\*(ST)    echo \\'usage: append [ from ] to\\' ;;
  154.     esac
  155. .DE
  156. is an \fIappend\fP command.
  157. When called
  158. with one argument as
  159. .DS
  160.     append file
  161. .DE
  162. \fB$#\fP is the string \fI1\fP and
  163. the standard input is copied onto the
  164. end of \fIfile\fP
  165. using the \fIcat\fP command.
  166. .DS
  167.     append file1 file2
  168. .DE
  169. appends the contents of \fIfile1\fP
  170. onto \fIfile2.\fP
  171. If the number of arguments supplied to
  172. \fIappend\fP is other than 1 or 2
  173. then a message is printed indicating
  174. proper usage.
  175. .LP
  176. The general form of the \fBcase\fP command
  177. is
  178. .DS
  179.     \fBcase \fIword \fBin
  180.     \*(Ca\fIpattern\|\fB)\ \fIcommand-list\fB\|;;
  181.     \*(Ca\*(ZZ
  182.     \fBesac\fR
  183. .DE
  184. The shell attempts to match
  185. \fIword\fR with each \fIpattern,\fR
  186. in the order in which the patterns
  187. appear.
  188. If a match is found the
  189. associated \fIcommand-list\fP is
  190. executed and execution
  191. of the \fBcase\fP is complete.
  192. Since \*(ST is the pattern that matches any
  193. string it can be used for the default case.
  194. .LP
  195. A word of caution:
  196. no check is made to ensure that only
  197. one pattern matches
  198. the case argument.
  199. The first match found defines the set of commands
  200. to be executed.
  201. In the example below the commands following
  202. the second \*(ST will never be executed.
  203. .DS
  204.     case $# in
  205.     \*(Ca\*(ST) \*(ZZ ;;
  206.     \*(Ca\*(ST) \*(ZZ ;;
  207.     esac
  208. .DE
  209. .LP
  210. Another example of the use of the \fBcase\fP
  211. construction is to distinguish
  212. between different forms
  213. of an argument.
  214. The following example is a fragment of a \fIcc\fP command.
  215. .DS
  216.     for i
  217.     do case $i in
  218.     \*(DC\(mi[ocs])    \*(ZZ ;;
  219.     \*(DC\(mi\*(ST)    echo \\'unknown flag $i\\' ;;
  220.     \*(DC\*(ST.c)    /lib/c0 $i \*(ZZ ;;
  221.     \*(DC\*(ST)    echo \\'unexpected argument $i\\' ;;
  222.     \*(DOesac
  223.     done
  224. .DE
  225. .LP
  226. To allow the same commands to be associated
  227. with more than one pattern
  228. the \fBcase\fP command provides
  229. for alternative patterns
  230. separated by a \*(VT\|.
  231. For example,
  232. .DS
  233.     case $i in
  234.     \*(Ca\(mix\*(VT\(miy)    \*(ZZ
  235.     esac
  236. .DE
  237. is equivalent to
  238. .DS
  239.     case $i in
  240.     \*(Ca\(mi[xy])    \*(ZZ
  241.     esac
  242. .DE
  243. .LP
  244. The usual quoting conventions apply
  245. so that
  246. .DS
  247.     case $i in
  248.     \*(Ca\\\\?)    \*(ZZ
  249. .DE
  250. will match the character \fB?\|.\fP
  251. .SH
  252. 2.3\ Here\ documents
  253. .LP
  254. The shell procedure \fItel\fP
  255. in section 2.1 uses the file \fB/usr/lib/telnos\fR
  256. to supply the data
  257. for \fIgrep.\fP
  258. An alternative is to include this
  259. data
  260. within the shell procedure as a \fIhere\fP document, as in,
  261. .DS
  262.     for i
  263.     do grep $i \*(HE!
  264.     \*(DO\*(ZZ
  265.     \*(DOfred mh0123
  266.     \*(DObert mh0789
  267.     \*(DO\*(ZZ
  268.     !
  269.     done
  270. .DE
  271. In this example
  272. the shell takes the lines between \fB\*(HE!\fR and \fB!\fR
  273. as the standard input for \fIgrep.\fP
  274. The string \fB!\fR is arbitrary, the document
  275. being terminated by a line that consists
  276. of the string following \*(HE\|.
  277. .LP
  278. Parameters are substituted in the document
  279. before it is made available to \fIgrep\fP
  280. as illustrated by the following procedure
  281. called \fIedg\|.\fP
  282. .DS
  283.     ed $3 \*(HE%
  284.     g/$1/s//$2/g
  285.     w
  286.     %
  287. .DE
  288. The call
  289. .DS
  290.     edg string1 string2 file
  291. .DE
  292. is then equivalent to the command
  293. .DS
  294.     ed file \*(HE%
  295.     g/string1/s//string2/g
  296.     w
  297.     %
  298. .DE
  299. and changes all occurrences of \fIstring1\fP
  300. in \fIfile\fP to \fIstring2\|.\fP
  301. Substitution can be prevented using \\
  302. to quote the special character \fB$\fP
  303. as in
  304. .DS
  305.     ed $3 \*(HE+
  306.     1,\\\\$s/$1/$2/g
  307.     w
  308.     +
  309. .DE
  310. (This version of \fIedg\fP is equivalent to
  311. the first except that \fIed\fP will print
  312. a \fB?\fR if there are no occurrences of
  313. the string \fB$1\|.\fP)
  314. Substitution within a \fIhere\fP document
  315. may be prevented entirely by quoting
  316. the terminating string,
  317. for example,
  318. .DS
  319.     grep $i \*(HE\\\\#
  320.     \*(ZZ
  321.     #
  322. .DE
  323. The document is presented
  324. without modification to \fIgrep.\fP
  325. If parameter substitution is not required
  326. in a \fIhere\fP document this latter form
  327. is more efficient.
  328. .SH
  329. 2.4\ Shell\ variables
  330. .LP
  331. The shell
  332. provides string-valued variables.
  333. Variable names begin with a letter
  334. and consist of letters, digits and
  335. underscores.
  336. Variables may be given values by writing, for example,
  337. .DS
  338.     user=fred\ box=m000\ acct=mh0000
  339. .DE
  340. which assigns values to the variables
  341. \fBuser, box\fP and \fBacct.\fP
  342. A variable may be set to the null string
  343. by saying, for example,
  344. .DS
  345.     null=
  346. .DE
  347. The value of a variable is substituted
  348. by preceding its name with \fB$\|;\fP
  349. for example,
  350. .DS
  351.     echo $user
  352. .DE
  353. will echo \fIfred.\fP
  354. .LP
  355. Variables may be used interactively
  356. to provide abbreviations for frequently
  357. used strings.
  358. For example,
  359. .DS
  360.     b=/usr/fred/bin
  361.     mv pgm $b
  362. .DE
  363. will move the file \fIpgm\fP
  364. from the current directory to the directory \fB/usr/fred/bin\|.\fR
  365. A more general notation is available for parameter
  366. (or variable)
  367. substitution, as in,
  368. .DS
  369.     echo ${user}
  370. .DE
  371. which is equivalent to
  372. .DS
  373.     echo $user
  374. .DE
  375. and is used when the parameter name is
  376. followed by a letter or digit.
  377. For example,
  378. .DS
  379.     tmp=/tmp/ps
  380.     ps a >${tmp}a
  381. .DE
  382. will direct the output of \fIps\fR
  383. to the file \fB/tmp/psa,\fR
  384. whereas,
  385. .DS
  386.     ps a >$tmpa
  387. .DE
  388. would cause the value of the variable \fBtmpa\fP
  389. to be substituted.
  390. .LP
  391. Except for \fB$?\fP the following
  392. are set initially by the shell.
  393. \fB$?\fP is set after executing each command.
  394. .RS
  395. .IP \fB$?\fP 8
  396. The exit status (return code)
  397. of the last command executed
  398. as a decimal string.
  399. Most commands return a zero exit status
  400. if they complete successfully,
  401. otherwise a non-zero exit status is returned.
  402. Testing the value of return codes is dealt with
  403. later under \fBif\fP and \fBwhile\fP commands.
  404. .IP \fB$#\fP 8
  405. The number of positional parameters
  406. (in decimal).
  407. Used, for example, in the \fIappend\fP command
  408. to check the number of parameters.
  409. .IP \fB$$\fP 8
  410. The process number of this shell (in decimal).
  411. Since process numbers are unique among
  412. all existing processes, this string is
  413. frequently used to generate
  414. unique
  415. temporary file names.
  416. For example,
  417. .DS
  418.     ps a >/tmp/ps$$
  419.     \*(ZZ
  420.     rm /tmp/ps$$
  421. .DE
  422. .IP \fB$\|!\fP 8
  423. The process number of the last process
  424. run in the background (in decimal).
  425. .IP \fB$\(mi\fP 8
  426. The current shell flags, such as
  427. \fB\(mix\fR and \fB\(miv\|.\fR
  428. .RE
  429. .LP
  430. Some variables have a special meaning to the
  431. shell and should be avoided for general
  432. use.
  433. .RS
  434. .IP \fB$\s-1MAIL\s0\fP 8
  435. When used interactively
  436. the shell looks at the file
  437. specified by this variable
  438. before it issues a prompt.
  439. If the specified file has been modified
  440. since it
  441. was last looked at the shell
  442. prints the message
  443. \fIyou have mail\fP before prompting
  444. for the next command.
  445. This variable is typically set
  446. in the file \fB.profile,\fP
  447. in the user's login directory.
  448. For example,
  449. .DS
  450.     \s-1MAIL\s0=/usr/spool/mail/fred
  451. .DE
  452. .IP \fB$\s-1HOME\s0\fP 8
  453. The default argument
  454. for the \fIcd\fP command.
  455. The current directory is used to resolve
  456. file name references that do not begin with
  457. a \fB/\|,\fR
  458. and is changed using the \fIcd\fP command.
  459. For example,
  460. .DS
  461.     cd /usr/fred/bin
  462. .DE
  463. makes the current directory \fB/usr/fred/bin\|.\fR
  464. .DS
  465.     cat wn
  466. .DE
  467. will print on the terminal the file \fIwn\fP
  468. in this directory.
  469. The command
  470. \fIcd\fP with no argument
  471. is equivalent to
  472. .DS
  473.     cd $\s-1HOME\s0
  474. .DE
  475. This variable is also typically set in the
  476. the user's login profile.
  477. .IP \fB$\s-1PATH\s0\fP 8
  478. A list of directories that contain commands (the \fIsearch path\fR\|).
  479. Each time a command is executed by the shell
  480. a list of directories is searched
  481. for an executable file.
  482. .ne 5
  483. If \fB$\s-1PATH\s0\fP is not set
  484. then the current directory,
  485. \fB/bin\fP, and \fB/usr/bin\fP are searched by default.
  486. .ne 5
  487. Otherwise \fB$\s-1PATH\s0\fP consists of directory
  488. names separated by \fB:\|.\fP
  489. For example,
  490. .DS
  491.     \s-1PATH\s0=\fB:\fP/usr/fred/bin\fB:\fP/bin\fB:\fP/usr/bin
  492. .DE
  493. specifies that the current directory
  494. (the null string before the first \fB:\fP\|),
  495. \fB/usr/fred/bin, /bin \fRand\fP /usr/bin\fR
  496. are to be searched in that order.
  497. In this way individual users
  498. can have their own `private' commands
  499. that are accessible independently
  500. of the current directory.
  501. If the command name contains a \fB/\fR then this directory search
  502. is not used; a single attempt
  503. is made to execute the command.
  504. .IP \fB$\s-1PS1\s0\fP 8
  505. The primary shell prompt string, by default, `\fB$\ \fR'.
  506. .IP \fB$\s-1PS2\s0\fP 8
  507. The shell prompt when further input is needed,
  508. by default, `\fB>\ \fR'.
  509. .IP \fB$\s-1IFS\s0\fP 8
  510. The set of characters used by \fIblank
  511. interpretation\fR (see section 3.4).
  512. .RE
  513. .SH
  514. 2.5\ The\ test\ command
  515. .LP
  516. The \fItest\fP command, although not part of the shell,
  517. is intended for use by shell programs.
  518. For example,
  519. .DS
  520.     test \(mif file
  521. .DE
  522. returns zero exit status if \fIfile\fP
  523. exists and non-zero exit status otherwise.
  524. In general \fItest\fP evaluates a predicate
  525. and returns the result as its exit status.
  526. Some of the more frequently used \fItest\fP
  527. arguments are given here, see \fItest\fP (1)
  528. for a complete specification.
  529. .DS
  530.     test s        true if the argument \fIs\fP is not the null string
  531.     test \(mif file    true if \fIfile\fP exists
  532.     test \(mir file    true if \fIfile\fP is readable
  533.     test \(miw file    true if \fIfile\fP is writable
  534.     test \(mid file    true if \fIfile\fP is a directory
  535. .DE
  536. .SH
  537. 2.6\ Control\ flow\ -\ while
  538. .LP
  539. The actions of
  540. the \fBfor\fP loop and the \fBcase\fP
  541. branch are determined by data available to the shell.
  542. A \fBwhile\fP or \fBuntil\fP loop
  543. and an \fBif then else\fP branch
  544. are also provided whose
  545. actions are determined by the exit status
  546. returned by commands.
  547. A \fBwhile\fP loop has the general form
  548. .DS
  549.     \fBwhile\fP \fIcommand-list\*1\fP
  550.     \fBdo\fP \fIcommand-list\*2\fP
  551.     \fBdone\fP
  552. .DE
  553. .LP
  554. The value tested by the \fBwhile\fP command
  555. is the exit status of the last simple command
  556. following \fBwhile.\fP
  557. Each time round the loop
  558. \fIcommand-list\*1\fP is executed;
  559. if a zero exit status is returned then
  560. \fIcommand-list\*2\fP
  561. is executed;
  562. otherwise, the loop terminates.
  563. For example,
  564. .DS
  565.     while test $1
  566.     do \*(ZZ
  567.     \*(DOshift
  568.     done
  569. .DE
  570. is equivalent to
  571. .DS
  572.     for i
  573.     do \*(ZZ
  574.     done
  575. .DE
  576. \fIshift\fP is a shell command that
  577. renames the positional parameters
  578. \fB$2, $3, \*(ZZ\fR as \fB$1, $2, \*(ZZ\fR
  579. and loses \fB$1\|.\fP
  580. .LP
  581. Another kind of use for the \fBwhile/until\fP
  582. loop is to wait until some
  583. external event occurs and then run
  584. some commands.
  585. In an \fBuntil\fP loop
  586. the termination condition is reversed.
  587. For example,
  588. .DS
  589.     until test \(mif file
  590.     do sleep 300; done
  591.     \fIcommands\fP
  592. .DE
  593. will loop until \fIfile\fP exists.
  594. Each time round the loop it waits for
  595. 5 minutes before trying again.
  596. (Presumably another process
  597. will eventually create the file.)
  598. .SH
  599. 2.7\ Control\ flow\ -\ if
  600. .LP
  601. Also available is a
  602. general conditional branch
  603. of the form,
  604. .DS
  605.     \fBif\fP \fIcommand-list
  606.     \fBthen    \fIcommand-list
  607.     \fBelse    \fIcommand-list
  608.     \fBfi\fR
  609. .DE
  610. that tests the value returned by the last simple command
  611. following \fBif.\fP
  612. .LP
  613. The \fBif\fP command may be used
  614. in conjunction with the \fItest\fP command
  615. to test for the existence of a file as in
  616. .DS
  617.     if test \(mif file
  618.     then    \fIprocess file\fP
  619.     else    \fIdo something else\fP
  620.     fi
  621. .DE
  622. .LP
  623. An example of the use of \fBif, case\fP
  624. and \fBfor\fP constructions is given in
  625. section 2.10\|.
  626. .LP
  627. A multiple test \fBif\fP command
  628. of the form
  629. .DS
  630.     if \*(ZZ
  631.     then    \*(ZZ
  632.     else    if \*(ZZ
  633.         then    \*(ZZ
  634.         else    if \*(ZZ
  635.             \*(ZZ
  636.             fi
  637.         fi
  638.     fi
  639. .DE
  640. may be written using an extension of the \fBif\fP
  641. notation as,
  642. .DS
  643.     if \*(ZZ
  644.     then    \*(ZZ
  645.     elif    \*(ZZ
  646.     then    \*(ZZ
  647.     elif    \*(ZZ
  648.     \*(ZZ
  649.     fi
  650. .DE
  651. .LP
  652. The following example is the \fItouch\fP command
  653. which changes the `last modified' time for a list
  654. of files.
  655. The command may be used in conjunction
  656. with \fImake\fP (1) to force recompilation of a list
  657. of files.
  658. .DS
  659.     flag=
  660.     for i
  661.     do case $i in
  662.     \*(DC\(mic)    flag=N ;;
  663.     \*(DC\*(ST)    if test \(mif $i
  664.     \*(DC    then    ln $i junk$$; rm junk$$
  665.     \*(DC    elif test $flag
  666.     \*(DC    then    echo file \\\\\'$i\\\\\' does not exist
  667.     \*(DC    else    >$i
  668.     \*(DC    fi
  669.     \*(DO esac
  670.     done
  671. .DE
  672. The \fB\(mic\fP flag is used in this command to
  673. force subsequent files to be created if they do not already exist.
  674. Otherwise, if the file does not exist, an error message is printed.
  675. The shell variable \fIflag\fP
  676. is set to some non-null string if the \fB\(mic\fP
  677. argument is encountered.
  678. The commands
  679. .DS
  680.     ln \*(ZZ; rm \*(ZZ
  681. .DE
  682. make a link to the file and then remove it
  683. thus causing the last modified date to be updated.
  684. .LP
  685. The sequence
  686. .DS
  687.     if command1
  688.     then    command2
  689.     fi
  690. .DE
  691. may be written
  692. .DS
  693.     command1 && command2
  694. .DE
  695. Conversely,
  696. .DS
  697.     command1 \*(VT\*(VT command2
  698. .DE
  699. executes \fIcommand2\fP only if \fIcommand1\fP
  700. fails.
  701. In each case the value returned
  702. is that of the last simple command executed.
  703. .SH
  704. 2.8\ Command\ grouping
  705. .LP
  706. Commands may be grouped in two ways,
  707. .DS
  708.     \fB{\fI command-list\fB ; }\fR
  709. .DE
  710. and
  711. .DS
  712.     \fB(\fI command-list\fB )\fR
  713. .DE
  714. .LP
  715. In the first \fIcommand-list\fP is simply executed.
  716. The second form executes \fIcommand-list\fP
  717. as a separate process.
  718. For example,
  719. .DS
  720.     (cd x; rm junk )
  721. .DE
  722. executes \fIrm junk\fP in the directory
  723. \fBx\fP without changing the current
  724. directory of the invoking shell.
  725. .LP
  726. The commands
  727. .DS
  728.     cd x; rm junk
  729. .DE
  730. have the same effect but leave the invoking
  731. shell in the directory \fBx.\fP
  732. .SH
  733. 2.9\ Debugging\ shell\ procedures
  734. .LP
  735. The shell provides two tracing mechanisms
  736. to help when debugging shell procedures.
  737. The first is invoked within the procedure
  738. as
  739. .DS
  740.     set \(miv
  741. .DE
  742. (\fBv\fP for verbose) and causes lines of the
  743. procedure to be printed as they are read.
  744. It is useful to help isolate syntax errors.
  745. It may be invoked without modifying the procedure
  746. by saying
  747. .DS
  748.     sh \(miv proc \*(ZZ
  749. .DE
  750. where \fIproc\fP is the name of the shell procedure.
  751. This flag may be used in conjunction
  752. with the \fB\(min\fP flag which prevents
  753. execution of subsequent commands.
  754. (Note that saying \fIset \(min\fP at a terminal
  755. will render the terminal useless
  756. until an end-of-file is typed.)
  757. .LP
  758. The command
  759. .DS
  760.     set \(mix
  761. .DE
  762. will produce an execution
  763. trace.
  764. Following parameter substitution
  765. each command is printed as it is executed.
  766. (Try these at the terminal to see
  767. what effect they have.)
  768. Both flags may be turned off by saying
  769. .DS
  770.     set \(mi
  771. .DE
  772. and the current setting of the shell flags is available as \fB$\(mi\|.\fR
  773. .SH
  774. 2.10\ The\ man\ command
  775. .LP
  776. The following is the \fIman\fP command
  777. which is used to diplay sections of the UNIX manual on your terminal.
  778. It is called, for example, as
  779. .DS
  780.         man sh
  781.         man \(mit ed
  782.         man 2 fork
  783. .DE
  784. In the first the manual section for \fIsh\fP
  785. is displayed..
  786. Since no section is specified, section 1 is used.
  787. The second example will typeset (\fB\(mit\fP option)
  788. the manual section for \fIed.\fP
  789. The last prints the \fIfork\fP manual page
  790. from section 2, which covers system calls.
  791. .sp 2
  792. .DS
  793.     cd /usr/man
  794.  
  795.     : \'colon is the comment command\'
  796.     : \'default is nroff ($N), section 1 ($s)\'
  797.     N=n\ s=1
  798.  
  799.     for i
  800.     do case $i in
  801. .sp .5
  802.     \*(DC[1\(mi9]\*(ST)    s=$i ;;
  803. .sp .5
  804.     \*(DC\(mit)    N=t ;;
  805. .sp .5
  806.     \*(DC\(min)    N=n ;;
  807. .sp .5
  808.     \*(DC\(mi\*(ST)    echo unknown flag \\\\\'$i\\\\\' ;;
  809. .sp .5
  810.     \*(DC\*(ST)    if test \(mif man$s/$i.$s
  811.     \*(DC    then    ${N}roff man0/${N}aa man$s/$i.$s
  812.     \*(DC    else    : \'look through all manual sections\'
  813.     \*(DC        found=no
  814.     \*(DC        for j in 1 2 3 4 5 6 7 8 9
  815.     \*(DC        do if test \(mif man$j/$i.$j
  816.     \*(DC        \*(DOthen man $j $i
  817.     \*(DC        \*(DO\*(THfound=yes
  818.     \*(DC        \*(DOfi
  819.     \*(DC        done
  820.     \*(DC        case $found in
  821.     \*(DC        \*(Cano) echo \\'$i: manual page not found\\'
  822.     \*(DC        esac
  823.     \*(DC    fi
  824.     \*(DOesac
  825.     done
  826. .DE
  827. .ce
  828. .ft B
  829. Figure 1. A version of the man command
  830. .ft R
  831.