home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume9 / ksh-slides < prev    next >
Text File  |  1989-11-08  |  15KB  |  649 lines

  1. Newsgroups: comp.sources.misc
  2. organization: Math & Computer Science, Emory University, Atlanta, GA
  3. subject: v09i003: Troff source for overhead slides on ksh
  4. From: allbery@uunet.UU.NET (Brandon S. Allbery - comp.sources.misc)
  5. Reply-To: arnold@mathcs.emory.edu (Arnold D. Robbins {EUCC})
  6.  
  7. Posting-number: Volume 9, Issue 3
  8. Submitted-by: arnold@mathcs.emory.edu (Arnold D. Robbins {EUCC})
  9. Archive-name: ksh-slides
  10.  
  11. I recently gave a talk on the Korn Shell to the local Unix User's group.
  12. I made up some overhead projector slides using troff and my friendly
  13. laserwriter.
  14.  
  15. Figuring that perhaps the notes would be useful to a broader audience,
  16. I am posting them here.  If you use them for a talk or notes or whatever,
  17. I'd appreciate getting credit as the original provider.  Otherwise no
  18. restrictions on this.
  19.  
  20. Arnold Robbins                        | Laundry increases
  21. DOMAIN: arnold@emory.mathcs.emory.edu            | exponentially in the
  22. UUCP: gatech!emory!arnold    PHONE: +1 404 727-7636    | number of children.
  23. BITNET: arnold@emory         FAX:   +1 404 727-2599    |   -- Miriam Hartholz
  24. #-------------------------------- cut here ------------------------------------
  25. #! /bin/sh
  26. # This file was wrapped with "dummyshar".  "sh" this file to extract.
  27. # Contents:  ksh-slides.tr
  28. echo extracting 'ksh-slides.tr'
  29. if test -f 'ksh-slides.tr' -a -z "$1"; then echo Not overwriting 'ksh-slides.tr'; else
  30. sed 's/^X//' << \EOF > 'ksh-slides.tr'
  31. X.ta .5i 1i 1.5i 2i 2.5i 3i 3.5i 4i 4.5i 5i 5.5i 6i 6.5i 7i 7.5i
  32. X.ps 24 \" Yow!
  33. X.vs 24p
  34. X.nf
  35. X.de CW
  36. X.in +0.5i
  37. X... .vs 10.5p
  38. X.ta 16m/3u 32m/3u 48m/3u 64m/3u 80m/3u 96m/3u
  39. X.ft CW
  40. X.cs CW 18
  41. X..
  42. X.de CN
  43. X.in -0.5i
  44. X.ta 0.5i 1i 1.5i 2i 2.5i 3i 3.5i 4i 4.5i 5i 5.5i 6i
  45. X... .vs
  46. X.cs CW
  47. X.ft R
  48. X..
  49. X
  50. X.sp 6
  51. X.ce 100
  52. XAn Overview of the Korn Shell
  53. X.sp 6
  54. XArnold Robbins
  55. X.sp 2
  56. XEmory University
  57. XInformation Technology Division
  58. XTechnical Services
  59. XSystems Support
  60. X
  61. X.ft CW
  62. Xarnold@emoryu1.cc.emory.edu
  63. Xgatech!emoryu1!arnold
  64. X.ft R
  65. X.ce 0
  66. X.de fo
  67. X.ps 15
  68. X.ft R
  69. X.tl 'Arnold Robbins'%'KSH Overview'
  70. X.ft
  71. X.ps 24
  72. X..
  73. X.pn 1
  74. X.bp
  75. X.wh -3 fo
  76. X
  77. X.sp 2
  78. XOutline
  79. X
  80. X   \(bu Brief Review of Bourne Shell Basics
  81. X    Initialization files
  82. X    Syntax
  83. X    Control Flow
  84. X    I/O Redirection
  85. X    Substitutions
  86. X    Quoting
  87. X    Pattern Matching
  88. X    Built-in Commands
  89. X    Functions
  90. X.sp 2
  91. X   \(bu Quick Summary Korn Shell New Features
  92. X.sp 2
  93. X   \(bu ``Detailed'' Review Korn Shell New Features
  94. X.sp 2
  95. X   \(bu Availability Information
  96. X.sp 2
  97. X   \(bu References
  98. X.bp
  99. X
  100. X.sp 2
  101. XBasics (System V Release 2 and later Bourne shell)
  102. X
  103. X   \(bu Initialization files
  104. X    Login shell reads
  105. X        \f(CW/etc/profile\fP
  106. X        \f(CW$HOME/.profile\fP
  107. X    Non-login shells don't read anything
  108. X.sp 2
  109. X   \(bu Syntax Elements
  110. X    Simple \fIcommand\fPs
  111. X    \fIPipeline\fPs:    \fIcommand\fPs separated by    \f(CW\(bv\fP
  112. X    \fIList\fPs:    \fIpipeline\fPs
  113. X        separated by        \f(CW;  &  && \(bv\(bv\fR
  114. X        terminated by    \f(CW;  &\fR
  115. X    \f(CW( \fIlist \f(CW)\fR
  116. X    \f(CW{ \fIlist \f(CW; }\fR
  117. X
  118. X.CW
  119. Xvi a b c d e
  120. Xtar -cf - . | (cd /newdir; tar -xvf -)
  121. X{ com1; com2 ; } && { com3 ; com4 ; }
  122. X.CN
  123. X.bp
  124. X
  125. X.sp 2
  126. XBasics (continued)
  127. X
  128. X   \(bu Control Flow
  129. X
  130. X.CW
  131. Xif   \fIlist\fP
  132. Xthen    \fIlist\fP
  133. X\fR[\fP elif \fIlist\fP        # \fRrepeatable, optional\fP
  134. Xthen    \fIlist\fP \fR]\fP
  135. X\fR[\fP else    \fIlist\fP \fR]\fP    # else \fRis also optional\fP
  136. Xfi
  137. X.sp 2
  138. Xwhile \fIlist\fP ; do \fIlist\fP ; done
  139. X.sp 2
  140. Xuntil \fIlist\fP ; do \fIlist\fP ; done
  141. X.sp 2
  142. Xfor \fIidentifier\fP \fR[\fP in \fIword\fP ... \fR]\fP
  143. Xdo    \fIlist\fP
  144. Xdone
  145. X.sp 2
  146. Xcase \fIword\fP in
  147. X\fIpattern\fP \fR[\fP \(bv \fIpattern\fP ... \fR]\fP ) \fIlist\fP ;;
  148. Xesac
  149. X.CN
  150. X.bp
  151. X
  152. X.sp 2
  153. XBasics (continued)
  154. X.sp 4
  155. X   \(bu I/O Redirection
  156. X    Basic file and pipe redirection, since Day 1
  157. X    Here Documents
  158. X    Shell operations can be redirected also
  159. X    (e.g. piping in/out of loops)
  160. X
  161. X.CW
  162. X<    >    >>    \(bv    <<    <<-
  163. X\fIn\fP<&\fIm\fP    \fIn\fP>&\fIm\fP    
  164. X.CN
  165. X.sp 4
  166. X   \(bu Substitutions
  167. X    Parameter (variable) substitution; e.g. \f(CW$HOME\fP
  168. X    Command substitution with \f(CW`...`\fR
  169. X.bp
  170. X
  171. X.sp 2
  172. XBasics (continued)
  173. X.sp 4
  174. X   \(bu Quoting
  175. X    Single quotes: \f(CW'...'\fP
  176. X        \fIno\fP substitutions or escapes
  177. X
  178. X    Double quotes: \f(CW"..."\fP
  179. X        variable and command substitutions happen
  180. X        \e \ escapes stuff
  181. X.sp 4
  182. X   \(bu Pattern matching
  183. X    \f(CW*\fP            matches anything
  184. X    \f(CW?\fP            matches a single character
  185. X    \f(CW[...]\fP        character classes
  186. X    \f(CW[!...]\fP    negated character classes
  187. X.bp
  188. X
  189. X.sp 2
  190. XBasics (continued)
  191. X.sp 1
  192. X   \(bu Builtin commands (most used)
  193. X.CW
  194. X:    .    break    continue
  195. Xcd    echo    eval    exec
  196. Xexit    export    read    test
  197. Xset    shift    times    trap
  198. Xulimit    umask    wait    type
  199. X.CN
  200. X.sp 2
  201. X   \(bu Shell functions
  202. X    Arguments via \f(CW$1\fR, \f(CW$2\fR, ...
  203. X    Invoke just like any command
  204. X    Recursive function calls don't work
  205. X    No local variables
  206. X
  207. X.CW
  208. Xmyfunc ()
  209. X{
  210. X    ...
  211. X}
  212. X
  213. X$ myfunc arg1 arg2 arg3
  214. X.CN
  215. X.bp
  216. X
  217. X.sp 2
  218. XSummary: Why \fIksh\fP is so wonderful
  219. X.sp 4
  220. X   \(bu Improved Performance
  221. X    Despite larger size, scripts often run \fImuch\fR faster
  222. X.sp 4
  223. X   \(bu Compatibility
  224. X    Fully compatible with S5R3 Bourne Shell
  225. X    No retraining needed for \fIsh\fR users
  226. X    Eventually will comply with POSIX
  227. X.sp 4
  228. X   \(bu Interactive use
  229. X    \fIInteractive\fP Command Line History
  230. X    Aliasing
  231. X    Start-up files
  232. X    Tilde Substitution
  233. X    Functions
  234. X.bp
  235. X
  236. X.sp 2
  237. XSummary (continued)
  238. X.sp 4
  239. X   \(bu New features for script writing
  240. X    Functions
  241. X    The co-process
  242. X    The \f(CWselect\fP mechanism for menus
  243. X    String operations
  244. X    Parameter attributes
  245. X    Enhanced traps
  246. X    Enhanced conditionals
  247. X.sp 4
  248. X   \(bu Check out the book
  249. X    This talk only begins to give the flavor of \fIksh\fP
  250. X    Get it and try it, you won't switch back
  251. X.bp
  252. X
  253. X.sp 2
  254. XKorn Shell New Features
  255. X.sp 4
  256. X   \(bu Initialization files
  257. X    Login shell \(em as before
  258. X    All shells perform parameter substitution on
  259. X        the \fIvalue\fP of \f(CW$ENV\fP, and
  260. X        then read that file
  261. X.sp 4
  262. X   \(bu Additional I/O Redirection
  263. X    Open for reading and writing
  264. X        \f(CW<>  \fIfile\fR
  265. X    Override \f(CWnoclobber\fR
  266. X        \f(CW>|  \fIfile\fR
  267. X    Change file descriptor of shell co-process
  268. X        \fIn\f(CW<&p        \fIn\f(CW>&p\fR
  269. X.bp
  270. X
  271. X.sp 2
  272. XKorn Shell New Features (continued)
  273. X.sp 4
  274. X   \(bu New Keywords
  275. X    \f(CW[[ ... ]]\fR    New version of\  \f(CWtest\fP
  276. X        Extended conditional expressions
  277. X        No file name expansion or other word splitting
  278. X.sp 3
  279. X    \f(CWselect\fP for providing menus
  280. X    Prompts with \f(CW$PS3\fP
  281. X
  282. X.CW
  283. Xselect \fIidentifier\fP in \fIword ...\fP
  284. Xdo
  285. X    \fIlist\fP
  286. Xdone
  287. X.CN
  288. X.bp
  289. X
  290. X.sp
  291. X.ce
  292. XExample of \fIselect\fP
  293. X
  294. X.CW
  295. X$ PS3="choice? "
  296. X$ list="$(awk '{ print $2 }' /etc/fstab)"
  297. X$ select fs in $list
  298. X> do
  299. X>     dump 0f /dev/rmt8 $fs
  300. X> done
  301. X 1) /
  302. X 2) /usr
  303. X 3) /usr/src
  304. X 4) /usr/src/local
  305. X 5) /usr/aux
  306. X 6) /usr/aux2
  307. X 7) /var
  308. X 8) /var/tmp
  309. X 9) /home/psy
  310. X10) /home/stu2
  311. X11) /home/eucc
  312. X12) /home/eucc2
  313. Xchoice? 11
  314. X\&... dumping /home/eucc
  315. Xchoice? ^D
  316. X$
  317. X.CN
  318. X.bp
  319. X
  320. X.sp 2
  321. XKorn Shell New Features (continued)
  322. X.sp 4
  323. X   \(bu Aliasing
  324. X    \f(CWalias\fP and \f(CWunalias\fP built-in commands
  325. X    tracked aliases        \(em saves path searching
  326. X    exported aliases
  327. X.sp 4
  328. X   \(bu Tilde Substitution
  329. X    \f(CW~\fR        Current user's home directory
  330. X    \f(CW~\fIuser\fR    \fIuser\fP's home directory
  331. X    \f(CW~+\fR        Value of \f(CW$PWD\fP (current directory)
  332. X    \f(CW~\-\fR        Value of \f(CW$OLDPWD\fP (previous directory)
  333. X.bp
  334. X
  335. X.sp 2
  336. XKorn Shell New Features (continued)
  337. X
  338. X   \(bu Command Substitution
  339. X    Use of \f(CW`...`\fP is obsoleted.
  340. X    New syntax: \f(CW$(\fIlist\fP)\fR
  341. X        Invented because of troubles mixing quotes
  342. X        and nesting quotes and backslashes
  343. X.CW
  344. X$((...))    ->    $(let "...")
  345. X$(< \fIfile\fP)    ->    $(cat \fIfile\fP)
  346. X.CN
  347. X
  348. X.ft CW
  349. X$ echo "a weird quote: $(echo '"')"
  350. X
  351. Xa weird quote: "
  352. X.ft R
  353. X.sp 2
  354. X   \(bu Parameter Substitution
  355. X    All previous mechanisms as in S5 shell.
  356. X
  357. X    Plus new ones:
  358. X    \f(CW${#*}\fR                number positional parameters
  359. X    \f(CW${#@}\fR                number positional parameters
  360. X
  361. X    \f(CW${#\fIident\fP}\fR            length of \fIident\fP's value
  362. X    \f(CW${#\fIident\fP[*]}\fR    number of elements in \fIident\fP
  363. X.bp
  364. X
  365. X.sp 2
  366. XKorn Shell New Features (continued)
  367. X
  368. X   \(bu Parameter Substitution (continued)
  369. X    \f(CW${\fIidentifier\fP#\fIpattern\fP}\fR
  370. X    \f(CW${\fIidentifier\fP##\fIpattern\fP}\fR
  371. X            Substring operation
  372. X            delete shortest/longest from \fIfront\fR
  373. X
  374. X    \f(CW${\fIidentifier\fP%\fIpattern\fP}\fR
  375. X    \f(CW${\fIidentifier\fP%%\fIpattern\fP}\fR
  376. X            Substring operation
  377. X            delete shortest/longest from \fIend\fR
  378. X
  379. X.CW
  380. X$ foo=very/long/path/name
  381. X
  382. X$ echo $foo ${foo#*/} ${foo##*/}
  383. Xvery/long/path/name long/path/name name
  384. X
  385. X$ echo $foo ${foo%/*} ${foo%%/*}
  386. Xvery/long/path/name very/long/path very
  387. X.CN
  388. X.bp
  389. X
  390. X.sp 2
  391. XKorn Shell New Features (continued)
  392. X.sp 2
  393. X   \(bu Shell Parameters
  394. X    Lots of new shell variables.
  395. X    Many others remain only for compatibility.
  396. X    Here are all that \fIksh\fP uses.
  397. X
  398. X.CW
  399. XCDPATH    COLUMNS    EDITOR    ENV
  400. XERRNO    FCEDIT    FPATH    HISTFILE
  401. XHISTSIZE    HOME    IFS    LINENO
  402. XLINES    MAIL    MAILCHECK    MAILPATH
  403. XOLDPWD    OPTARG    OPTIND    PATH
  404. XPPID    PS1    PS2    PS3
  405. XPS4    PWD    RANDOM    REPLY
  406. XSECONDS    SHELL    TMOUT    VISUAL
  407. X.CN
  408. X.sp 3
  409. X   \(bu Arrays
  410. X    Variables can be arrays
  411. X    Up to 1024 elements, numbered 0 to 1023
  412. X    Array assignment via \f(CWset -A \fIname val ...\fR
  413. X.bp
  414. X
  415. X.sp 2
  416. XKorn Shell New Features (continued)
  417. X.sp 2
  418. X   \(bu Variable Attributes
  419. X    Set via \f(CWtypeset\fR built-in
  420. X        \f(CW-L\fR        left-justify
  421. X        \f(CW-R\fR        right-justify
  422. X        \f(CW-Z\fR        zero fill
  423. X        \f(CW-i\fR        variable is an integer
  424. X        \f(CW-l\fR        map all characters to lower case
  425. X        \f(CW-u\fR        map all characters to upper case
  426. X    Can set maximum width of value
  427. X    Other attributes as well
  428. X.bp
  429. X
  430. X.sp 2
  431. XKorn Shell New Features (continued)
  432. X.sp
  433. X   \(bu File Name Generation (Pattern Matching)
  434. X    Normal patterns as in S5 shell.
  435. X    New \fIpattern-list\fPs,
  436. X        one or more patterns separated by \f(CW\(bv\fP
  437. X    \f(CW?(\fIpat-list\fP)\fR    Optionally match any one pattern
  438. X    \f(CW*(\fIpat-list\fP)\fR    Match zero or more of any pattern
  439. X    \f(CW+(\fIpat-list\fP)\fR    Match one or more of any pattern
  440. X    \f(CW@(\fIpat-list\fP)\fR    Match exactly one of the patterns
  441. X    \f(CW!(\fIpat-list\fP)\fR    Match anything except a pattern
  442. X
  443. X\f(CW@(foo\(bvbar)\fR    match \f(CWfoo\fP or \f(CWbar\fP 
  444. X\f(CW?(foo\(bvbar)\fR    match \f(CWfoo\fP or \f(CWbar\fP or nothing
  445. X\f(CW!(*.o)\fR        match anything not ending in \f(CW.o\fP
  446. X.sp 2
  447. X   \(bu Shell co-process
  448. X    \fIcommand \f(CW \(bv&\fR
  449. X    \f(CWread -p\fR
  450. X    \f(CWprint -p\fR
  451. X    \fIn\f(CW<&p        \fIn\f(CW>&p\fR
  452. X    Script can be a \fIfront-end\fR to an application
  453. X        E.g., DBMS, editor
  454. X.bp
  455. X
  456. X.sp 2
  457. XKorn Shell New Features (continued)
  458. X
  459. X   \(bu Arithmetic Evaluation
  460. X    Integer variables (type \f(CWlong\fR in C)
  461. X    Use \f(CWtypeset -i\fP to declare them
  462. X
  463. X    Constants are of the form [\fIbase\fP#]\fInumber\fP
  464. X    Bases from 2 to 36
  465. X
  466. X    Use \f(CWlet\fP to do arithmetic
  467. X    All C operators supported,
  468. X        except \fP++  --  ?:  ,\fR
  469. X
  470. X    No need to use $ to get values in \f(CWlet\fP operations
  471. X    Do need to quote operands to \f(CWlet\fP
  472. X    Therefore, alternate syntax:  \f(CW(( ... ))\fP
  473. X
  474. X    Some commands automatically evaluate
  475. X        expressions; e.g., \f(CWulimit\fP
  476. X
  477. X.CW
  478. X$((...))    ->    $(let "...")
  479. X.CN
  480. X
  481. X.ft CW
  482. Xtypeset -i i=3            # declare i
  483. Xlet i+=1 ; print $i    # prints 4
  484. Xlet "i *= 4"                # i now 16
  485. X((i*=2))                    # i now 32
  486. X.ft R
  487. X.bp
  488. X
  489. X.sp 2
  490. XKorn Shell New Features (continued)
  491. X
  492. X   \(bu Conditional Expressions
  493. X    For use in new \f(CW[[ ... ]]\fP command
  494. X    Obsoletes \f(CWtest\fR and \f(CW[ ... ]\fR
  495. X    All primitives listed under System V \fItest\fR(1)
  496. X    Additional primitives:
  497. X.CW
  498. X    -nt    -ot    -ef
  499. X    -a    -L    -S
  500. X    -O    -G
  501. X    -o  \fIoption\fP
  502. X    /dev/fd/\fIn\fP
  503. X.CN
  504. X    Additional boolean operations:
  505. X.CW
  506. X    ! \fIexp\fP
  507. X    \fIexp\fP && \fIexp\fP
  508. X    \fIexp\fP \(bv\(bv \fIexp\fP
  509. X.CN
  510. X    Grouping with parentheses
  511. X.bp
  512. X
  513. X.sp 2
  514. XKorn Shell New Features (continued)
  515. X.sp 2
  516. X   \(bu Functions
  517. X    Can be recursive
  518. X    Local variables via \f(CWtypeset\fP built-in
  519. X    Can set \f(CWtrap\fPs on a per function basis
  520. X    Function tracing and debugging
  521. X    Two syntaxes:
  522. X
  523. X.CW
  524. Xfunction foo    # \fRpreferred\fP
  525. X{
  526. X    ...
  527. X}
  528. X
  529. Xfoo ()        # \fRobsoleted\fP
  530. X{
  531. X    ...
  532. X}
  533. X.CN
  534. X.bp
  535. X
  536. X.sp 2
  537. XKorn Shell New Features (continued)
  538. X
  539. X   \(bu Enhanced built-in commands
  540. X.CW
  541. Xcd    read
  542. Xset    trap
  543. Xulimit
  544. X.CN
  545. X.sp 4
  546. X   \(bu New built-in commands
  547. X.CW
  548. Xalias    bg    fc    fg
  549. Xgetopts    jobs    kill    let
  550. Xprint    pwd    typeset    unalias
  551. Xunset    whence
  552. X.CN
  553. X.bp
  554. X
  555. X.sp 2
  556. XKorn Shell New Features (continued)
  557. X.sp 3
  558. X   \(bu Job Control
  559. X    Patterned after 4.1BSD \fIcsh\fP (\fIcsh\fP hasn't changed)
  560. X    Trap on \f(CWCHLD\fP when a job exits
  561. X    New built-ins:
  562. X.CW
  563. X    fg    bg    jobs
  564. X.CN
  565. X    New substitutions:
  566. X        \f(CW%%\fP                current job
  567. X        \f(CW%+\fP                current job
  568. X        \f(CW%-\fP                previous job
  569. X        \f(CW%\fInum\fR            job number \fInum\fR
  570. X        \f(CW%?\fIstring\fR        job name matching \fIstring\fR
  571. X.sp 3
  572. X   \(bu History
  573. X    \f(CWHISTFILE \fRand \f(CWHISTSIZE\fR variables
  574. X    \f(CWfc\fP built-in command
  575. X  \(rh \fIvi \fRand \fIemacs \fRcommand line history editors \(lh
  576. X        These are \fIthe\fR major improvement \fIksh\fR
  577. X        offers the interactive user over other shells
  578. X.bp
  579. X
  580. X.sp 2
  581. XKorn Shell New Features (continued)
  582. X
  583. X   \(bu Feature in \fIcsh\fP not in \fIksh\fP
  584. X    Brace expansion with \f(CW{a,b,c}\fP
  585. X        Can be compiled into \fIksh\fP, is not by default
  586. X        (Sadly, requires source, is undocumented)
  587. X
  588. X.CW
  589. X% echo a{b,c,d}
  590. Xab ac ad
  591. X.CN
  592. X.sp 2
  593. X   \(bu Feature only in System V Release 4
  594. X    Process Substitution
  595. X       Only available if \f(CW/dev/fd\fP is supported
  596. X       Runs commands with standard input/output
  597. X        connected to files in \f(CW/dev/fd\fP,
  598. X        said files put on the command line
  599. X
  600. X.CW
  601. X    some_command <(command1) >(command2)
  602. X.CN
  603. X
  604. X    When run, \f(CWsome_command\fP sees
  605. X
  606. X.CW
  607. X    some_command /dev/fd/4 /dev/fd/5
  608. X.CN
  609. X.bp
  610. X
  611. X.sp 2
  612. XAvailability
  613. X.sp 2
  614. X   \(bu Will be a standard part of System V Release 4
  615. X.sp 2
  616. X   \(bu Available \fInow\fR from the AT&T Toolchest.
  617. X        (201) 522-6900, login as \f(CWguest\fP
  618. X        (201) 522-6698, voice contact
  619. X
  620. X        $3,000 source code site license
  621. X        $20,000 binary redistribution rights
  622. X.sp 2
  623. X   \(bu MKS \fIksh\fR for MS-DOS
  624. X.sp 2
  625. X   \(bu Third-party suppliers for other environments
  626. X.sp 2
  627. X   \(bu Clones and near-clones (e.g., GNU \fIbash\fR)
  628. X.bp
  629. X
  630. X.sp 2
  631. XReferences
  632. X
  633. X   \(bu \fIksh\fR(1), the man page that comes with KSH88B.
  634. X
  635. X   \(bu \fIThe KornShell Command and Programming
  636. X    Language\fR, Morris I. Bolsky, David G. Korn.
  637. X    Prentice-Hall, 1989.  ISBN 0-13-516972-0.
  638. EOF
  639. chars=`wc -c < 'ksh-slides.tr'`
  640. if test $chars !=    12310; then echo 'ksh-slides.tr' is $chars characters, should be    12310 characters!; fi
  641. fi
  642. exit 0
  643. -- 
  644. Arnold Robbins -- Emory U. Information Technology Div.  | Laundry increases
  645. DOMAIN: arnold@emoryu1.cc.emory.edu            | exponentially in the
  646. UUCP: gatech!emoryu1!arnold  PHONE: +1 404 727-7636    | number of children.
  647. BITNET: arnold@emoryu1         FAX:   +1 404 727-2599    |   -- Miriam Hartholz
  648.  
  649.