From da57d31bc609c26ac1a88559617c457bef98a1eb Mon Sep 17 00:00:00 2001 From: Greg Wilson Date: Fri, 7 Feb 2014 12:05:02 -0500 Subject: [PATCH] Preparing material for Version 5 novice release --- 00-intro.md | 15 +-- 01-filedir.md | 78 ++++++------- 02-create.md | 33 +++--- 03-pipefilter.md | 81 +++++++------ 04-loop.md | 36 +++--- 05-script.md | 74 ++++++++---- 06-find.md | 58 ++++++---- README.txt | 7 ++ guide.md | 120 -------------------- img/home-directories.odg | Bin 9870 -> 9875 bytes img/home-directories.svg | 240 +++++++++++++++++++-------------------- img/nano-screenshot.png | Bin 24493 -> 42241 bytes index.md | 17 +-- reference.md | 53 --------- 14 files changed, 346 insertions(+), 466 deletions(-) create mode 100644 README.txt delete mode 100644 guide.md delete mode 100644 reference.md diff --git a/00-intro.md b/00-intro.md index 0c3907d78..575135abf 100644 --- a/00-intro.md +++ b/00-intro.md @@ -5,12 +5,12 @@ title: Introducing the Shell level: novice ---
-## Objectives + +#### Objectives * Explain how the shell relates to the keyboard, the screen, the operating system, and users' programs. * Explain when and why command-line interfaces should be used instead of graphical interfaces. -
-## Lesson + Nelle Nemo, a marine biologist, has just returned from a six-month survey of the @@ -55,8 +55,7 @@ As a bonus, once she has put a processing pipeline together, she will be able to use it again whenever she collects more data. -What and Why ------------- +#### What and Why At a high level, computers do four things: @@ -72,7 +71,7 @@ most of us use windows, icons, mice, and pointers. These technologies didn't become widespread until the 1980s, but their roots go back to Doug Engelbart's work in the 1960s, which you can see in what has been called -"[The Mother of All Demos](http://video.google.com/videoplay?docid=-8734787622017763097#)". +"[The Mother of All Demos](http://www.youtube.com/watch?v=a11JDLBXtPQ)". Going back even further, the only way to interact with early computers was to rewire them. @@ -127,11 +126,13 @@ As clusters and cloud computing become more popular for scientific data crunchin being able to drive them is becoming a necessary skill.
-## Key Points + +#### Key Points * A shell is a program whose primary purpose is to read commands and run other programs. * The shell's main advantages are its high action-to-keystroke ratio, its support for automating repetitive tasks, and that it can be used to access networked machines. * The shell's main disadvantages are its primarily textual nature and how cryptic its commands and operation can be. +
diff --git a/01-filedir.md b/01-filedir.md index 8c8b98fd6..7655ab3bd 100644 --- a/01-filedir.md +++ b/01-filedir.md @@ -5,16 +5,16 @@ title: Files and Directories level: novice ---
-## Objectives + +#### Objectives * Explain the similarities and differences between a file and a directory. * Translate an absolute path into a relative path and vice versa. * Construct absolute and relative paths that identify specific files and directories. * Explain the steps in the shell's read-run-print cycle. * Identify the actual command, flags, and filenames in a command-line call. * Demonstrate the use of tab completion, and explain its advantages. -
-## Lesson + The part of the operating system responsible for managing files and directories is called the [file system](../../gloss.html#filesystem). @@ -25,21 +25,16 @@ which hold files or other directories. Several commands are frequently used to create, inspect, rename, and delete files and directories. To start exploring them, -let's log in to the computer by typing our user ID and password. -Most systems will print stars to obscure the password, -or nothing at all, -in case some evildoer is shoulder surfing behind us: +let's open a shell window: ~~~ -login: vlad -password: ******** $ ~~~ -Once we have logged in we'll see a [prompt](../../gloss.html#prompt), -which is how the shell tells us that it's waiting for input. -This is usually just a dollar sign, -but which may show extra information such as our user ID or the current time. +The dollar sign is a [prompt](../../gloss.html#prompt), +which shows us that the shell is waiting for input; +your shell may show something more elaborate. + Type the command `whoami`, then press the Enter key (sometimes marked Return) to send the command to the shell. The command's output is the ID of the current user, @@ -54,8 +49,8 @@ vlad More specifically, when we type `whoami` the shell: 1. finds a program called `whoami`, -2. runs it, -3. waits for it to produce some output (which the shell displays), and +2. runs that program, +3. displays that program's output, then 4. displays a new prompt to tell us that it's ready for more commands. Next, @@ -76,7 +71,7 @@ $ pwd /users/vlad ~~~ -> ### Alphabet Soup +> #### Alphabet Soup > > If the command to find out who we are is `whoami`, the command to find > out where we are ought to be called `whereami`, so why is it `pwd` @@ -159,7 +154,7 @@ without it, the shell thinks we're trying to run a command called `ls-F`, which doesn't exist. -> ### What's In A Name? +> #### What's In A Name? > > You may have noticed that all of Vlad's files' names are "something dot > something". This is just a convention: we can call a file `mythesis` or @@ -170,14 +165,19 @@ which doesn't exist. > what type of data the file holds: `.txt` signals a plain text file, `.pdf` > indicates a PDF document, `.cfg` is a configuration file full of parameters > for some program or other, and so on. -> -> It's important to remember that this is just a convention. Files contain -> bytes: it's up to us and our programs to interpret those bytes according -> to the rules for PDF documents, images, and so on. For example, naming a -> PNG image of a whale as `whale.mp3` doesn't somehow magically turn it -> into a recording of whalesong. - -Now let's take a look at what's in Vlad's `data` directory by running the command `ls -F data`. +> +> This is just a convention, albeit an important one. Files contain +> bytes: it's up to us and our programs to interpret those bytes +> according to the rules for PDF documents, images, and so on. +> +> Naming a PNG image of a whale as `whale.mp3` doesn't somehow +> magically turn it into a recording of whalesong, though it *might* +> cause the operating system to try to open it with a music player +> when someone double-clicks it. + +Now let's take a look at what's in Vlad's `data` directory by running `ls -F data`, +i.e., +the command `ls` with the parameters `-F` and `data`. The second parameter—the one *without* a leading dash—tells `ls` that we want a listing of something other than our current working directory: @@ -266,7 +266,6 @@ but it's almost always simpler to use `cd ..` to go up one level: ~~~ $ pwd /users/vlad/data - $ cd .. ~~~ @@ -301,7 +300,7 @@ which means "the current working directory". It may seem redundant to have a name for it, but we'll see some uses for it soon. -> ### Orthogonality +> #### Orthogonality > > The special names `.` and `..` don't belong to `ls`; > they are interpreted the same way by every program. @@ -313,7 +312,7 @@ but we'll see some uses for it soon. > Orthogonal systems tend to be easier for people to learn > because there are fewer special cases and exceptions to keep track of. -## Nelle's Pipeline: Organizing Files +#### Nelle's Pipeline: Organizing Files Knowing just this much about files and directories, Nelle is ready to organize the files that the protein assay machine will create. @@ -379,30 +378,28 @@ This is called [tab completion](../../gloss.html#tab-completion), and we will see it in many other tools as we go on.
-## Key Points -* The file system is responsible for managing information on disk. + +#### Key Points +* The file system is responsible for managing information on the disk. * Information is stored in files, which are stored in directories (folders). * Directories can also store other directories, which forms a directory tree. * `/` on its own is the root directory of the whole filesystem. * A relative path specifies a location starting from the current location. * An absolute path specifies a location from the root of the filesystem. -* Directory names in a path are separated with '/' on Unix, but '\' on Windows. +* Directory names in a path are separated with '/' on Unix, but '\\' on Windows. * '..' means "the directory above the current one"; '.' on its own means "the current directory". * Most files' names are `something.extension`. The extension isn't required, and doesn't guarantee anything, but is normally used to indicate the type of data in the file. -* `cd path` changes the current working directory. -* `ls path` prints a listing of a specific file or directory; - `ls` on its own lists the current working directory. -* `pwd` prints the user's current working directory (current default location in the filesystem). -* `whoami` shows the user's current identity. * Most commands take options (flags) which begin with a '-'. +
-## Challenges + +#### Challenges Filesystem for Challenge Questions @@ -412,7 +409,9 @@ and we will see it in many other tools as we go on. 3. `2012-12-01/ 2013-01-08/ 2013-01-27/` 4. `original pnas_final pnas_sub` -2. If `pwd` displays `/users/backup`, what command will display +2. If `pwd` displays `/users/backup`, + and `-r` tells `ls` to display things in reverse order, + what command will display: ~~~ pnas-sub/ pnas-final/ original/ @@ -427,5 +426,6 @@ and we will see it in many other tools as we go on. 1. It has no effect. 2. It changes the working directory to `/`. 3. It changes the working directory to the user's home directory. - 4. It is an error. + 4. It produces an error message. +
diff --git a/02-create.md b/02-create.md index c52e8145d..8bd67bc84 100644 --- a/02-create.md +++ b/02-create.md @@ -5,14 +5,14 @@ title: Creating Things level: novice ---
-## Objectives + +#### Objectives * Create a directory hierarchy that matches a given diagram. * Create files in that hierarchy using an editor or by copying and renaming existing files. * Display the contents of a directory using the command line. * Delete specified files and/or directories. -
-## Lesson + We now know how to explore files and directories, but how do we create them in the first place? @@ -64,7 +64,7 @@ $ cd thesis $ nano draft.txt ~~~ -> ### Which Editor? +> #### Which Editor? > > When we say, "`nano` is a text editor," we really do mean "text": it can > only work with plain character data, not tables, images, or any other @@ -91,6 +91,7 @@ then use Control-O to write our data to disk: Once our file is saved, we can use Control-X to quit the editor and return to the shell. +(Unix documentation often uses the shorthand `^A` to mean "control-A".) `nano` doesn't leave any output on the screen after it exits, but `ls` now shows that we have created a file called `draft.txt`: @@ -137,7 +138,7 @@ which tells us that our file is gone: $ ls ~~~ -> ### Deleting Is Forever +> #### Deleting Is Forever > > Unix doesn't have a trash bin: when we delete files, they are unhooked > from the file system so that their storage space on disk can be @@ -193,7 +194,7 @@ The directory is now empty, so `rmdir` can delete it: $ rmdir thesis ~~~ -> ### With Great Power Comes Great Responsibility +> #### With Great Power Comes Great Responsibility > > Removing the files in a directory just so that we can remove the > directory quickly becomes tedious. Instead, we can use `rm` with the @@ -268,7 +269,7 @@ $ ls thesis ~~~ Further, -`ls` with a filename or directory name as an parameter only lists that file or directory. +`ls` with a filename or directory name as a parameter only lists that file or directory. We can use this to see that `quotes.txt` is still in our current directory: ~~~ @@ -301,7 +302,7 @@ ls: cannot access quotes.txt: No such file or directory thesis/quotations.txt ~~~ -> ### Another Useful Abbreviation +> #### Another Useful Abbreviation > > The shell interprets the character `~` (tilde) at the start of a path to > mean "the current user's home directory". For example, if Vlad's home @@ -310,20 +311,17 @@ thesis/quotations.txt > path: `here/there/~/elsewhere` is *not* `/home/vlad/elsewhere`.
-## Key Points + +#### Key Points * Unix documentation uses '^A' to mean "control-A". * The shell does not have a trash bin: once something is deleted, it's really gone. -* `mkdir path` creates a new directory. -* `cp old new` copies a file. -* `mv old new` moves (renames) a file or directory. -* `nano` is a very simple text editor—please use something else for real work. -* `touch path` creates an empty file if it doesn't already exist. -* `rm path` removes (deletes) a file. -* `rmdir path` removes (deletes) an empty directory. +* Nano is a very simple text editor—please use something else for real work. +
-## Challenges + +#### Challenges 1. What is the output of the closing `ls` command in the sequence shown below? @@ -377,4 +375,5 @@ thesis/quotations.txt The command `ls -t` lists things by time of last change, with most recently changed files or directories first. In what order does `ls -R -t` display things? +
diff --git a/03-pipefilter.md b/03-pipefilter.md index dffe149e7..069613655 100644 --- a/03-pipefilter.md +++ b/03-pipefilter.md @@ -5,15 +5,15 @@ title: Pipes and Filters level: novice ---
-## Objectives + +#### Objectives * Redirect a command's output to a file. * Process a file instead of keyboard input using redirection. * Construct command pipelines with two or more stages. * Explain what usually happens if a program or pipeline isn't given any input to process. * Explain Unix's "small pieces, loosely joined" philosophy. -
-## Lesson + Now that we know a few basic commands, we can finally look at the shell's most powerful feature: @@ -47,7 +47,7 @@ $ wc *.pdb 107 819 6081 total ~~~ -> ### Wildcards +> #### Wildcards > > `*` is a [wildcard](../../gloss.html#wildcard). It matches zero or more > characters, so `*.pdb` matches `ethane.pdb`, `propane.pdb`, and so on. @@ -65,11 +65,11 @@ $ wc *.pdb > with 'p') or `preferred.p` (there isn't at least one character after the > '.p'). > -> When the shell sees a wildcard, it expands it to create a list of -> matching filenames *before* running the command that was asked for. -> This means that commands like `wc` and `ls` never see the wildcard -> characters, just what those wildcards matched. This is another example -> of orthogonal design. +> When the shell sees a wildcard, it expands the wildcard to create a +> list of matching filenames *before* running the command that was +> asked for. This means that commands like `wc` and `ls` never see +> the wildcard characters, just what those wildcards matched. This is +> another example of orthogonal design. If we run `wc -l` instead of just `wc`, the output shows only the number of lines per file: @@ -150,7 +150,6 @@ we can run another command called `head` to get the first few lines in `sorted-l ~~~ $ sort lengths > sorted-lengths - $ head -1 sorted-lengths 9 methane.pdb ~~~ @@ -204,8 +203,7 @@ most Unix programmers call it "stdin". Every process also has a default output channel called [standard output](../../gloss.html#standard-output) (or "stdout"). -The shell is just another program, -and runs in a process like any other. +The shell is actually just another program. Under normal circumstances, whatever we type on the keyboard is sent to the shell on its standard input, and whatever it produces on standard output is displayed on our screen. @@ -239,7 +237,8 @@ Unix programmers focus on creating lots of simple tools that each do one job wel and that work well with each other. This programming model is called [pipes and filters](../../gloss.html#pipe-and-filter). We've already seen pipes; -a [filter](../../gloss.html#filter) is a program that transforms a stream of input into a stream of output. +a [filter](../../gloss.html#filter) is a program like `wc` or `sort` +that transforms a stream of input into a stream of output. Almost all of the standard Unix tools can work this way: unless told to do otherwise, they read from standard input, @@ -252,7 +251,7 @@ can be combined with every other program that behaves this way as well. You can *and should* write your programs this way so that you and other people can put those programs into pipes to multiply their power. -> ### Redirecting Input +> #### Redirecting Input > > As well as using `>` to redirect a program's output, we can use `<` to > redirect its input, i.e., to read from a file instead of from standard @@ -263,7 +262,7 @@ so that you and other people can put those programs into pipes to multiply their > have told the shell to send the contents of `ammonia.pdb` to `wc`'s > standard input. -### Nelle's Pipeline: Checking Files +#### Nelle's Pipeline: Checking Files Nelle has run her samples through the assay machines and created 1520 files in the `north-pacific-gyre/2012-07-03` directory described earlier. @@ -339,63 +338,58 @@ the expression `[AB]` matches either an 'A' or a 'B', so this matches all the valid data files she has.
-## Key Points + +#### Key Points * `command > file` redirects a command's output to a file. * `first | second` is a pipeline: the output of the first command is used as the input to the second. * The best way to use the shell is to use pipes to combine simple single-purpose programs (filters). -* `cat` displays the contents of its inputs. -* `head` displays the first few lines of its input. -* `sort` sorts its inputs. -* `tail` displays the last few lines of its input. -* `wc` counts lines, words, and characters in its inputs. +
-## Challenges -1. If we run `sort` on each of the files shown on the left in the table - below, *without* the `-n` flag, the output is as shown on the right. - Explain why we get different answers for the two files. +#### Challenges + +1. If we run `sort` on the file shown on the left, we get the output shown on the right: - - + +6 +
-1
+    
1
 10
 2
 19
 22
-6
-    
-1
+6
1
 10
 19
 2
 22
-6
-    
+ + If we run `sort -n` on the same input, we get different output: + + - - + +22
- 1
+    
 1
 10
  2
 19
 22
- 6
-    
- 1
+ 6
 1
  2
  6
 10
 19
-22
-    
+ Explain why `-n` has this effect. + 2. What is the difference between: ~~~ @@ -493,6 +487,7 @@ so this matches all the valid data files she has. ~~~ What other command(s) could be added to this in a pipeline to find - out what animals have been seen (without any duplicates in the - animals' names)? + out what animals the file contains (without any duplicates in their + names)? +
diff --git a/04-loop.md b/04-loop.md index 51c8ff058..42c4cc495 100644 --- a/04-loop.md +++ b/04-loop.md @@ -5,16 +5,16 @@ title: Loops level: novice ---
-## Objectives + +#### Objectives * Write a loop that applies one or more commands separately to each file in a set of files. * Trace the values taken on by a loop variable during execution of the loop. * Explain the difference between a variable's name and its value. * Explain why spaces and some punctuation characters shouldn't be used in files' names. * Demonstrate how to see what commands have recently been executed. * Re-run recently executed commands without retyping them. -
-## Lesson + Wildcards and tab completion are two ways to reduce typing (and typing mistakes). Another is to tell the shell to do something over and over again. @@ -68,7 +68,7 @@ Finally, the command that's actually being run is our old friend `head`, so this loop prints out the first three lines of each data file in turn. -> ### Follow the Prompt +> #### Follow the Prompt > > The shell prompt changes from `$` to `>` and back again as we were > typing in our loop. The second prompt, `>`, is different to remind @@ -98,8 +98,8 @@ done it would work exactly the same way. *Don't do this.* Programs are only useful if people can understand them, -so using meaningless names (like `x`) or misleading names (like `temperature`) -increases the likelihood of the program being wrong. +so meaningless names (like `x`) or misleading names (like `temperature`) +increase the odds that the program won't do what its readers think it does. Here's a slightly more complicated loop: @@ -145,7 +145,7 @@ when `$filename` expanded to `basilisk.dat`, the shell would try to run `basilis Finally, the `head` and `tail` combination selects lines 81-100 from whatever file is being processed. -> ### Spaces in Names +> #### Spaces in Names > > Filename expansion in loops is another reason you should not use spaces in filenames. > Suppose our data files are named: @@ -223,7 +223,7 @@ The second time, the command is: mv unicorn.dat original-unicorn.dat ~~~ -> ### Measure Twice, Run Once +> #### Measure Twice, Run Once > > A loop is a way to do many things at once—or to make many mistakes at > once if it does the wrong thing. One way to check what a loop *would* do @@ -250,7 +250,7 @@ mv unicorn.dat original-unicorn.dat > isn't foolproof, but it's a handy way to see what's going to happen when > you're still learning how loops work. -### Nelle's Pipeline: Processing Files +#### Nelle's Pipeline: Processing Files Nelle is now ready to process her data files. Since she's still learning how to use the shell, @@ -327,6 +327,12 @@ and edits it to read: $ for datafile in *[AB].txt; do echo $datafile; bash goostats $datafile stats-$datafile; done ~~~ +> #### Beginning and End +> +> We can move to the beginning of a line in the shell by typing `^A` +> (which means Control-A) +> and to the end using `^E`. + When she runs her program now, it produces one line of output every five seconds or so: @@ -348,7 +354,7 @@ to examine one of the output files. It looks good, so she decides to get some coffee and catch up on her reading. -> ### Those Who Know History Can Choose to Repeat It +> #### Those Who Know History Can Choose to Repeat It > > Another way to repeat previous work is to use the `history` command to > get a list of the last few hundred commands that have been executed, and @@ -368,18 +374,21 @@ so she decides to get some coffee and catch up on her reading. > `!458`.
-## Key Points -* Use a `for` loop to repeat commands once for every thing in a list. + +#### Key Points +* A `for` loop repeats commands once for every thing in a list. * Every `for` loop needs a variable to refer to the current "thing". * Use `$name` to expand a variable (i.e., get its value). * Do not use spaces, quotes, or wildcard characters such as '*' or '?' in filenames, as it complicates variable expansion. * Give files consistent names that are easy to match with wildcard patterns to make it easy to select them for looping. * Use the up-arrow key to scroll up through previous commands to edit and repeat them. * Use `history` to display recent commands, and `!number` to repeat a command by number. +
-## Challenges + +#### Challenges 1. Suppose that `ls` initially displays: @@ -443,4 +452,5 @@ so she decides to get some coffee and catch up on her reading. $how -limit 0.01 NENE01729B.txt done ~~~ +
diff --git a/05-script.md b/05-script.md index b0c1272ab..532306c1a 100644 --- a/05-script.md +++ b/05-script.md @@ -5,14 +5,14 @@ title: Shell Scripts level: novice ---
-## Objectives + +#### Objectives * Write a shell script that runs a command or series of commands for a fixed set of files. * Run a shell script from the command line. * Write a shell script that operates on a set of files defined by the user on the command line. * Create pipelines that include user-written shell scripts. -
-## Lesson + We are finally ready to see what makes the shell such a powerful programming environment. We are going to take the commands we repeat frequently and save them in files @@ -49,7 +49,7 @@ ATOM 18 C 1 -4.705 2.108 -0.396 1.00 0.00 Sure enough, our script's output is exactly what we would get if we ran that pipeline directly. -> ### Text vs. Whatever +> #### Text vs. Whatever > > We usually call programs like Microsoft Word or LibreOffice Writer "text > editors", but we need to be a bit more careful when it comes to @@ -112,8 +112,23 @@ ATOM 17 C 1 5.406 -0.117 -1.087 ATOM 18 C 1 -0.696 -2.628 -0.641 ~~~ +This works, +but it may take the next person who reads `middle.sh` a moment to figure out what it does. +We can improve our script by adding some [comments](../../gloss.html#comment) at the top: + +~~~ +$ cat middle.sh +# Select lines from the middle of a file. +# Usage: middle.sh filename start_line end_line +head $2 $1 | tail $3 +~~~ + +A comment starts with a `#` character and runs to the end of the line. +The computer ignores comments, +but they're invaluable for helping people understand and use scripts. + What if we want to process many files in a single pipeline? -For example, if we want to sort our PDB files by length, we would type: +For example, if we want to sort our `.pdb` files by length, we would type: ~~~ $ wc -l *.pdb | sort -n @@ -122,7 +137,7 @@ $ wc -l *.pdb | sort -n because `wc -l` lists the number of lines in the files and `sort -n` sorts things numerically. We could put this in a file, -but then it would only ever sort a list of PDB files in the current directory. +but then it would only ever sort a list of `.pdb` files in the current directory. If we want to be able to get a sorted list of other kinds of files, we need a way to get all those names into the script. We can't use `$1`, `$2`, and so on @@ -145,7 +160,7 @@ $ bash sorted.sh *.dat backup/*.dat 182 girmanis.dat ~~~ -> ### Why Isn't It Doing Anything? +> #### Why Isn't It Doing Anything? > > What happens if a script is supposed to process a bunch of files, but we > don't give it any filenames? For example, what if we type: @@ -211,10 +226,27 @@ The file `redo-figure-3.sh` now contains: After a moment's work in an editor to remove the serial numbers on the commands, we have a completely accurate record of how we created that figure. -> ### Unnumbering +> #### Unnumbering > > Nelle could also use `colrm` (short for "column removal") to remove the > serial numbers on her previous commands. +> Its parameters are the range of characters to strip from its input: +> +> ~~~ +> $ history | tail -5 +> 173 cd /tmp +> 174 ls +> 175 mkdir bakup +> 176 mv bakup backup +> 177 history | tail -5 +> $ history | tail -5 | colrm 1 7 +> cd /tmp +> ls +> mkdir bakup +> mv bakup backup +> history | tail -5 +> history | tail -5 | colrm 1 7 +> ~~~ In practice, most people develop shell scripts by running commands at the shell prompt a few times to make sure they're doing the right thing, @@ -223,7 +255,7 @@ This style of work allows people to recycle what they discover about their data and their workflow with just a few extra keystrokes. -### Nelle's Pipeline: Creating a Script +#### Nelle's Pipeline: Creating a Script An off-hand comment from her supervisor has made Nelle realize that she should have provided a couple of extra parameters to `goostats` when she processed her files. @@ -236,12 +268,12 @@ it will probably need to be done a third or fourth time as well. She runs the editor and writes the following: ~~~ - # Calculate reduced stats for data files at J = 100 c/bp. - for datafile in $* - do - echo $datafile - goostats -J 100 -r $datafile stats-$datafile - done +# Calculate reduced stats for data files at J = 100 c/bp. +for datafile in $* +do + echo $datafile + goostats -J 100 -r $datafile stats-$datafile +done ~~~ (The parameters `-J 100` and `-r` are the ones her supervisor said she should have used.) @@ -286,16 +318,19 @@ and use `*[AB].txt` if none were provided. Of course, this introduces another tradeoff between flexibility and complexity.
-## Key Points + +#### Key Points * Save commands in files (usually called shell scripts) for re-use. -* Use `bash filename` to run saved commands. +* `bash filename` runs the commands saved in a file. * `$*` refers to all of a shell script's command-line parameters. * `$1`, `$2`, etc., refer to specified command-line parameters. * Letting users decide what files to process is more flexible and more consistent with built-in Unix commands. +
-## Challenges + +#### Challenges 1. Leah has several hundred data files, each of which is formatted like this: @@ -324,7 +359,7 @@ Of course, this introduces another tradeoff between flexibility and complexity. $ bash largest.sh /tmp/data pdb ~~~ - would print the name of the PDB file in `/tmp/data` that has been + would print the name of the `.pdb` file in `/tmp/data` that has been changed most recently. 3. If you run the command: @@ -372,4 +407,5 @@ echo $*.dat +
diff --git a/06-find.md b/06-find.md index ecd5816a5..1c6fe1ba8 100644 --- a/06-find.md +++ b/06-find.md @@ -5,14 +5,14 @@ title: Finding Things level: novice ---
-## Objectives + +#### Objectives * Use `grep` to select lines from text files that match simple patterns. * Use `find` to find files whose names match simple patterns. * Use the output of one command as the command-line parameters to another command. * Explain what is meant by "text" and "binary" files, and why many common tools don't handle the latter well. -
-## Lesson + You can guess someone's age by how they talk about search: young people use "Google" as a verb, @@ -24,7 +24,7 @@ It is also the name of a very useful command-line program. `grep` finds and prints lines in files that match a pattern. For our examples, we will use a file that contains three haikus taken from a -[1998 competition in Salon magazine](http://www.salonmagazine.com/21st/chal/1998/01/26chal.html): +1998 competition in *Salon* magazine: ~~~ The Tao that is seen @@ -40,6 +40,12 @@ Today it is not working Software is like that. ~~~ +> #### Forever, or Five Years +> +> We haven't linked to the original haikus because they don't appear to be on *Salon*'s site any longer. +> As [Jeff Rothenberg said](http://www.clir.org/pubs/archives/ensuring.pdf), +> "Digital information lasts forever—or five years, whichever comes first." + Let's find lines that contain the word "not": ~~~ @@ -147,14 +153,14 @@ matched. (-F is specified by POSIX.) ... ... ... ~~~ -> ### Wildcards +> #### Wildcards > > `grep`'s real power doesn't come from its options, though; it comes from > the fact that patterns can include wildcards. (The technical name for > these is [regular expressions](../../gloss.html#regular-expression), which -> is what the "re" in "grep" stands for.) Regular expressions are complex -> enough that we devoted an entire section of the website to them; if you -> want to do complex searches, please check it out. As a taster, we can +> is what the "re" in "grep" stands for.) Regular expressions are both complex +> and powerful; if you want to do complex searches, please look at the lesson +> on [our website](http://software-carpentry.org). As a taster, we can > find lines that have an 'o' in the second position like this: > > $ grep -E '^.o' haiku.txt @@ -185,8 +191,12 @@ and an empty subdirectory called `old`. For our first command, let's run `find . -type d`. -`.` (i.e., the current working directory) is where we want our search to start; -`-type d` means "things that are directories". +As always, +the `.` on its own means the current working directory, +which is where we want our search to start; +the other argument, +`-type d`, +means "things that are directories". Sure enough, `find`'s output is the names of the five directories in our little tree (including `.`): @@ -276,6 +286,13 @@ $ find . -name '*.txt' ./notes.txt ~~~ +> #### Listing vs. Finding +> +> `ls` and `find` can be made to do similar things given the right options, +> but under normal circumstances, +> `ls` lists everything it can, +> while `find` searches for things with certain properties and shows them. + As we said earlier, the command line's power lies in combining tools. We've seen how to do that with pipes; @@ -320,7 +337,7 @@ $ grep FE $(find . -name '*.pdb') ./human/heme.pdb:ATOM 25 FE 1 -0.924 0.535 -0.518 ~~~ -> ### Binary Files +> #### Binary Files > > We have focused exclusively on finding things in text files. What if > your data is stored as images, in databases, or in some other format? @@ -344,7 +361,7 @@ $ grep FE $(find . -name '*.pdb') > modern programming languages, Python included, have borrowed a lot of > ideas from it, and imitation is also the sincerest form of praise. -## Conclusion +#### Conclusion The Unix shell is older than most of the people who use it. It has survived so long because it is one of the most productive programming @@ -358,19 +375,17 @@ number of important operations which we can perform without thinking about them."
-## Key Points -* Everything is stored as bytes, but the bytes in binary files do not represent characters. -* Use nested loops to run commands for every combination of two lists of things. -* Use `\` to break one logical line into several physical lines. -* Use parentheses `()` to keep things combined. -* Use `$(command)` to insert a command's output in place. -* `find` finds files with specific properties that match patterns. -* `grep` selects lines in files that match patterns. + +#### Key Points +* Use `find` to find files, and `grep` to find things in files. +* `$(command)` inserts a command's output in place. * `man command` displays the manual page for a given command. +
-## Challenges + +#### Challenges 1. Write a short explanatory comment for the following shell script: @@ -391,4 +406,5 @@ about them." 3. `grep -v temp $(find /data -name '*ose.dat' -print)` 4. None of the above. +
diff --git a/README.txt b/README.txt new file mode 100644 index 000000000..52832b426 --- /dev/null +++ b/README.txt @@ -0,0 +1,7 @@ +# Resources + +* `filesystem`: filesystem used in "Files and Directories" +* `creatures`: DNA data used in "Loops" +* `finding`: data using in "Finding Things" +* `molecules`: PDB files used in "Pipes and Filters" +* `scripting`: files and directories used in "Shell Scripts" diff --git a/guide.md b/guide.md deleted file mode 100644 index 238ce5aa0..000000000 --- a/guide.md +++ /dev/null @@ -1,120 +0,0 @@ ---- -layout: lesson -root: ../.. -title: Instructor's Guide -level: novice ---- -Many people have questioned whether we should still teach the shell. -After all, -anyone who wants to rename several thousand data files -can easily do so interactively in the Python interpreter, -and anyone who's doing serious data analysis -is probably going to do most of their work inside the IPython Notebook or R Studio. -So why teach the shell? - -The first answer is, -"Because so much else depends on it." -Installing software, -configuring your default editor, -and controlling remote machines frequently assume a basic familiarity with the shell, -and with related ideas like standard input and output. -Many tools also use its terminology -(for example, the `%ls` and `%cd` magic commands in IPython). - -The second answer is, -"Because it's an easy way to introduce some fundamental ideas about how to use computers." -As we teach people how to use the Unix shell, -we teach them that they should get the computer to repeat things -(via tab completion, -`!` followed by a command number, -and `for` loops) -rather than repeating things themselves. -We also teach them to take things they've discovered they do frequently -and save them for later re-use -(via shell scripts), -to give things sensible names, -and to write a little bit of documentation -(like comment at the top of shell scripts) -to make their future selves' lives better. - -Finally, -and perhaps most importantly, -teaching people the shell lets us teach them -to think about programming in terms of function composition. -In the case of the shell, -this takes the form of pipelines rather than nested function calls, -but the core idea of "small pieces, loosely joined" is the same. - -All of this material can be covered in three hours -as long as learners using Windows do not run into roadblocks such as: - -* not being able to figure out where their home directory is - (particularly if they're using Cygwin); -* not being able to run a plain text editor; - and -* the shell refusing to run scripts that include DOS line endings. - -Teaching Notes --------------- - -* Have learners open a shell - and then do `whoami`, - `pwd`, - and `ls`. - Then have them create a directory called `bootcamp` - and `cd` into it, - so that everything else they do during the lesson - is unlikely to harm whatever files they already have. - -* Get them to run an editor - and save a file in their `bootcamp` directory - as early as possible. - Doing this is usually the biggest stumbling block during the entire lesson: - many will try to run the same editor as the instructor - (which may leave them trapped in the awful nether hell that is Vim), - or will not know how to navigate to the right directory - to save their file, - or will run a word processor rather than a plain text editor. - The quickest way past these problems is to have more knowledgeable learners - help those who need it. - -* Tab completion sounds like a small thing: it isn't. - Re-running old commands using `!123` or `!wc` - isn't a small thing either, - and neither are wildcard expansion and `for` loops. - Each one is an opportunity to repeat one of the big ideas of Software Carpentry: - if the computer *can* repeat it, - some programmer somewhere will almost certainly have built - some way for the computer *to* repeat it. - -* Building up a pipeline with four or five stages, - then putting it in a shell script for re-use - and calling that script inside a `for` loop, - is a great opportunity to show how - "seven plus or minus two" - connects to programming. - Once we have figured out how to do something moderately complicated, - we make it re-usable and give it a name - so that it only takes up one slot in working memory - rather than several. - It is also a good opportunity to talk about exploratory programming: - rather than designing a program up front, - we can do a few useful things - and then retroactively decide which are worth encapsulating - for future re-use. - -* We have to leave out many important things because of time constraints, - including file permissions, job control, and SSH. - If learners already understand the basic material, - this can be covered instead using the online lessons as guidelines. - These limitations also have follow-on consequences: - - * Without file permissions, it's hard to discuss [script - shebangs][shebang] (e.g. `#!/bin/sh`). - -* Installing Bash and a reasonable set of Unix commands on Windows - always involves some fiddling and frustration. - Please see the latest set of installation guidelines for advice, - and try it out yourself *before* teaching a class. - -[shebang]: http://en.wikipedia.org/wiki/Shebang_%28Unix%29 diff --git a/img/home-directories.odg b/img/home-directories.odg index 50348639d8cac8b8d2cdaf25245f77799b241c9d..7a99ceab97d9ce081dbb54f4f6202082558a0d6f 100644 GIT binary patch delta 5404 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 zimage/svg+xml + inkscape:current-layer="svg2" /> + id="defs4"> @@ -56,26 +56,26 @@ y="0" width="21590" height="27940" - id="rect5016" /> + id="rect7" /> + id="defs9"> + id="g11" /> + id="defs13"> + id="defs42" /> + id="g51"> + id="g54"> + id="g56"> + id="g58"> / + id="g71"> @@ -218,42 +218,42 @@ + id="g76"> + id="g78"> bin + id="g91"> @@ -261,42 +261,42 @@ + id="g96"> + id="g98"> tmp + id="g111"> @@ -304,76 +304,76 @@ + id="g116"> + id="g123"> + id="g130"> + id="g132"> data + id="g145"> @@ -381,42 +381,42 @@ + id="g150"> + id="g152"> users + id="g165"> @@ -424,76 +424,76 @@ + id="g170"> + id="g177"> + id="g184"> + id="g186"> vlad + id="g199"> @@ -501,59 +501,59 @@ + id="g204"> + id="g211"> + id="g213"> imhotep + id="tspan222">dru + id="g226"> @@ -561,42 +561,42 @@ + id="g231"> + id="g233"> larry + id="tspan242">gorgon + id="g246"> @@ -604,34 +604,34 @@ + id="g251"> + id="g258"> diff --git a/img/nano-screenshot.png b/img/nano-screenshot.png index 02dfa909a1df4e6ed72bdbb0c116f6ee56f01010..50fb17107358633a59e6b8c40940ff4362aab476 100644 GIT binary patch literal 42241 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 diff --git a/index.md b/index.md index db0d11a6d..befd5edf4 100644 --- a/index.md +++ b/index.md @@ -12,8 +12,8 @@ it helps them combine existing programs in new ways and automate repetitive tasks so that they don't have to type the same things over and over again. -Topics ------- +
+ 1. [Introducing the Shell](00-intro.html) 2. [Files and Directories](01-filedir.html) 3. [Creating Things](02-create.html) @@ -22,15 +22,4 @@ Topics 6. [Shell Scripts](05-script.html) 7. [Finding Things](06-find.html) -See Also --------- -* [Instructor's Guide](guide.html) -* [Reference](reference.html) - -Resources ---------- -* `filesystem`: filesystem used in "Files and Directories" -* `creatures`: DNA data used in "Loops" -* `finding`: data using in "Finding Things" -* `molecules`: PDB files used in "Pipes and Filters" -* `scripting`: files and directories used in "Shell Scripts" +
diff --git a/reference.md b/reference.md deleted file mode 100644 index 44cf9f598..000000000 --- a/reference.md +++ /dev/null @@ -1,53 +0,0 @@ ---- -layout: lesson -root: ../.. -title: Shell Reference -level: novice ---- -Basic Commands --------------- -* `cat` displays the contents of its inputs. -* `cd path` changes the current working directory. -* `cp old new` copies a file. -* `find` finds files with specific properties that match patterns. -* `grep` selects lines in files that match patterns. -* `head` displays the first few lines of its input. -* `ls path` prints a listing of a specific file or directory; `ls` on its own lists the current working directory. -* `man command` displays the manual page for a given command. -* `mkdir path` creates a new directory. -* `mv old new` moves (renames) a file or directory. -* `pwd` prints the user's current working directory. -* `rm path` removes (deletes) a file. -* `rmdir path` removes (deletes) an empty directory. -* `sort` sorts its inputs. -* `tail` displays the last few lines of its input. -* `touch path` creates an empty file if it doesn't already exist. -* `wc` counts lines, words, and characters in its inputs. -* `whoami` shows the user's current identity. - -Paths ------ -* `/path/from/root` is an absolute path. -* `/` on its own refers to the root of the filesystem. -* `path/without/leading/slash` is a relative path. -* `.` refers to the current directory, `..` to its parent. -* `*` matches zero or more characters in a filename, so `*.txt` matches all files ending in `.txt`. -* `?` matches any single character in a filename, so `?.txt` matches `a.txt` but not `any.txt`. - -Combining Commands ------------------- -* `command > file` redirects a command's output to a file. -* `first | second` connects the output of the first command to the input of the second. -* Use a `for` loop to repeat commands once for every thing in a list: - - for variable in name_1 name_2 name_3 - do - ...commands refering to $variable... - done - -* Use `$name` to expand a variable (i.e., get its value). -* Use `history` to display recent commands, and `!number` to repeat a command by number. -* Use `bash filename` to run commands saved in `filename`. -* `$*` refers to all of a shell script's command-line parameters. -* `$1`, `$2`, etc., refer to specified command-line parameters. -* Use `$(command)` to insert a command's output in place.