initial checkin
[kspaans/UnixTutorial] / holy-fuck-a-shell.pod
1 =head1 Welcome to Unix
2
3 Welcome to the unix environment. Here you have the familiar point
4 and click gui, but thats not why you're reading this, you're here for
5 the shell. So what is this mysterious shell you've been told about by
6 upper year students? It is a command line interface to your computer.
7 Where the gui is like pointing and grunting the shell is using language.
8 A beginner might not do much better than pointing and grunting, but with
9 practice one can control a computer with the skill of a poet.
10
11 =head2 A few useful keys before we begin
12
13 As you've probably guessed the shell is a command line interface that
14 you type into. Its essentially an interactive programming language,
15 like the interactions window in DrScheme, but designed to operate on
16 the system and work in a rather diverse environment. Its also designed
17 for convinence, and as you'll discover quite powerful. Before we get
18 started there are a few keystrokes you'll need to be aware of.
19
20 First, commands that you type in edit just like a line of text, you can
21 scroll back and forth, use home and end keys, delete and backspace, etc.
22 However its only one line, so the obvious question is what do up and down
23 do? Well, they scroll back and foreward in your I<command history>, a log
24 of everything you've done previous. Say you want to re-do something, just
25 press up until the command you want re-appears. You can make small changes
26 if you like, and if you go to far or want to get back to a blank line just
27 scroll back down with the down arrow.
28
29 If you want to view your command history use the command C<history>. To run
30 an old command type C<!number> where number is the number next to the 
31 command in history.
32
33 Most shells also provide tab completion of commands and file names, to
34 use this just press tab after typing part of a file path or command, as long
35 as its unique. If its not the shell will show you all the possibilities.
36
37 =head2 Getting to the Shell
38
39 There are several ways to access the shell remotely and locally. Remote
40 shells can be obtained by connecting to a server with a program called
41 Secure Shell or ssh. If you're local to a linux or unix system just start
42 any of the many terminal programs.
43
44 =head3 From Windows
45
46 There are several utilities that can provide access to ssh from Windows, 
47 the main one used by people at Waterloo is PuTTY 
48 L<http://www.chiark.greenend.org.uk/~sgtatham/putty/>.
49
50 =for commentary
51
52 ebering doesn't like writing about windows, someone else can do this shit
53
54 =cut
55
56 =head3 From Mac OSX
57
58 Mac OS X comes with X11 (more on X11 later) installed, and with X11 comes
59 a unix shell with most of the features discussed here, including an 
60 ssh client. To access the student environment open X11 and open a terminal and
61 use ssh just like in the linux section. You can also use many of the non
62 student environment commands on your mac.
63
64 =head3 From Linux
65
66 To connect to the student environment from linux just start a terminal program
67 and use ssh like on a mac, ssh will be documented in its own section. Also
68 most of the things in this guide are useable on your local terminal as well.
69
70 =head3 ssh(1) 
71
72 The ssh utility is invoked from your local command line like this
73
74  $ssh username@hostname
75
76 At this point you will be prompted for your password. For the student.cs
77 environment hostname is student.cs.uwaterloo.ca or just student.cs from
78 inside the network. Your user name is your quest id.
79
80 =head4 ssh keys (optional)
81
82 ssh can be configured to log in automatically without prompting you for your
83 password using cryptographic keys to authenticate. To set this up do the 
84 following:
85
86  $ssh-keygen -t dsa
87  Generating public/private dsa key pair.
88  Enter file in which to save the key (~/.ssh/id_dsa): 
89  Enter passphrase (empty for no passphrase): 
90  Enter same passphrase again: 
91  Your identification has been saved in ~/.ssh/id_dsa.
92  Your public key has been saved in ~/.ssh/id_dsa.pub.
93  The key fingerprint is:
94  <some numbers> user@host
95  $ssh-keygen -t rsa
96  Generating public/private rsa key pair.
97  Enter file in which to save the key (~/.ssh/id_rsa): 
98  Enter passphrase (empty for no passphrase): 
99  Enter same passphrase again: 
100  Your identification has been saved in ~/.ssh/id_rsa.
101  Your public key has been saved in ~/.ssh/id_rsa.pub.
102  The key fingerprint is:
103  <some numbers> user@host
104  $scp ~/id*.pub user@host:~/ 
105  user@host's password: 
106  id_rsa.pub
107  id_dsa.pub
108  $ssh user@host
109  user@host's password:
110  user@host$cat ~/id_rsa.pub >> ~/.ssh/authorized_keys
111  user@host$cat ~/id_dsa.pub >> ~/.ssh/authorized_keys
112
113 This is optional and more detail can be found in the man page. More
114 on those next...
115
116 =head2 Getting Help
117
118 Now that you can log in easily (or at least login if you skipped the section on 
119 keys) you're probably wondering what you can do, we'll get to that, but first 
120 a way to get help beyond this guide. For most commands (which are just 
121 programs) the authors often include manual or man pages (the good ones anyway) 
122 documenting how to use the program. To access this information use the C<man> 
123 command like this:
124
125  $man <command name>
126
127 There are also manual entries on various system calls and program libraries, 
128 configuration files, and system daemons. These are in different numbered 
129 sections, type C<man man> for more information.
130
131 =head2 Thats all well and good, what can I do?
132
133 Like we said earlier, the shell can be used to command a computer. So anything 
134 you could do in graphical programs you can do on the shell and more. Many shell 
135 tools don't translate well to pointing and clicking, just like its hard to read 
136 a poem to a caveman. Commands don't function in a vaccum though, they take 
137 input a variety of ways. The first is standard input, normally attached to your 
138 keyboard (but it can be moved around), the second is command line arguments and 
139 flags. Arguments are just placed after the command, and the man page can 
140 explain which flags are avaiable and how to use them. Two common ones are 
141 C<--help> and C<--verbose> which have obvious functions. The third input method 
142 is reading from various files, some specified on the command line some searched 
143 for by default.
144
145 We'll start with some basic file tools and command and control abilities.
146
147 =head2 The file system and what to do about it
148
149 Programs are just files on disk and manipulate data which is also on the disk, 
150 so it obviously follows that the most important programs are the ones for 
151 working with files on the disk. This section will go over the filesystem and 
152 these important programs.
153
154 =head3 The filesystem is organized into directories
155
156 The file system in the unix environment starts with C</> or the root, different 
157 drives are all attached as directories under the root. For now don't worry 
158 about drives and lets chat about directories. In unix everything as a running 
159 or "working" directory, including your shell prompt. To see what your current 
160 directory is use the B<p>rint B<w>orking B<d>irectory command C<pwd> at the 
161 prompt. This will give you the I<absolute path> to your working directory. Any 
162 I<relative paths> you specify will be relative to this location. To go 
163 somewhere else use the B<c>hange B<d>irectory command C<cd> followed by the 
164 path you wish to change to. With no arguments it takes you to your home 
165 directory. The path specified can be relative or absolute.
166
167 =over
168
169 =item I<absolute paths>
170
171 Absolute paths are specified starting from the system root and look like 
172 C</this/path/is/absolute>. Absolute paths are important when working with 
173 other people or when going somewhere completely different on the filesystem, 
174 really anywhere precision is needed.
175
176 =item I<relative path>
177
178 Relative paths are specified relative to your (or a program's) current working 
179 directory and are just like they sound. They start without a C</> (remember 
180 that C</> specifies the system root) and otherwise work exactly the same. There 
181 are a few special directories that can be used in relative paths, the first is 
182 C<.> which stands for the current directory. The second is C<..> which is the 
183 directory above the current directory. Here are some examples:
184
185  $pwd
186  /home/user
187  $cd /etc/games
188  $pwd
189  /etc/games
190  $cd ../config
191  $pwd
192  /etc/config
193  $cd network/
194  $pwd
195  /etc/config/netowrk
196  $cd ..
197  $pwd
198  /etc/config
199  $cd ./network
200  $pwd
201  /etc/config/network
202
203 =back
204
205 Which directories exist isn't set in stone, you B<r>eB<m>ove B<dir>ectories 
206 with the C<rmdir> command, and B<m>aB<k>e them with C<mkdir>. C<rmdir> takes an 
207 existing path and removes the directory (you can't remove one with anything in 
208 it). C<mkdir> takes a valid path and makes a directory.
209
210 Paths may seem confusing, but they are a rather straightforeward way of 
211 specifying both directory locations and filenames. How do you specify a filename 
212 you ask? Just like a directory. If you're in C</path/to> and want a file called 
213 C<afile> all you need to do is write C<afile>. If you're somewhere else you can 
214 get to it absolutely C</path/to/afile> or use any of the other things mentioned 
215 in path specification to name it.
216
217 =head3 Files, they're people too
218
219 Speaking of files, you probably want to see them. The first step to seeing 
220 files is seeing where they are, the command for this is the B<l>iB<s>t command 
221 C<ls>, which shows the files in your current directory, as well as directories. 
222 C<ls> might be set up for colour coded output, it might not be, the man page 
223 can explain how to set that up. C<ls> also has a B<l>ong format, viewed using 
224 C<ls -l>, which provides a lot of useful information about the files listed. 
225 Again the man pages can give you more information.
226
227 Now that you know the names of your files you might want to actually get at 
228 their contents. The simplest way is C<cat> which takes a file name and spits 
229 out the contents to the screen. This is nice for short files, but you can't
230 scroll back. Two commands that give you a little more control are C<head> 
231 and C<tail> which display the start and end of files. C<tail> is particularly 
232 useful in watching log files using the B<f>ollow flag C<-f>, which watches the 
233 file for updates and displays the new entries as they appear. A third way to 
234 view files, which is perahps the most convinient, is something known as a 
235 I<pager> program. There are many pagers, this author's favorite is C<less>, 
236 which takes a filename argument and lets you scroll up and down as well as 
237 search. To search in less type C</> followed by what you're looking for. To 
238 find more matches press C<n> to go foreward and C<N> to go back. In less 
239 C</> actually takes a pattern, to learn about those check the man pages or 
240 the text manipulation and editing tutorial.
241
242 You might be asking how to create files now. Lots of programs create files 
243 as output, there are logs, data files, random crap, so what you probably 
244 want is a way to edit text. Thats easy, use C<pico> or C<nano> for simple 
245 command like editors. However these editors are rather simple and lack power, 
246 for a full introduction to the vast text editing capabilities refer to the 
247 text manipulation and editing tutorial.
248
249 Files can also be B<m>oB<v>ed around, B<c>oB<p>ied and B<r>eB<m>oved. The 
250 commands C<mv> and C<cp> do moving and copying, taking the original filename 
251 as the first argument and the destination as the second. If the second is a 
252 directory then the filename is kept the same and the file is placed in that 
253 directory, if a name is specified then the file will be moved or copied to 
254 the new name. C<rm> removes files given to it as arguments, as many as you 
255 like.
256
257 =head3 Your home folder (theres no place like it)
258
259 When specifying paths there is another special character C<~>, which is short 
260 for your home directory. Your home directory is exactly what it sounds like, 
261 your place on the file system to keep your crap. If you use C<cd> without an 
262 argument it will take you to your home dir. Whats in your home dir? Well, any 
263 files you want to keep. Is that it? No, also kept in your homedir are so-called 
264 "dot files" since their filenames start with a C<.> so they don't normally show 
265 up in C<ls>, to view them use the B<a>ll option for C<ls>, C<-a>. These dot 
266 files store configuration information for various programs, as well as B<r>un 
267 B<c>ommands files with commands to be run on startup of various applications. 
268 You can edit these to customise your various preferences for applications, but 
269 consult the man pages first to make sure you enter sane values.
270
271 Also in your home folder is your web folder, usually called C<www> or 
272 C<public_html>, depending on the configuration of the system. To set up a 
273 personal web page all you have to do is place your html (or text or whatever) 
274 files in there and make sure they are world readable. Word Readable? What? 
275 Its a permission, subject of the next section.
276
277 =head3 File permissions, or how to keep people out of your crap.
278
279 In unix every file has an owner, these owners are the users, and an owning
280 group, which is some group that the owner is a member of. You can control who 
281 can read, write, and execute your files based on these categories: user, group, 
282 everyone. Collectively these permissions are known as the file's 
283 (or directory's) I<mode>. To view a file's mode use a long listing with 
284 C<ls -l> and look at the I<mode string>. Mode strings are 10 characters, the 
285 first character specifies if the file is a file with a C<-> or something 
286 special, like a directory C<d> or a character device like a terminal with C<c>. 
287 Following the file type are nine characters, they represent the 3 permissions 
288 for the 3 groups, the first three characters stand for B<r>ead, B<w>rite, and 
289 eB<x>ecute for the user, and repeat for the group and everyone. For example 
290 C<-rw-r-r> provides the owner read-write access and everyone else.
291
292 To B<ch>ange B<mod>es, B<own>er, or B<gr>ouB<p> of a file use the commands 
293 C<chmod>,C<chown>, and C<chgrp> (actually C<chown> can also change groups). 
294 We won't go into C<chown> since only the superuser (a user with more permissions 
295 than normal, for administrative purposes) can use it. To use C<chmod> to change 
296 modes first pass in a mode alteration followed by files you own. A mode 
297 alteration has the form C<w[+,-]p> where C<w> stands for who the mode change is 
298 for, B<u>ser owning the file, B<g>roup, B<o>thers, or B<a>ll groups, followed a 
299 C<+> to grant the permission or a C<-> to revoke it, and C<p> stands for the 
300 ability to change, B<r>ead, B<w>rite, or eB<x>ecute.
301
302 You may be wondering about the execute permission. This grants people the 
303 ability to run your files, if you have binaries or executable scripts to 
304 permission. Depending on the programs you might want to be careful with this. 
305 On directories, where executing makes little sense it is the permission to 
306 traverse or change into the directory.
307
308 =head3 Talking about more than one file at a time
309
310 Often its useful to talk about a group of files (like to tell C<rm> about them, 
311 or backup your website with C<cp>). The shell has a way to do this. Using a 
312 wildcard C<*> you can name all files that match a patern, for example C<*.mp3> 
313 would be all mp3s in a folder. Multiple wildcards can be used in a single name, 
314 but note they don't match C</>, that is they don't traverse directories. There is
315 also the C<?> wildcard which matches any one character.
316
317 Specific characters can also be matched using C<[..]> with the characters or a
318 range of characters (say C<[a-z]> to match all lowercase) to match. Note that
319 this only matches once, so for repeats you must repeat your bracket expression.
320
321 For more information on this matching/expansion, which is called 
322 I<file globbing> consult C<man 7 glob> (there will probably also be an entry
323 in section 3 of the system manual for glob. This is for a C library function
324 that actually works out the list of files from the glob expression).
325
326 If you want to specify a C<*>, C<?> or C<[> you must escape it with a C<\>,
327 and to get a literal C<\> you must escape that as well, using C<\\> in its
328 place. There are a few other characters that must be escaped: a space,
329 C<">, C<'>, and C<;> for reasons that may or may not be obvious now, but 
330 will be after the next section.
331
332 =for commentary
333
334 A section on searching for files (even if its just a blurb) would be
335 nice...
336
337 =cut
338
339 =head2 What the shell really gives you.. power.
340
341 Up until now we've only really covered features that you can find in your
342 familiar point and click environment. Going back to the language analogy
343 think of that as boring vocabulary work and whats about to be covered
344 grammar, rhyme, and meter work. This section discusses the features of the
345 shell that separate it from the gui, the programmable loops, variables that
346 affect program execution, and io redirection. This section describes the
347 machinary the shell provides to put words together to form ideas.
348
349 =for commentary
350
351 Now I have to write this fucking section. Subsections:
352 Jobs and controlling them
353 Variables, Environment Variables
354 IO Redirection and the Pipe
355 Loops and conditionals
356 Scripts and arguments for them
357
358 =cut