





     


                 UUNNIIXX FFoorr BBeeggiinnnneerrss ---- SSeeccoonndd EEddiittiioonn


                          _B_r_i_a_n _W_. _K_e_r_n_i_g_h_a_n

                 _(_U_p_d_a_t_e_d _f_o_r _4_._3_B_S_D _b_y _M_a_r_k _S_e_i_d_e_n_)


                               _A_B_S_T_R_A_C_T

            This  paper  is  meant  to  help  new  users get
          started  on  the  UNIX(R)  operating  system.   It
          includes:

           +o
            basics  needed  for day-to-day use of the system
            -- typing commands, correcting typing  mistakes,
            logging  in and out, mail, inter-terminal commu-
            nication, the file system, printing files, redi-
            recting I/O, pipes, and the shell.

           +o
            document  preparation  --  a brief discussion of
            the major formatting programs  and  macro  pack-
            ages,  hints on preparing documents, and capsule
            descriptions of some supporting software.

           +o
            UNIX programming -- using the  editor,  program-
            ming  the  shell,  programming  in C, other lan-
            guages and tools.

           +o
            An annotated UNIX bibliography.


     IINNTTRROODDUUCCTTIIOONN

       From the user's point of view, the UNIX  operating  system
     is  easy  to  learn  and  use, and presents few of the usual
     impediments to getting the job done.  It is  hard,  however,
     for the beginner to know where to start, and how to make the
     best use of the facilities available.  The purpose  of  this
     introduction is to help new users get used to the main ideas
     of the UNIX system and start  making  effective  use  of  it
     quickly.

       You  should  have a couple of other documents with you for
     easy reference as you read this one.  The most important  is
     _T_h_e  _U_N_I_X _P_r_o_g_r_a_m_m_e_r_'_s _M_a_n_u_a_l; it's often easier to tell you
     to read about something in the manual  than  to  repeat  its









     USD:1-2                                   UNIX For Beginners


     contents  here.   The  other  useful  document is _A _T_u_t_o_r_i_a_l
     _I_n_t_r_o_d_u_c_t_i_o_n _t_o _t_h_e _U_N_I_X _T_e_x_t _E_d_i_t_o_r_, which  will  tell  you
     how  to  use the editor to get text -- programs, data, docu-
     ments -- into the computer.

       A word of warning: the UNIX system has become quite  popu-
     lar, and there are several major variants in widespread use.
     Of course details also change with time.   So  although  the
     basic  structure  of UNIX and how to use it is common to all
     versions, there will certainly be a  few  things  which  are
     different  on  your  system from what is described here.  We
     have tried to minimize the problem, but be aware of it.   In
     cases of doubt, this paper describes Version 7 UNIX.

       This paper has five sections:

       1.
       Getting  Started:  How  to log in, how to type, what to do
       about mistakes in typing, how to log out.  Some of this is
       dependent on which system you log into (phone numbers, for
       example) and what terminal you use, so this  section  must
       necessarily be supplemented by local information.

       2.
       Day-to-day  Use: Things you need every day to use the sys-
       tem effectively: generally useful commands; the file  sys-
       tem.

       3.
       Document  Preparation: Preparing manuscripts is one of the
       most common uses for UNIX systems.  This section  contains
       advice,  but not extensive instructions on any of the for-
       matting tools.

       4.
       Writing Programs: UNIX is an excellent system for develop-
       ing programs.  This section talks about some of the tools,
       but again is not a tutorial in any of the programming lan-
       guages provided by the system.

       5.
       A  UNIX  Reading List.  An annotated bibliography of docu-
       ments that new users should be aware of.

     II..  GGEETTTTIINNGG SSTTAARRTTEEDD

     LLooggggiinngg IInn

       You must have a UNIX login name, which you  can  get  from
     whoever  administers your system.  You also need to know the
     phone number, unless your system uses permanently  connected
     terminals.   The  UNIX  system  is capable of dealing with a
     wide variety of terminals: Terminet 300's; Execuport, TI and
     similar  portables;  video  (CRT) terminals like the HP2640,









     UNIX For Beginners                                   USD:1-3


     etc.; high-priced  graphics  terminals  like  the  Tektronix
     4014;  plotting  terminals like those from GSI and DASI; and
     even the venerable Teletype in its various forms.  But note:
     UNIX  is  strongly oriented towards devices with _l_o_w_e_r _c_a_s_e_.
     If your terminal produces only upper case  (e.g.,  model  33
     Teletype,  some  video and portable terminals), life will be
     so difficult that you should look for another terminal.

       Be sure to set the switches appropriately on your  device.
     Switches  that  might need to be adjusted include the speed,
     upper/lower case mode, full duplex,  even  parity,  and  any
     others  that  local  wisdom advises.  Establish a connection
     using whatever magic is needed for your terminal;  this  may
     involve  dialing  a  telephone  call  or  merely  flipping a
     switch.  In either case, UNIX should type _`_`llooggiinn::'' at you.
     If  it  types  garbage, you may be at the wrong speed; check
     the switches.  If that fails, push the ``break'' or ``inter-
     rupt''  key a few times, slowly.  If that fails to produce a
     login message, consult a guru.

       When you get a llooggiinn:: message, type  your  login  name  _i_n
     _l_o_w_e_r  _c_a_s_e_.   Follow it by a RETURN; the system will not do
     anything  until  you  type  a  RETURN.   If  a  password  is
     required, you will be asked for it, and (if possible) print-
     ing will be turned off while  you  type  it.   Don't  forget
     RETURN.

       The  culmination of your login efforts is a ``prompt char-
     acter,'' a single character that indicates that  the  system
     is  ready to accept commands from you.  The prompt character
     is usually a dollar sign $$ or a percent sign  %%.   (You  may
     also get a message of the day just before the prompt charac-
     ter, or a notification that you have mail.)

     TTyyppiinngg CCoommmmaannddss

       Once you've seen the prompt character, you can  type  com-
     mands, which are requests that the system do something.  Try
     typing

         ddaattee

     followed by RETURN.  You should get back something like

         MMoonn JJaann 1166 1144::1177::1100 EESSTT 11997788

     Don't forget the RETURN after the command, or  nothing  will
     happen.   If  you think you're being ignored, type a RETURN;
     something should happen.  RETURN won't be  mentioned  again,
     but don't forget it -- it has to be there at the end of each
     line.

       Another command you might try  is  wwhhoo,  which  tells  you
     everyone who is currently logged in:









     USD:1-4                                   UNIX For Beginners


         wwhhoo

     gives something like

         mmbb   ttttyy0011JJaann 1166    0099::1111
         sskkii  ttttyy0055JJaann 1166    0099::3333
         ggaamm  ttttyy1111JJaann 1166    1133::0077

     The  time  is when the user logged in; ``ttyxx'' is the sys-
     tem's idea of what terminal the user is on.

       If you make a mistake typing the command name,  and  refer
     to  a  non-existent command, you will be told.  For example,
     if you type

         wwhhoomm

     you will be told

         wwhhoomm:: nnoott ffoouunndd

     Of course, if you inadvertently type the name of some  other
     command,  it will run, with more or less mysterious results.

     SSttrraannggee TTeerrmmiinnaall BBeehhaavviioorr

       Sometimes you can get into a  state  where  your  terminal
     acts  strangely.   For  example,  each  letter  may be typed
     twice, or the RETURN may not cause a line feed or  a  return
     to  the  left margin.  You can often fix this by logging out
     and logging back in.  Or you can read the description of the
     command ssttttyy in section 1 of the manual.  To get intelligent
     treatment of tab characters (which are much used in UNIX) if
     your terminal doesn't have tabs, type the command

         ssttttyy --ttaabbss

     and the system will convert each tab into the  right  number
     of blanks for you.

     MMiissttaakkeess iinn TTyyppiinngg

       If you make a typing mistake, and see it before RETURN has
     been typed, there are two ways to recover.  The  sharp-char-
     acter  ## erases the last character typed; in fact successive
     uses of ## erase characters back to the beginning of the line
     (but  not beyond).  So if you type badly, you can correct as
     you go:


     -----------
      In Berkeley Unix, the command  "reset<control-j>"
     will  often  reset  a  terminal  apparently  in  a
     strange state because a fullscreen editor crashed.









     UNIX For Beginners                                   USD:1-5


         dddd##aattttee####ee

     is the same as ddaattee.

       The at-sign @@ erases all of the characters typed so far on
     the  current  input  line,  so  if the line is irretrievably
     fouled up, type an @@ and start the line over.

       What if you must enter a sharp or at-sign as part  of  the
     text?   If  you  precede  either ## or @@ by a backslash \\, it
     loses its erase meaning.  So to enter a sharp or at-sign  in
     something,  type  \\##  or  \\@@.  The system will always echo a
     newline at you after your at-sign, even  if  preceded  by  a
     backslash.  Don't worry -- the at-sign has been recorded.

       To  erase  a backslash, you have to type two sharps or two
     at-signs, as in \\####.  The backslash is used  extensively  in
     UNIX to indicate that the following character is in some way
     special.

     RReeaadd--aahheeaadd

       UNIX has full read-ahead, which means that you can type as
     fast  as you want, whenever you want, even when some command
     is typing at you.  If you type  during  output,  your  input
     characters  will  appear  intermixed with the output charac-
     ters, but they will be stored away and  interpreted  in  the
     correct  order.   So you can type several commands one after
     another without waiting for the  first  to  finish  or  even
     begin.

     SSttooppppiinngg aa PPrrooggrraamm

       You can stop most programs by typing the character ``DEL''
     (perhaps called ``delete'' or ``rubout'' on your  terminal).
     The  ``interrupt''  or ``break'' key found on most terminals
     can also be used.  In a few programs, like the text  editor,
     DEL  stops  whatever  the program is doing but leaves you in
     that program.  Hanging up the phone will stop most programs.

     LLooggggiinngg OOuutt

       The easiest way to log out is to hang up the  phone.   You
     can also type

     -----------
      Many installations set the  erase  character  for
     display  terminals to the delete or backspace key.
     "stty all" tells you what it actually is.
      In Berkeley Unix, "control-c" is the usual way to
     stop  programs.  "stty all" tells you the value of
     your "intr" key.
      In most modern shells, programs  running  in  the
     background continue running even if you hang up.









     USD:1-6                                   UNIX For Beginners


         llooggiinn

     and let someone else use the terminal you were on.*   It  is
     usually  not sufficient just to turn off the terminal.  Most
     UNIX systems do not use a time-out mechanism, so  you'll  be
     there forever unless you hang up.

     MMaaiill

       When you log in, you may sometimes get the message

         YYoouu hhaavvee mmaaiill..

     UNIX  provides  a  postal system so you can communicate with
     other users of the system.  To read your mail, type the com-
     mand

         mmaaiill

     The  headers  of  your mail will be printed, in the order of
     their receipt.  A message can be read with  the  pprriinntt  com-
     mand,  or  specified directly by number.  Other commands are
     described in the manual.  (Earlier versions of mmaaiill  do  not
     process one message at a time, but are otherwise similar.)

       How do you send mail to someone else?  Suppose it is to go
     to ``joe'' (assuming ``joe'' is someone's login name).   The
     easiest way is this:

         mmaaiill jjooee
         _n_o_w _t_y_p_e _i_n _t_h_e _t_e_x_t _o_f _t_h_e _l_e_t_t_e_r
         _o_n _a_s _m_a_n_y _l_i_n_e_s _a_s _y_o_u _l_i_k_e _._._.
         _A_f_t_e_r _t_h_e _l_a_s_t _l_i_n_e _o_f _t_h_e _l_e_t_t_e_r
         _t_y_p_e _t_h_e _c_h_a_r_a_c_t_e_r _`_`_._'_'_,
         _a_l_o_n_e _o_n _t_h_e _l_a_s_t _l_i_n_e_,
         _l_i_k_e _s_o_:
         _.

     And that's it.

       For  practice,  send  mail  to  yourself.   (This isn't as
     strange as it might sound -- mail  to  oneself  is  a  handy
     reminder mechanism.)

       There are other ways to send mail -- you can send a previ-
     ously prepared letter, and you can mail to a number of  peo-
     ple all at once.  For more details, see mmaaiill(1).  (The nota-
     tion mmaaiill(1) means the command mmaaiill in section 1 of the _U_N_I_X
     _P_r_o_g_r_a_m_m_e_r_'_s _M_a_n_u_a_l.)



     -----------
     * "control-d" and "logout" are other alternatives.









     UNIX For Beginners                                   USD:1-7


     WWrriittiinngg ttoo ootthheerr uusseerrss

       At some point, out of the blue will come a message like

         MMeessssaaggee ffrroomm jjooee ttttyy0077......

     accompanied by a startling beep.  It means that Joe wants to
     talk to you, but unless you take explicit action  you  won't
     be able to talk back.  To respond, type the command

         wwrriittee jjooee

     This establishes a two-way communication path.  Now whatever
     Joe types on his terminal will  appear  on  yours  and  vice
     versa.   The  path is slow, rather like talking to the moon.
     (If you are in the middle of something, you have to get to a
     state where you can type a command.  Normally, whatever pro-
     gram you are running has to terminate or be terminated.   If
     you're  editing,  you can escape temporarily from the editor
     -- read the editor tutorial.)

       A protocol is needed to keep what you  type  from  getting
     garbled up with what Joe types.  Typically it's like this:

         Joe types wwrriittee ssmmiitthh and waits.
         Smith types wwrriittee jjooee and waits.
         Joe  now  types his message (as many lines as he likes).
         When he's ready for a reply, he  signals  it  by  typing
         ((oo)), which stands for ``over''.
         Now Smith types a reply, also terminated by ((oo)).
         This  cycle  repeats  until  someone gets tired; he then
         signals his intent to quit with  ((oooo)),  for  ``over  and
         out''.
         To  terminate  the  conversation,  each side must type a
         ``control-d'' character alone on a line.  When the other
         person types his ``control-d'', you will get the message
         EEOOFF on your terminal.



       If you write to  someone  who  isn't  logged  in,  or  who
     doesn't want to be disturbed, you'll be told.  If the target
     is logged in but doesn't answer  after  a  decent  interval,
     simply type ``control-d''.




     -----------
      Although "write" works on Berkeley UNIX, there is
     a much nicer way of communicating  using  display-
     terminals  --  "talk"  splits  the screen into two
     sections, and both of you can type  simultaneously
     (see talk(1)).









     USD:1-8                                   UNIX For Beginners


     OOnn--lliinnee MMaannuuaall

       The  _U_N_I_X  _P_r_o_g_r_a_m_m_e_r_'_s  _M_a_n_u_a_l is typically kept on-line.
     If you get stuck on something, and can't find an  expert  to
     assist  you, you can print on your terminal some manual sec-
     tion that might help.  This is also useful for  getting  the
     most up-to-date information on a command.  To print a manual
     section, type ``man command-name''.  Thus to read up on  the
     wwhhoo command, type

         mmaann wwhhoo

     and, of course,

         mmaann mmaann

     tells all about the mmaann command.

     CCoommppuutteerr AAiiddeedd IInnssttrruuccttiioonn

       Your  UNIX  system  may  have  available  a program called
     lleeaarrnn, which provides computer aided instruction on the file
     system and basic commands, the editor, document preparation,
     and even C programming.  Try typing the command

         lleeaarrnn

     If lleeaarrnn exists on your system, it will tell you what to  do
     from there.

     IIII..  DDAAYY--TTOO--DDAAYY UUSSEE

     CCrreeaattiinngg FFiilleess ---- TThhee EEddiittoorr

       If  you have to type a paper or a letter or a program, how
     do you get the information stored in the machine?   Most  of
     these  tasks  are  done  with  the  UNIX ``text editor'' eedd.
     Since eedd is thoroughly documented in eedd(1) and explained  in
     _A  _T_u_t_o_r_i_a_l  _I_n_t_r_o_d_u_c_t_i_o_n  _t_o _t_h_e _U_N_I_X _T_e_x_t _E_d_i_t_o_r_, we won't
     spend any time here describing how to use it.  All  we  want
     it  for  right now is to make some _f_i_l_e_s_.  (A file is just a
     collection of information stored in the machine, a  simplis-
     tic but adequate definition.)

       To  create a file called jjuunnkk with some text in it, do the
     following:

         eedd jjuunnkk(invokes the text editor)
         aa     (command to ``ed'', to add text)
         _n_o_w _t_y_p_e _i_n
         _w_h_a_t_e_v_e_r _t_e_x_t _y_o_u _w_a_n_t _._._.
         ..     (signals the end of adding text)

     The ``..'' that signals the end of adding text must be at the









     UNIX For Beginners                                   USD:1-9


     beginning  of  a line by itself.  Don't forget it, for until
     it is typed, no other eedd  commands  will  be  recognized  --
     everything you type will be treated as text to be added.

       At this point you can do various editing operations on the
     text you typed in, such  as  correcting  spelling  mistakes,
     rearranging  paragraphs  and  the  like.   Finally, you must
     write the information you have typed into a  file  with  the
     editor command ww:

         ww

     eedd  will respond with the number of characters it wrote into
     the file jjuunnkk.

       Until the ww command, nothing is stored permanently, so  if
     you hang up and go home the information is lost.  But  after
     ww the information is there permanently; you can re-access it
     any time by typing

         eedd jjuunnkk

     Type a qq command to quit the editor.  (If you  try  to  quit
     without  writing, eedd will print a ?? to remind you.  A second
     qq gets you out regardless.)

       Now create a second file called tteemmpp in the  same  manner.
     You should now have two files, jjuunnkk and tteemmpp.

     WWhhaatt ffiilleess aarree oouutt tthheerree??

       The  llss  (for  ``list'') command lists the names (not con-
     tents) of any of the files that UNIX knows  about.   If  you
     type

         llss

     the response will be

         jjuunnkk
         tteemmpp

     which  are indeed the two files just created.  The names are
     sorted into  alphabetical  order  automatically,  but  other
     variations are possible.  For example, the command

         llss --tt

     causes  the  files  to  be listed in the order in which they
     -----------
      This is not strictly true -- if you hang up while
     editing, the data you were working on is saved  in
     a  file called eedd..hhuupp, which you can continue with
     at your next session.









     USD:1-10                                  UNIX For Beginners


     were last changed, most recent first.  The --ll option gives a
     ``long'' listing:

         llss --ll

     will produce something like

         --rrww--rrww--rrww--  11 bbwwkk  uusseerrss 4411 JJuull 2222 22::5566 jjuunnkk
         --rrww--rrww--rrww--  11 bbwwkk  uusseerrss 7788 JJuull 2222 22::5577 tteemmpp

     The  date  and time are of the last change to the file.  The
     41 and 78 are the number of characters (which  should  agree
     with  the numbers you got from eedd).  bbwwkk is the owner of the
     file, that is, the person who created it.  uusseerrss is the name
     of  the  file's group.  The --rrww--rrww--rrww-- tells who has permis-
     sion to read and write the file, in this case everyone.

       Options can be combined: llss --lltt gives the  same  thing  as
     llss --ll,  but  sorted  into time order.  You can also name the
     files you're interested in, and llss will list the information
     about them only.  More details can be found in llss(1).

       The  use  of  optional  arguments  that begin with a minus
     sign, like --tt and --lltt, is a common convention for UNIX  pro-
     grams.  In general, if a program accepts such optional argu-
     ments, they precede any  filename  arguments.   It  is  also
     vital  that  you separate the various arguments with spaces:
     llss--ll is not the same as llss  --ll.

     PPrriinnttiinngg FFiilleess

       Now that you've got a file of text, how do you print it so
     people can look at it?  There are a host of programs that do
     that, probably more than are needed.

       One simple thing is to use the editor, since  printing  is
     often done just before making changes anyway.  You can say

         eedd jjuunnkk
         11,,$$pp

     eedd  will  reply with the count of the characters in jjuunnkk and
     then print all the lines in the file.  After you  learn  how
     to  use the editor, you can be selective about the parts you
     print.

       There are times when it's not feasible to use  the  editor
     for  printing.   For  example, there is a limit on how big a
     file eedd can handle (several thousand lines).   Secondly,  it
     will  only  print one file at a time, and sometimes you want
     to print several, one after another.  So here are  a  couple
     of alternatives.











     UNIX For Beginners                                  USD:1-11


       First  is  ccaatt, the simplest of all the printing programs.
     ccaatt simply prints on the terminal the contents  of  all  the
     files named in a list.  Thus

         ccaatt jjuunnkk

     prints one file, and

         ccaatt jjuunnkk tteemmpp

     prints  two.   The  files are simply concatenated (hence the
     name _`_`ccaatt'') onto the terminal.

       pprr produces formatted printouts of files.  As with ccaatt, pprr
     prints  all  the  files  named in a list.  The difference is
     that it produces headings with date, time, page  number  and
     file  name  at the top of each page, and extra lines to skip
     over the fold in the paper.  Thus,

         pprr jjuunnkk tteemmpp

     will print jjuunnkk neatly, then skip to the top of a  new  page
     and print tteemmpp neatly.

       pprr can also produce multi-column output:

         pprr --33 jjuunnkk

     prints  jjuunnkk in 3-column format.  You can use any reasonable
     number in place of ``3'' and pprr will do its  best.   pprr  has
     other capabilities as well; see pprr(1).

       It  should be noted that pprr is _n_o_t a formatting program in
     the sense of shuffling lines around and justifying  margins.
     The  true  formatters are nnrrooffff and ttrrooffff, which we will get
     to in the section on document preparation.

       There are also programs that print files on  a  high-speed
     printer.  Look in your manual under llpprr.

     SShhuufffflliinngg FFiilleess AAbboouutt

       Now  that  you have some files in the file system and some
     experience in printing them, you can try bigger things.  For
     example,  you  can  move  a  file  from one place to another
     (which amounts to giving it a new name), like this:

         mmvv jjuunnkk pprreecciioouuss

     This means that what used  to  be  ``junk''  is  now  ``pre-
     cious''.  If you do an llss command now, you will get












     USD:1-12                                  UNIX For Beginners


         pprreecciioouuss
         tteemmpp

     Beware  that  if you move a file to another one that already
     exists, the already existing contents are lost forever.

       If you want to make a _c_o_p_y of a file (that is, to have two
     versions of something), you can use the ccpp command:

         ccpp pprreecciioouuss tteemmpp11

     makes a duplicate copy of pprreecciioouuss in tteemmpp11.

       Finally,  when you get tired of creating and moving files,
     there is a command to remove files  from  the  file  system,
     called rrmm.

         rrmm tteemmpp tteemmpp11

     will remove both of the files named.

       You  will  get a warning message if one of the named files
     wasn't there, but otherwise rrmm,  like  most  UNIX  commands,
     does  its  work silently.  There is no prompting or chatter,
     and error messages are occasionally curt.  This terseness is
     sometimes  disconcerting to newcomers, but experienced users
     find it desirable.

     WWhhaatt''ss iinn aa FFiilleennaammee

       So far we have used filenames without ever saying what's a
     legal  name,  so  it's  time  for a couple of rules.  First,
     filenames are limited to 14 characters, which is  enough  to
     be descriptive.  Second, although you  can  use  almost  any
     character  in a filename, common sense says you should stick
     to ones that are visible, and that you should probably avoid
     characters  that might be used with other meanings.  We have
     already seen, for example, that in  the  llss  command,  llss --tt
     means  to  list  in  time order.  So if you had a file whose
     name was --tt, you would have a tough time listing it by name.
     Besides  the  minus  sign,  there are other characters which
     have special meaning.  To avoid pitfalls, you would do  well
     to  use  only  letters,  numbers and the period until you're
     familiar with the situation.

       On to some more positive suggestions.  Suppose you're typ-
     ing  a  large  document like a book.  Logically this divides
     into many small pieces, like chapters and perhaps  sections.
     Physically  it  must  be divided too, for eedd will not handle
     really big files.  Thus you should type the  document  as  a
     number  of  files.   You might have a separate file for each
     -----------
      In  4.2 BSD the limit was extended to 255 charac-
     ters.









     UNIX For Beginners                                  USD:1-13


     chapter, called

         cchhaapp11
         cchhaapp22
         etc...

     Or, if each chapter were  broken  into  several  files,  you
     might have

         cchhaapp11..11
         cchhaapp11..22
         cchhaapp11..33
         ......
         cchhaapp22..11
         cchhaapp22..22
         ......

     You  can  now  tell at a glance where a particular file fits
     into the whole.

       There are advantages to  a  systematic  naming  convention
     which  are not obvious to the novice UNIX user.  What if you
     wanted to print the whole book?  You could say

         pprr cchhaapp11..11 cchhaapp11..22 cchhaapp11..33 ............

     but you would get tired pretty fast, and would probably even
     make  mistakes.   Fortunately, there is a shortcut.  You can
     say

         pprr cchhaapp**

     The ** means ``anything at all,''  so  this  translates  into
     ``print  all  files whose names begin with cchhaapp'', listed in
     alphabetical order.

       This shorthand notation is not a property of the  pprr  com-
     mand,  by the way.  It is system-wide, a service of the pro-
     gram that interprets commands (the ``shell,'' sshh(1)).  Using
     that fact, you can see how to list the names of the files in
     the book:

         llss cchhaapp**

     produces

         cchhaapp11..11
         cchhaapp11..22
         cchhaapp11..33
         ......

     The ** is not limited to the last position in a  filename  --
     it can be anywhere and can occur several times.  Thus










     USD:1-14                                  UNIX For Beginners


         rrmm **jjuunnkk** **tteemmpp**

     removes  all  files that contain jjuunnkk or tteemmpp as any part of
     their name.  As a special case, ** by  itself  matches  every
     filename, so

         pprr **

     prints all your files (alphabetical order), and

         rrmm **

     removes _a_l_l _f_i_l_e_s_.  (You had better be _v_e_r_y sure that's what
     you wanted to say!)

       The ** is not the only pattern-matching feature  available.
     Suppose  you  want to print only chapters 1 through 4 and 9.
     Then you can say

         pprr cchhaapp[[1122334499]]**

     The [[......]] means to match any of the  characters  inside  the
     brackets.   A  range of consecutive letters or digits can be
     abbreviated, so you can also do this with

         pprr cchhaapp[[11--4499]]**

     Letters can also be used within brackets: [[aa--zz]] matches  any
     character in the range aa through zz.

       The ?? pattern matches any single character, so

         llss ??

     lists all files which have single-character names, and

         llss --ll cchhaapp??..11

     lists  information  about  the  first  file  of each chapter
     _(cchhaapp11..11, cchhaapp22..11, etc.).

       Of these niceties, ** is certainly the most useful, and you
     should  get  used  to  it.  The others are frills, but worth
     knowing.

       If you should ever have to turn off the special meaning of
     **, ??, etc., enclose the entire argument in single quotes, as
     in

         llss ''??''

     We'll see some more examples of this shortly.











     UNIX For Beginners                                  USD:1-15


     WWhhaatt''ss iinn aa FFiilleennaammee,, CCoonnttiinnuueedd

       When you first made that file called  jjuunnkk,  how  did  the
     system  know  that there wasn't another jjuunnkk somewhere else,
     especially since the person in the next office is also read-
     ing  this  tutorial?  The answer is that generally each user
     has a private _d_i_r_e_c_t_o_r_y, which contains only the files  that
     belong  to him.  When you log in, you are ``in'' your direc-
     tory.  Unless you take special action, when you create a new
     file, it is made in the directory that you are currently in;
     this is most often your own directory, and thus the file  is
     unrelated  to  any  other  file  of the same name that might
     exist in someone else's directory.

       The set of all files is organized  into  a  (usually  big)
     tree,  with  your  files  located  several branches into the
     tree.  It is possible for you to ``walk'' around this  tree,
     and  to find any file in the system, by starting at the root
     of the tree and walking along the proper  set  of  branches.
     Conversely,  you can start where you are and walk toward the
     root.

       Let's try the latter first.  The basic tools is  the  com-
     mand  ppwwdd  (``print  working  directory''), which prints the
     name of the directory you are currently in.

       Although the details will vary according to the system you
     are on, if you give the command ppwwdd, it will print something
     like

         //uussrr//yyoouurr--nnaammee

     This says that you are currently in the directory yyoouurr--nnaammee,
     which  is in turn in the directory //uussrr, which is in turn in
     the root directory called by convention just  //.   (Even  if
     it's  not called //uussrr on your system, you will get something
     analogous.  Make the  corresponding  mental  adjustment  and
     read on.)

       If you now type

         llss //uussrr//yyoouurr--nnaammee

     you  should  get  exactly the same list of file names as you
     get from a plain llss: with no arguments, llss  lists  the  con-
     tents  of  the current directory; given the name of a direc-
     tory, it lists the contents of that directory.

       Next, try

         llss //uussrr

     This should print a long series of  names,  among  which  is
     your  own  login  name yyoouurr--nnaammee.  On many systems, uussrr is a









     USD:1-16                                  UNIX For Beginners


     directory that contains the directories of  all  the  normal
     users of the system, like you.

       The next step is to try

         llss //

     You  should  get  a  response  something like this (although
     again the details may be different):

         bbiinn
         ddeevv
         eettcc
         lliibb
         ttmmpp
         uussrr

     This is a collection of the basic directories of files  that
     the system knows about; we are at the root of the tree.

       Now try

         ccaatt //uussrr//yyoouurr--nnaammee//jjuunnkk

     (if jjuunnkk is still around in your directory).  The name

         //uussrr//yyoouurr--nnaammee//jjuunnkk

     is  called  the ppaatthhnnaammee of the file that you normally think
     of as ``junk''.  ``Pathname'' has  an  obvious  meaning:  it
     represents the full name of the path you have to follow from
     the root through the tree of directories to get to a partic-
     ular  file.   It is a universal rule in the UNIX system that
     anywhere you can use an ordinary filename,  you  can  use  a
     pathname.

       Here is a picture which may make this clearer:

                                  (root)
                                  / | \
                                 /  |  \
                                /   |   \
                       bin    etc    usr    dev   tmp
                  / | \   / | \   / | \   / | \   / | \
                                 /  |  \
                                /   |   \
                             adam  eve   mary
                         /        /   \        \
                                  /     \       junk
                                junk temp


     Notice that Mary's jjuunnkk is unrelated to Eve's.










     UNIX For Beginners                                  USD:1-17


       This  isn't  too exciting if all the files of interest are
     in your own directory, but if you work with someone else  or
     on  several  projects concurrently, it becomes handy indeed.
     For example, your friends can print your book by saying

         pprr //uussrr//yyoouurr--nnaammee//cchhaapp**

     Similarly, you can find out what files your neighbor has  by
     saying

         llss //uussrr//nneeiigghhbboorr--nnaammee

     or make your own copy of one of his files by

         ccpp //uussrr//yyoouurr--nneeiigghhbboorr//hhiiss--ffiillee yyoouurrffiillee


       If  your  neighbor  doesn't  want you poking around in his
     files, or vice versa, privacy can be  arranged.   Each  file
     and  directory  has  read-write-execute  permissions for the
     owner, a group, and everyone else, which can be set to  con-
     trol access.  See llss(1) and cchhmmoodd(1) for details.  As a mat-
     ter of observed fact, most users most of the time find open-
     ness of more benefit than privacy.

       As a final experiment with pathnames, try

         llss //bbiinn //uussrr//bbiinn

     Do some of the names look familiar?  When you run a program,
     by typing its name after the prompt  character,  the  system
     simply  looks  for  a  file of that name.  It normally looks
     first in your directory (where  it  typically  doesn't  find
     it), then in //bbiinn and finally in //uussrr//bbiinn.  There is nothing
     magic about commands like ccaatt or llss, except that  they  have
     been  collected  into  a couple of places to be easy to find
     and administer.

       What if you work regularly with  someone  else  on  common
     information in his directory?  You could just log in as your
     friend each time you want to, but you can also say ``I  want
     to  work  on his files instead of my own''.  This is done by
     changing the directory that you are currently in:

         ccdd //uussrr//yyoouurr--ffrriieenndd

     (On some systems, ccdd is spelled cchhddiirr.)  Now when you use  a
     filename  in something like ccaatt or pprr, it refers to the file
     in your friend's directory.   Changing  directories  doesn't
     affect  any  permissions  associated  with  a file -- if you
     couldn't access a file from your own directory, changing  to
     another  directory won't alter that fact.  Of course, if you
     forget what directory you're in, type










     USD:1-18                                  UNIX For Beginners


         ppwwdd

     to find out.

       It is usually convenient to arrange your own files so that
     all  the files related to one thing are in a directory sepa-
     rate from other projects.  For example, when you write  your
     book,  you  might  want  to keep all the text in a directory
     called bbooookk.  So make one with

         mmkkddiirr bbooookk

     then go to it with

         ccdd bbooookk

     then start typing chapters.  The book is now found in  (pre-
     sumably)

         //uussrr//yyoouurr--nnaammee//bbooookk

     To remove the directory bbooookk, type

         rrmm bbooookk//**
         rrmmddiirr bbooookk

     The  first command removes all files from the directory; the
     second removes the empty directory.

       You can go up one level in the tree of files by saying

         ccdd ....

     _`_`....'' is the name of the parent of whatever  directory  you
     are  currently  in.  For completeness, _`_`..'' is an alternate
     name for the directory you are in.

     UUssiinngg FFiilleess iinnsstteeaadd ooff tthhee TTeerrmmiinnaall

       Most of the commands we have seen so far produce output on
     the  terminal;  some, like the editor, also take their input
     from the terminal.  It is universal in UNIX systems that the
     terminal  can  be  replaced  by a file for either or both of
     input and output.  As one example,

         llss

     makes a list of files on your terminal.  But if you say

         llss >>ffiilleelliisstt

     a list of your files will be placed  in  the  file  ffiilleelliisstt
     (which will be created if it doesn't already exist, or over-
     written if it does).  The symbol >> means ``put the output on









     UNIX For Beginners                                  USD:1-19


     the  following file, rather than on the terminal.''  Nothing
     is produced on the terminal.  As another example, you  could
     combine  several  files  into one by capturing the output of
     ccaatt in a file:

         ccaatt ff11 ff22 ff33 >>tteemmpp


       The symbol >>>> operates very much like >> does, except  that
     it means ``add to the end of.''  That is,

         ccaatt ff11 ff22 ff33 >>>>tteemmpp

     means to concatenate ff11, ff22 and ff33 to the end of whatever is
     already in tteemmpp, instead of overwriting  the  existing  con-
     tents.  As with >>, if tteemmpp doesn't exist, it will be created
     for you.

       In a similar way, the symbol << means to take the input for
     a  program from the following file, instead of from the ter-
     minal.  Thus, you could make up a script  of  commonly  used
     editing  commands  and  put  them into a file called ssccrriipptt.
     Then you can run the script on a file by saying

         eedd ffiillee <<ssccrriipptt

     As another example, you can use eedd to prepare  a  letter  in
     file lleett, then send it to several people with

         mmaaiill aaddaamm eevvee mmaarryy jjooee <<lleett


     PPiippeess

       One  of  the novel contributions of the UNIX system is the
     idea of a _p_i_p_e_.  A pipe is simply a way to connect the  out-
     put  of  one program to the input of another program, so the
     two run as a sequence of processes -- a pipeline.

       For example,

         pprr ff gg hh

     will print the files ff, gg, and hh, beginning each  on  a  new
     page.   Suppose  you  want  them  run together instead.  You
     could say

         ccaatt ff gg hh >>tteemmpp
         pprr <<tteemmpp
         rrmm tteemmpp

     but this is more work than necessary.  Clearly what we  want
     is  to take the output of ccaatt and connect it to the input of
     pprr.  So let us use a pipe:









     USD:1-20                                  UNIX For Beginners


         ccaatt ff gg hh || pprr

     The vertical bar || means to take the output from ccaatt,  which
     would normally have gone to the terminal, and put it into pprr
     to be neatly formatted.

       There are many other examples of pipes.  For example,

         llss || pprr --33

     prints a list of your files in three columns.   The  program
     wwcc  counts  the number of lines, words and characters in its
     input, and as we saw earlier, wwhhoo  prints  a  list  of  cur-
     rently-logged on people, one per line.  Thus

         wwhhoo || wwcc

     tells how many people are logged on.  And of course

         llss || wwcc

     counts your files.

       Any  program  that reads from the terminal can read from a
     pipe instead; any program that writes on  the  terminal  can
     drive  a  pipe.  You can have as many elements in a pipeline
     as you wish.

       Many UNIX programs are written  so  that  they  will  take
     their  input  from  one  or more files if file arguments are
     given; if no arguments are given they  will  read  from  the
     terminal,  and  thus  can  be  used in pipelines.  pprr is one
     example:

         pprr --33 aa bb cc

     prints files aa, bb and cc in order in three columns.  But in

         ccaatt aa bb cc || pprr --33

     pprr prints the information coming down the pipeline, still in
     three columns.

     TThhee SShheellll

       We  have  already  mentioned  once or twice the mysterious
     ``shell,'' which is in fact sshh(1).  The shell is the program
     that interprets what you type as commands and arguments.  It
     also looks after translating **, etc., into  lists  of  file-
     names,  and  <<,  >>,  and  || into changes of input and output
     streams.

       The shell has other capabilities too.   For  example,  you
     can run two programs with one command line by separating the









     UNIX For Beginners                                  USD:1-21


     commands with a semicolon; the shell  recognizes  the  semi-
     colon and breaks the line into two commands.  Thus

         ddaattee;; wwhhoo

     does both commands before returning with a prompt character.

       You can also have more than one program running _s_i_m_u_l_t_a_n_e_-
     _o_u_s_l_y  if you wish.  For example, if you are doing something
     time-consuming, like the editor script of  an  earlier  sec-
     tion,  and  you  don't  want  to wait around for the results
     before starting something else, you can say

         eedd ffiillee <<ssccrriipptt &&

     The ampersand at the end of a command line says ``start this
     command  running, then take further commands from the termi-
     nal immediately,'' that is, don't wait for it  to  complete.
     Thus the script will begin, but you can do something else at
     the same time.  Of course, to keep the output from interfer-
     ing with what you're doing on the terminal, it would be bet-
     ter to say

         eedd ffiillee <<ssccrriipptt >>ssccrriipptt..oouutt &&

     which saves the output lines in a file called ssccrriipptt..oouutt.

       When you initiate a command with  &&,  the  system  replies
     with  a  number  called the process number, which identifies
     the command in case you later want to stop it.  If  you  do,
     you can say

         kkiillll pprroocceessss--nnuummbbeerr

     If  you  forget the process number, the command ppss will tell
     you about everything you have running.  (If you are  desper-
     ate,  kkiillll 00  will  kill all your processes.)  And if you're
     curious about other people, ppss aa will  tell  you  about  _a_l_l
     programs that are currently running.

       You can say

         ((ccoommmmaanndd--11;; ccoommmmaanndd--22;; ccoommmmaanndd--33)) &&

     to  start three commands in the background, or you can start
     a background pipeline with

         ccoommmmaanndd--11 || ccoommmmaanndd--22 &&


       Just as you can tell the editor or some similar program to
     take its input from a file instead of from the terminal, you
     can tell the shell to read a file  to  get  commands.   (Why
     not?  The  shell,  after  all,  is  just a program, albeit a









     USD:1-22                                  UNIX For Beginners


     clever one.)  For instance, suppose you want to set tabs  on
     your terminal, and find out the date and who's on the system
     every time you log in.  Then you can put the three necessary
     commands  _(ttaabbss,  ddaattee,  wwhhoo)  into  a  file,  let's call it
     ssttaarrttuupp, and then run it with

         sshh ssttaarrttuupp

     This says to run the shell with the file ssttaarrttuupp  as  input.
     The effect is as if you had typed the contents of ssttaarrttuupp on
     the terminal.

       If this is to be a regular thing, you  can  eliminate  the
     need to type sshh: simply type, once only, the command

         cchhmmoodd ++xx ssttaarrttuupp

     and thereafter you need only say

         ssttaarrttuupp

     to run the sequence of commands.  The cchhmmoodd(1) command marks
     the file executable; the shell recognizes this and  runs  it
     as a sequence of commands.

       If  you  want  ssttaarrttuupp to run automatically every time you
     log in,  create  a  file  in  your  login  directory  called
     ..pprrooffiillee,  and place in it the line ssttaarrttuupp.  When the shell
     first gains control when  you  log  in,  it  looks  for  the
     ..pprrooffiillee  file  and  does  whatever commands it finds in it.
     We'll get back to the shell in the section on programming.


     IIIIII.. DDOOCCUUMMEENNTT PPRREEPPAARRAATTIIOONN

       UNIX systems are used extensively  for  document  prepara-
     tion.   There  are  two  major formatting programs, that is,
     programs that produce a text with justified  right  margins,
     automatic page numbering and titling, automatic hyphenation,
     and the like.  nnrrooffff is designed to produce output on termi-
     nals  and  line-printers.   ttrrooffff  (pronounced ``tee-roff'')
     instead drives a phototypesetter, which produces  very  high
     quality  output  on photographic paper.  This paper was for-
     matted with ttrrooffff.

     FFoorrmmaattttiinngg PPaacckkaaggeess

       The basic idea of nnrrooffff and ttrrooffff is that the text  to  be
     formatted  contains  within  it ``formatting commands'' that
     indicate in detail how the formatted text is to  look.   For
     example, there might be commands that specify how long lines
     are, whether to use  single  or  double  spacing,  and  what
     -----------
      The c shell instead reads a file called ..llooggiinn









     UNIX For Beginners                                  USD:1-23


     running titles to use on each page.

       Because  nnrrooffff  and  ttrrooffff are relatively hard to learn to
     use effectively, several ``packages'' of  canned  formatting
     requests  are  available to let you specify paragraphs, run-
     ning titles, footnotes, multi-column output, and so on, with
     little  effort  and without having to learn nnrrooffff and ttrrooffff.
     These packages take  a  modest  effort  to  learn,  but  the
     rewards  for  using  them  are so great that it is time well
     spent.

       In this section, we will  provide  a  hasty  look  at  the
     ``manuscript''  package  known  as --mmss.  Formatting requests
     typically consist of a period and  two  upper-case  letters,
     such  as  ..TTLL, which is used to introduce a title, or ..PPPP to
     begin a new paragraph.

       A document is typed so it looks something like this:

         ..TTLL
         ttiittllee ooff ddooccuummeenntt
         ..AAUU
         aauutthhoorr nnaammee
         ..SSHH
         sseeccttiioonn hheeaaddiinngg
         ..PPPP
         ppaarraaggrraapphh ......
         ..PPPP
         aannootthheerr ppaarraaggrraapphh ......
         ..SSHH
         aannootthheerr sseeccttiioonn hheeaaddiinngg
         ..PPPP
         eettcc..

     The lines that  begin  with  a  period  are  the  formatting
     requests.   For  example, ..PPPP calls for starting a new para-
     graph.  The precise meaning of ..PPPP depends  on  what  output
     device is being used (typesetter or terminal, for instance),
     and on what publication the document will  appear  in.   For
     example,  --mmss  normally assumes that a paragraph is preceded
     by a space (one line in nnrrooffff, 1/2 line in ttrrooffff),  and  the
     first  word  is indented.  These rules can be changed if you
     like, but they are changed by changing the interpretation of
     ..PPPP, not by re-typing the document.

       To  actually  produce  a document in standard format using
     --mmss, use the command

         ttrrooffff --mmss ffiilleess ......

     for the typesetter, and

         nnrrooffff --mmss ffiilleess ......










     USD:1-24                                  UNIX For Beginners


     for a terminal.  The --mmss argument tells ttrrooffff and  nnrrooffff  to
     use the manuscript package of formatting requests.

       There  are  several  similar  packages; check with a local
     expert to determine which ones are in  common  use  on  your
     machine.

     SSuuppppoorrttiinngg TToooollss

       In  addition  to  the basic formatters, there is a host of
     supporting programs that  help  with  document  preparation.
     The list in the next few paragraphs is far from complete, so
     browse through the manual and check with people  around  you
     for other possibilities.

       eeqqnn  and  nneeqqnn let you integrate mathematics into the text
     of a document, in an  easy-to-learn  language  that  closely
     resembles  the  way  you would speak it aloud.  For example,
     the eeqqnn input

         ssuumm ffrroomm ii==00 ttoo nn xx ssuubb ii ~~==~~ ppii oovveerr 22

     produces the output

                sum from i=0 to n x sub i ~=~ pi over 2


       The program ttbbll provides an analogous service for  prepar-
     ing tabular material; it does all the computations necessary
     to  align  complicated  columns  with  elements  of  varying
     widths.

       rreeffeerr  prepares  bibliographic citations from a data base,
     in whatever style is defined by the formatting package.   It
     looks  after  all  the  details  of  numbering references in
     sequence, filling in page and volume  numbers,  getting  the
     author's initials and the journal name right, and so on.

       ssppeellll and ttyyppoo detect possible spelling mistakes in a doc-
     ument.  ssppeellll works by comparing the words in your  document
     to  a dictionary, printing those that are not in the dictio-
     nary.  It knows enough about English spelling to detect plu-
     rals  and  the like, so it does a very good job.  ttyyppoo looks
     for words which are ``unusual'', and prints those.  Spelling
     mistakes  tend  to  be  more unusual, and thus show up early
     when the most unusual words are printed first.

       ggrreepp looks through a set of files for lines that contain a
     particular  text  pattern  (rather like the editor's context
     search does, but on a bunch of files).  For example,


     -----------
      "typo" is not provided with Berkeley Unix.









     UNIX For Beginners                                  USD:1-25


         ggrreepp ''iinngg$$'' cchhaapp**

     will find all lines that end with the  letters  iinngg  in  the
     files  cchhaapp**.   (It  is almost always a good practice to put
     single quotes around the pattern you're  searching  for,  in
     case  it contains characters like ** or $$ that have a special
     meaning to the shell.)  ggrreepp is often useful for finding out
     in  which of a set of files the misspelled words detected by
     ssppeellll are actually located.

       ddiiffff prints a list of the differences between  two  files,
     so  you  can compare two versions of something automatically
     (which certainly beats proofreading by hand).

       wwcc counts the words, lines and  characters  in  a  set  of
     files.   ttrr translates characters into other characters; for
     example it will convert upper to lower case and vice  versa.
     This translates upper into lower:

         ttrr AA--ZZ aa--zz <<iinnppuutt >>oouuttppuutt


       ssoorrtt  sorts  files in a variety of ways; sseedd provides many
     of the editing facilities of eedd, but can apply them to arbi-
     trarily  long  inputs.   aawwkk provides the ability to do both
     pattern matching and numeric  computations,  and  to  conve-
     niently process fields within lines.  These programs are for
     more advanced users, and they are not  limited  to  document
     preparation.   Put  them  on  your  list  of things to learn
     about.

       Most of these programs are either independently documented
     (like  eeqqnn  and  ttbbll),  or  are sufficiently simple that the
     description in the  _U_N_I_X  _P_r_o_g_r_a_m_m_e_r_'_s  _M_a_n_u_a_l  is  adequate
     explanation.

     HHiinnttss ffoorr PPrreeppaarriinngg DDooccuummeennttss

       Most  documents  go  through several versions (always more
     than  you  expected)  before  they  are  finally   finished.
     Accordingly, you should do whatever possible to make the job
     of changing them easy.

       First, when you do the  purely  mechanical  operations  of
     typing, type so that subsequent editing will be easy.  Start
     each sentence on a new line.  Make lines  short,  and  break
     lines  at  natural  places,  such  as after commas and semi-
     colons, rather than randomly.  Since most people change doc-
     uments  by  rewriting phrases and adding, deleting and rear-
     ranging sentences, these precautions  simplify  any  editing
     you have to do later.

       Keep  the  individual  files  of a document down to modest
     size, perhaps ten to fifteen  thousand  characters.   Larger









     USD:1-26                                  UNIX For Beginners


     files  edit  more  slowly,  and of course if you make a dumb
     mistake it's better to have clobbered a small  file  than  a
     big one.  Split into files at natural boundaries in the doc-
     ument, for the same reasons that you start each sentence  on
     a new line.

       The  second  aspect of making change easy is to not commit
     yourself to formatting details too early.  One of the advan-
     tages  of  formatting  packages like --mmss is that they permit
     you to delay decisions to the last possible moment.  Indeed,
     until  a document is printed, it is not even decided whether
     it will be typeset or put on a line printer.

       As a rule of thumb, for all but the most trivial jobs, you
     should  type  a  document in terms of a set of requests like
     ..PPPP, and then define them appropriately, either by using one
     of  the canned packages (the better way) or by defining your
     own nnrrooffff and ttrrooffff commands.  As long as you  have  entered
     the text in some systematic way, it can always be cleaned up
     and re-formatted by a judicious combination of editing  com-
     mands and request definitions.

     IIVV..  PPRROOGGRRAAMMMMIINNGG

       There will be no attempt made to teach any of the program-
     ming languages available but a few words of  advice  are  in
     order.   One of the reasons why the UNIX system is a produc-
     tive programming environment is that there is already a rich
     set of tools available, and facilities like pipes, I/O redi-
     rection, and the capabilities of the  shell  often  make  it
     possible  to  do  a  job  by  pasting together programs that
     already exist instead of writing from scratch.

     TThhee SShheellll

       The pipe mechanism lets you  fabricate  quite  complicated
     operations out of spare parts that already exist.  For exam-
     ple, the first draft of the ssppeellll program was (roughly)

         ccaatt ......     _c_o_l_l_e_c_t _t_h_e _f_i_l_e_s
         || ttrr ......    _p_u_t _e_a_c_h _w_o_r_d _o_n _a _n_e_w _l_i_n_e
         || ttrr ......    _d_e_l_e_t_e _p_u_n_c_t_u_a_t_i_o_n_, _e_t_c_.
         || ssoorrtt      _i_n_t_o _d_i_c_t_i_o_n_a_r_y _o_r_d_e_r
         || uunniiqq      _d_i_s_c_a_r_d _d_u_p_l_i_c_a_t_e_s
         || ccoommmm      _p_r_i_n_t _w_o_r_d_s _i_n _t_e_x_t
                 _b_u_t _n_o_t _i_n _d_i_c_t_i_o_n_a_r_y

     More pieces have been added subsequently, but  this  goes  a
     long way for such a small effort.

       The  editor  can  be made to do things that would normally
     require special programs on other systems.  For example,  to
     list  the  first  and  last lines of each of a set of files,
     such as a book, you could laboriously type









     UNIX For Beginners                                  USD:1-27


         eedd
         ee cchhaapp11..11
         11pp
         $$pp
         ee cchhaapp11..22
         11pp
         $$pp
         etc.

     But you can do the job much more easily.  One way is to type

         llss cchhaapp** >>tteemmpp

     to  get  the  list of filenames into a file.  Then edit this
     file to make the necessary series of editing commands (using
     the  global  commands of eedd), and write it into ssccrriipptt.  Now
     the command

         eedd <<ssccrriipptt

     will produce the same output as the laborious  hand  typing.
     Alternately (and more easily), you can use the fact that the
     shell will perform loops, repeating a set of  commands  over
     and over again for a set of arguments:

         ffoorr ii iinn cchhaapp**
         ddoo
              eedd $$ii <<ssccrriipptt
         ddoonnee

     This  sets  the  shell variable ii to each file name in turn,
     then does the command.  You can type  this  command  at  the
     terminal, or put it in a file for later execution.

     PPrrooggrraammmmiinngg tthhee SShheellll

       An  option often overlooked by newcomers is that the shell
     is itself a programming language,  with  variables,  control
     flow _(iiff--eellssee, wwhhiillee, ffoorr, ccaassee), subroutines, and interrupt
     handling.  Since there are many building-block programs, you
     can  sometimes avoid writing a new program merely by piecing
     together some of the  building  blocks  with  shell  command
     files.

       We  will  not go into any details here; examples and rules
     can be found in _A_n _I_n_t_r_o_d_u_c_t_i_o_n _t_o _t_h_e _U_N_I_X _S_h_e_l_l, by S.  R.
     Bourne.

     PPrrooggrraammmmiinngg iinn CC

       If you are undertaking anything substantial, C is the only
     reasonable choice of programming language: everything in the
     UNIX system is tuned to it.  The system itself is written in
     C, as are most of the programs that run on it.  It  is  also









     USD:1-28                                  UNIX For Beginners


     an  easy  language to use once you get started.  C is intro-
     duced and fully described in _T_h_e _C _P_r_o_g_r_a_m_m_i_n_g  _L_a_n_g_u_a_g_e  by
     B.  W.  Kernighan  and  D. M. Ritchie (Prentice-Hall, 1978).
     Several sections of the manual describe  the  system  inter-
     faces,  that is, how you do I/O and similar functions.  Read
     _U_N_I_X _P_r_o_g_r_a_m_m_i_n_g for more complicated things.

       Most input and output in C is best handled with the  stan-
     dard I/O library, which provides a set of I/O functions that
     exist in compatible form on most machines that have  C  com-
     pilers.   In  general,  it's  wisest  to  confine the system
     interactions in a program to the facilities provided by this
     library.

       C  programs that don't depend too much on special features
     of UNIX (such as pipes) can be moved to other computers that
     have C compilers.  The list of such machines grows daily; in
     addition to the original PDP-11, it  currently  includes  at
     least  Honeywell  6000,  IBM  370 and PC families, Interdata
     8/32, Data General Nova and Eclipse,  HP  2100,  Harris  /7,
     Motorola 68000 family (including machines like Sun Microsys-
     tems and Apple Macintosh), VAX 11 family, SEL 86, and  Zilog
     Z80.   Calls to the standard I/O library will work on all of
     these machines.

       There are a number of supporting programs that go with  C.
     lliinntt  checks  C programs for potential portability problems,
     and detects errors such as  mismatched  argument  types  and
     uninitialized variables.

       For larger programs (anything whose source is on more than
     one file) mmaakkee allows you to specify the dependencies  among
     the  source  files and the processing steps needed to make a
     new version; it then checks the times that the  pieces  were
     last  changed  and does the minimal amount of recompiling to
     create a consistent updated version.

       The debugger ggddbb is useful for digging  through  the  dead
     bodies  of  C  programs,  but is rather hard to learn to use
     effectively.  The most effective  debugging  tool  is  still
     careful  thought,  coupled  with  judiciously  placed  print
     statements.

       The C compiler provides a limited instrumentation service,
     so you can find out where programs spend their time and what
     parts are worth optimizing.  Compile the routines  with  the
     --ppgg option; after the test run, use ggpprrooff to print an execu-
     tion profile.  The command ttiimmee will give you the gross run-
     time  statistics  of a program, but they are not super accu-
     rate or reproducible.













     UNIX For Beginners                                  USD:1-29


     OOtthheerr LLaanngguuaaggeess

       If you _h_a_v_e to use Fortran, there are  two  possibilities.
     You  might  consider Ratfor, which gives you the decent con-
     trol structures and free-form input that characterize C, yet
     lets you write code that is still portable to other environ-
     ments.  Bear in mind that  UNIX  Fortran  tends  to  produce
     large  and  relatively  slow-running programs.  Furthermore,
     supporting software like ggddbb, pprrooff, etc., are all  virtually
     useless  with Fortran programs.  There may also be a Fortran
     77 compiler on your system.  If so, this is a viable  alter-
     native  to Ratfor, and has the non-trivial advantage that it
     is compatible with C and related programs.  (The Ratfor pro-
     cessor and C tools can be used with Fortran 77 too.)

       If  your  application requires you to translate a language
     into a set of actions or another language, you are in effect
     building  a  compiler, though probably a small one.  In that
     case, you should be using the yyaacccc compiler-compiler,  which
     helps  you develop a compiler quickly.  The lleexx lexical ana-
     lyzer generator does the same job for the simpler  languages
     that  can  be  expressed  as regular expressions.  It can be
     used by itself, or as a front end to recognize inputs for  a
     yyaacccc-based  program.  Both yyaacccc and lleexx require some sophis-
     tication to use, but the initial effort of learning them can
     be  repaid  many  times  over  in  programs that are easy to
     change later on.

       Most UNIX systems also  make  available  other  languages,
     such  as  Algol  68,  APL,  Basic, Lisp, Pascal, and Snobol.
     Whether these are useful depends largely on the local  envi-
     ronment:  if someone cares about the language and has worked
     on it, it may be in good shape.  If not, the odds are strong
     that it will be more trouble than it's worth.

     VV..  UUNNIIXX RREEAADDIINNGG LLIISSTT

     GGeenneerraall::

     K. L. Thompson and D. M. Ritchie, _T_h_e _U_N_I_X _P_r_o_g_r_a_m_m_e_r_'_s _M_a_n_-
     _u_a_l_, Bell Laboratories, 1978 (PS2:3) Lists commands,  system
     routines and interfaces, file formats, and some of the main-
     tenance procedures.  You can't live without  this,  although
     you will probably only need to read section 1.

     D.  M.  Ritchie  and K. L. Thompson, ``The UNIX Time-sharing
     System,''  CACM,  July  1974.  (PS2:1)  An  overview  of the
     -----------
      These documents (previously in Volume  2  of  the
     Bell  Labs  Unix  distribution) are provided among
     the "User  Supplementary"  Documents  for  4.3BSD,
     available from the Usenix Association.
       These  are  among the "Programmer Supplementary"
     Documents for 4.3BSD.  PS1 is  Volume  1,  PS2  is









     USD:1-30                                  UNIX For Beginners


     system, for people interested in operating  systems.   Worth
     reading  by anyone who programs.  Contains a remarkable num-
     ber of one-sentence observations on how to do things  right.

     The  Bell  System  Technical Journal (BSTJ) Special Issue on
     UNIX, July/August, 1978,  contains  many  papers  describing
     recent developments, and some retrospective material.

     The  2nd  International  Conference  on Software Engineering
     (October, 1976) contains several papers describing  the  use
     of the Programmer's Workbench (PWB) version of UNIX.

     DDooccuummeenntt PPrreeppaarraattiioonn::

     B.  W. Kernighan, ``A Tutorial Introduction to the UNIX Text
     Editor'' (USD:12) and ``Advanced Editing on UNIX,'' (USD:13)
     Bell  Laboratories,  1978.  Beginners need the introduction;
     the advanced material will help you get the most out of  the
     editor.

     M. E. Lesk, ``Typing Documents on UNIX,'' Bell Laboratories,
     1978. (USD:20) Describes the --mmss macro package,  which  iso-
     lates  the  novice from the vagaries of nnrrooffff and ttrrooffff, and
     takes care of most formatting situations.  If this  specific
     package  isn't  available  on your system, something similar
     probably is.  The most likely alternative  is  the  PWB/UNIX
     macro package --mmmm; see your local guru if you use PWB/UNIX.*

     B. W. Kernighan and L. L. Cherry, ``A System for Typesetting
     Mathematics,''  Bell  Laboratories  Computing  Science Tech.
     Rep. 17. (USD:26)

     M. E. Lesk, ``Tbl -- A Program to Format Tables,'' Bell Lab-
     oratories CSTR 49, 1976. (USD:28)

     J. F. Ossanna, Jr., ``NROFF/TROFF User's Manual,'' Bell Lab-
     oratories CSTR 54, 1976. (USD:24) ttrrooffff is the basic format-
     ter  used  by  --mmss,  eeqqnn  and  ttbbll.  The reference manual is
     indispensable if you are going to write or maintain these or
     similar programs.  But start with:

     B.  W.  Kernighan,  ``A TROFF Tutorial,'' Bell Laboratories,
     1976. (USD:25) An attempt  to  unravel  the  intricacies  of
     ttrrooffff.

     PPrrooggrraammmmiinngg::

     B.  W.  Kernighan  and D. M. Ritchie, _T_h_e _C _P_r_o_g_r_a_m_m_i_n_g _L_a_n_-
     _g_u_a_g_e_,   Prentice-Hall,   1978.    Contains    a    tutorial
     -----------
     Volume 2.
     *The  macro  package -me is additionally available
     on Berkeley Unix Systems.  -mm  is  typically  not
     available.









     UNIX For Beginners                                  USD:1-31


     introduction, complete discussions of all language features,
     and the reference manual.

     B. W. Kernighan and R. Pike, _T_h_e _U_n_i_x  _P_r_o_g_r_a_m_m_i_n_g  _E_n_v_i_r_o_n_-
     _m_e_n_t_, Prentice-Hall, 1984.  Contains many examples of C pro-
     grams which use the system interfaces, and  explanations  of
     ``why''.

     B.  W.  Kernighan  and  D. M. Ritchie, ``UNIX Programming,''
     Bell Laboratories, 1978. (PS2:3) Describes how to  interface
     with  the  system  from C programs: I/O calls, signals, pro-
     cesses.

     S. R. Bourne, ``An Introduction to the  UNIX  Shell,''  Bell
     Laboratories,  1978.  (USD:3)  An introduction and reference
     manual for the Version 7 shell.  Mandatory  reading  if  you
     intend  to  make  effective  use of the programming power of
     this shell.

     S. C. Johnson, ``Yacc --  Yet  Another  Compiler-Compiler,''
     Bell Laboratories CSTR 32, 1978. (PS1:15)

     M.  E.  Lesk,  ``Lex -- A Lexical Analyzer Generator,'' Bell
     Laboratories CSTR 39, 1975. (PS1:16)

     S. C. Johnson, ``Lint, a C Program Checker,'' Bell Laborato-
     ries CSTR 65, 1977. (PS1:9)

     S.  I. Feldman, ``MAKE -- A Program for Maintaining Computer
     Programs,'' Bell Laboratories CSTR 57, 1977. (PS1:12)

     J. F. Maranzano and S. R. Bourne, ``A Tutorial  Introduction
     to  ADB,''  Bell  Laboratories  CSTR  62,  1977. (PS1:10) An
     introduction to a powerful but complex debugging tool.

     S. I. Feldman and P. J. Weinberger, ``A Portable Fortran  77
     Compiler,''  Bell Laboratories, 1978. (PS1:2) A full Fortran
     77 for UNIX systems.






















