finishing first draft, deciding on artistic2.0 for liscence
authorEdgar Bering <ebering@csclub.uwaterloo.ca>
Fri, 15 Aug 2008 02:42:37 +0000 (22:42 -0400)
committerEdgar Bering <ebering@csclub.uwaterloo.ca>
Fri, 15 Aug 2008 02:42:37 +0000 (22:42 -0400)
holy-fuck-a-shell.pod

index 854730e..2f49f9c 100644 (file)
@@ -585,13 +585,124 @@ If you want environment variables to remain set in new sessions edit your
 F<.bash_profile> or F<.profile> file and add new lines with your export
 commands. For more on these files see the customizing your shell section.
 
+=head3 Scripting the shell
+
+Since the shell is really just an interactive programming language an obvious
+question is "does it have a non-interactive mode?". The answer is yes. This is
+called I<shell scripting> and is a useful way to automate repetitive tasks and
+add desired functionality. Since the interactive shell and the scripted shell
+are the same thing, features discussed here can be used at the prompt, though
+they may not be useful.
+
+Shell scripts consist of a series of shell commands on separate lines or
+separated by semicolons. To create one open an editor on a new file (call it
+whatever you like, by convention they have the C<.sh> extension) and enter
+the sequence of commands you wish to be able to run over and over again. Save
+the file and make sure you have permission to execute it. Then at the prompt
+type C<./your_file_name> to run it. 
+
+Scripts can also take arguments, these appear in variables C<$1> to C<$9>,
+(if you need more than nine place the numbers in braces). There are also some 
+useful special variables: C<$?> is the exit status of the last command run,
+an indicator of error conditions; C<$$> is the process id of the script, and
+C<$0> is the name of the script, which provide relevant information for error
+messages as well as the change of behavior based on script name or process id
+(the first one is sometimes used for startup/shutdown scripts, the second one
+is insane).
+
+
 =head3 Its a programming language? Wheres while and friends?
 
-=for commentary
+Yes, the shell is an interactive programming language, and yes there are loops
+and conditional expressions. If you've ever used an imperitive programming
+language (like Java or VB or Perl) these first few should be familiar. These
+are going to be quick commentaries, for more info you can read the shell man
+page.
 
-Now I have to write this fucking section. Subsections:
-Loops and conditionals
-Scripts and arguments for them
-Customizing the shell to make it your shell
+=over
+
+=item C<if>
+
+If works just like you'd expect, except there are also a myriad of useful file
+test options to query the properties of files and file descriptors.
+
+ if [ -e "filename" ]; then 
+     echo "filename exists";
+ fi
+
+ if [ "$3" = "start" ]; then
+     echo "starting";
+ elif [ "$3" = "stop" ]; then
+     echo "stopping";
+ else
+     echo "option 3 invalid";
+ fi
+
+=item C<while>,C<until>
+
+While loops while a condition is true, until loops until a condition is true. 
+These are the same conditions used in if.
+
+ while [ -e "lockfile" ]; do
+     echo "waiting for lock to be released";
+     sleep 5;
+ done;
+
+ X=0
+ until [ $X = 20 ]; do
+     echo "zomgwtf";
+     X=$((X+1)) # arithmatic expression, read the man page. You probably
+                # want to use a real programming language for heavy iteration
+ done;
+
+=item C<for x in>
+
+While bash has a c style for loop, don't use it. You probably want a real
+programming language at that point. The useful for loop iterates through a
+list for you, setting x (or whatever other variable name you use) to the values
+one at a time. You can use a plain list, a file glob, or any command in
+backticks (which evaluates the command and substitutes the value).
+
+ # Backup git repositories in /backup/repos
+ for d in `ls -d /backup/repos`; do
+     cd $d;
+     git pull;
+ done;
+
+=back
+
+=head3 Customizing your shell
+
+Through this document we've been talking about "the shell". The fact is there
+are many, many, shells all with the standard features discussed here (and some
+without) as well as a variety of extensions and unique features.
+
+The shell used as a reference when writing this guide and a common default is
+C<bash>, B<B>ourne B<A>gain B<Sh>ell, also popular are C<ksh> (B<K>orn 
+B<Sh>ell), C<csh> (B<C> B<Sh>ell), C<tcsh> (an enhancement of C<csh>), and
+C<zsh> (the B<Z> B<Sh>ell, an addition of new features to a C<ksh> and C<bash>
+featrues). Feel free to experiment, you can start a new shell by invoking it as
+a command or using C<chsh> and logging out and in again.
+
+To set shell options and environment variables you can edit the various F<rc>
+and F<profile> files associated with your shell, check the man page for details
+on which files to edit.
+
+In these files you can also start background jobs if you'd like, though it is
+often more useful to have automated tasks. Many systems have a C<cron> program
+installed which can be used to run programs even when you aren't around, to
+add these edit a file called a F<crontab> using the progrogram with the same
+name to do so. Check the associated man page for syntax in the file and what
+you can and cannot run in it.
+
+=head2 About the Authors (when they wrote this)
+
+This document is maintained and copyright The University of Waterloo Computer
+Science Club 2008 and is released under the terms of the Artistic Liscence
+version 2.0 available at L<http://www.perlfoundation.org/artistic_license_2_0>.
+
+=head3 Edgar Bering (ebering@csclub.uwaterloo.ca)
+
+A student heading into his second year Edgar served as club secretary W08 and
+plans on running for executive most of the rest of the time he's around.
 
-=cut