annotate src/computer_literacy/bash.html @ 26:fb87f762847e

start computer_literacy
author Franklin Schmidt <fschmidt@gmail.com>
date Thu, 09 Oct 2025 16:56:36 -0600
parents
children 9134d56639ae
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
26
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1 <!doctype html>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
2 <html lang="en">
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3 <head>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
4 <script src="/site.js"></script>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
5 <script> head() </script>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
6 <title>Arkian - Bash</title>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
7 <script>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
8 'use strict';
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
9
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
10 let content = {
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
11 intro: {
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
12 title: 'Introduction',
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
13 content: `\
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
14 <p>I really don't want to write this tutorial, but all the existing Bash tutorials are so horrible that I have no choice. I looked at books, websites, and YouTube - all horrible. They don't start with the basics. They include all kinds of useless junk. And they don't explain core concepts. So I have no choice but to write this for my <a href="learn.html#bash">Learn Reactionary Programming</a> Bash lesson.</p>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
15
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
16 <p><a href="bash.html">Bash</a> is a <a href="https://en.wikipedia.org/wiki/Unix_shell">shell</a>, one of many, but the one I prefer. I will focus on Mac and Windows. I don't have Linux, and I hate Linux, so I won't discuss it. Most of Bash is the same on Mac and Windows, but where they differ, I will discuss both.</p>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
17 ` ,
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
18 },
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
19 access: {
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
20 title: 'Running Bash',
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
21 content: `\
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
22 <p>How you access Bash depends on your operating system. If you are on a Mac then you access Bash through the Mac Terminal which is found in "Applications > Utilities > Terminal.app". Be sure to <a href="https://www.howtogeek.com/444596/how-to-change-the-default-shell-to-bash-in-macos-catalina/">set the default shell to Bash</a>. If you are on Windows then install <a href="https://www.msys2.org/">MSYS2</a>. The default terminal isn't so good, so I suggest <a href="https://www.msys2.org/docs/terminals/#windows-terminal">using the Windows Terminal</a>.</p>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
23 ` ,
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
24 },
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
25 start: {
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
26 title: 'Getting Started',
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
27 content: `\
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
28 <p>When I start Bash on my Mac I see:</p>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
29
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
30 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
31 Last login: Thu Jan 4 23:25:35 on ttys004
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
32
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
33 The default interactive shell is now zsh.
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
34 To update your account to use zsh, please run 'chsh -s /bin/zsh'.
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
35 For more details, please visit https://support.apple.com/kb/HT208050.
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
36 ~ $
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
37
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
38 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
39
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
40 <p>On Windows - MSYS2 I just see:</p>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
41
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
42 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
43 ~ $
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
44
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
45 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
46
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
47 <p>The line with the <b><code>$</code></b> is the command prompt. The cursor is at the end of it, and if I type, my text will go there. You may have different text before the <b><code>$</code></b> which is okay, but the line should end with <b><code>$</code></b>. If it doesn't, something is wrong.</p>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
48
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
49 <p>Now type "qqq". When I say type "whatever", you should type return/enter at the end. Only when you type return/enter will Bash process what you typed. Now you should see:</p>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
50
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
51 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
52 ~ $ qqq
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
53 -bash: qqq: command not found
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
54 ~ $
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
55 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
56
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
57 <p>Bash doesn't know what "qqq" means and says so. Now try the following... Note that you type what is after the <b><code>$</code></b> and Bash should respond as shown.</p>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
58
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
59 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
60 ~ $ echo hi
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
61 hi
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
62 ~ $ echo how are you
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
63 how are you
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
64 ~ $ echo bye
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
65 bye
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
66 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
67
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
68 <p>The <code>echo</code> command just echoes what comes after. Now press the up-arrow on your keyboard. This should put the previous command where your cursor is. Up-arrow again brings the command before that. Try down-arrow and left-arrow and right-arrow. You can use this to navigate through your command history. The delete key also works for editing lines. And of course you can type. When you press return/enter then Bash will get your edited command and process it.</p>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
69
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
70 <p>When you enter <code>echo how are you</code>, <code>echo</code> is the command. This command has 3 arguments: <code>how</code>, <code>are</code>, and <code>you</code>. Commands and arguments are separated with spaces. It doesn't matter how many spaces, so:</p>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
71
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
72 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
73 ~ $ echo how are you
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
74 how are you
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
75 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
76
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
77 <p><code>echo</code> just returns the arguments separated by one space.</p>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
78
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
79 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
80 ~ $ echo one; echo two
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
81 one
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
82 two
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
83 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
84
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
85 <p>You can put multiple commands on one line separated by a <code>;</code>.</p>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
86 ` ,
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
87 },
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
88 man: {
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
89 title: 'The "man" Command',
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
90 content: `\
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
91 <p>Enter:</p>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
92 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
93 ~ $ man echo
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
94 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
95
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
96 <p>You should get something like:</p>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
97
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
98 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
99
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
100 ECHO(1) BSD General Commands Manual ECHO(1)
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
101
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
102 NAME
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
103 echo -- write arguments to the standard output
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
104
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
105 SYNOPSIS
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
106 echo [-n] [string ...]
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
107
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
108 DESCRIPTION
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
109 The echo utility writes any specified operands, separated by single blank
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
110 (' ') characters and followed by a newline ('\\n') character, to the stan-
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
111 dard output.
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
112
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
113 The following option is available:
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
114
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
115 -n Do not print the trailing newline character. This may also be
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
116 achieved by appending '\\c' to the end of the string, as is done by
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
117 iBCS2 compatible systems. Note that this option as well as the
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
118 effect of '\\c' are implementation-defined in IEEE Std 1003.1-2001
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
119 (''POSIX.1'') as amended by Cor. 1-2002. Applications aiming for
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
120 maximum portability are strongly encouraged to use printf(1) to
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
121 suppress the newline character.
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
122 :
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
123 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
124
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
125 <p>But if you are on Windows, you may not have <code>man</code> installed. In that case, do:</p>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
126
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
127 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
128 ~ $ pacman -S man-db
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
129 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
130
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
131 <p>to install <code>man</code> as described <a href="https://packages.msys2.org/package/man-db">here</a> and then try <code>man echo</code> again.</p>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
132
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
133 <p>The <code>man</code> command shows documentation of commands. Unfortunately it has a silly user interface based on memorizing keys, so I will just tell you the few keys you need. Down-arrow and up-arrow move down and up by one line. The space key moves down by one page. And most importantly, typing "q" quits and takes you back to Bash. You just have to memorize this.</p>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
134
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
135 <p>Now try entering <code>man man</code>. You don't need all the stuff shown, but you can see what a complicated man page looks like. You can use <code>man</code> to get the documentation of other commands as I discuss them.</p>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
136 ` ,
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
137 },
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
138 dirs: {
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
139 title: 'Directories',
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
140 content: `\
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
141 <p>You should be familiar with Mac Finder or Windows File Explorer, and you should know from this that directories (also called "folders") are organized into a tree.</p>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
142
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
143 <p>On Mac:</p>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
144
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
145 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
146 ~ $ pwd
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
147 /Users/fschmidt
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
148 ~ $ open .
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
149 ~ $
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
150 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
151
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
152 <p>On Windows:</p>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
153
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
154 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
155 ~ $ pwd
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
156 /home/fschmidt
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
157 ~ $ explorer .
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
158 ~ $
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
159 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
160
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
161 <p>When using Bash, you are always in some directory, called the current directory or the working directory. <code>pwd</code> shows you the full path to this directory. Do <code>man pwd</code> for details. <code>open .</code> should open the Mac Finder for the current directory, and <code>explorer .</code> should open the Windows File Explorer for the current directory.<p>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
162
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
163 <p>Continuing on my Mac:</p>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
164
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
165 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
166 ~ $ mkdir learn
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
167 ~ $ cd learn
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
168 ~/learn $ pwd
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
169 /Users/fschmidt/learn
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
170 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
171
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
172 <p><code>mkdir</code> makes a directory in the current directory. You should be able to see the created directory in Mac Finder or Windows File Explorer. <code>cd</code> stands for "change directory". This changes the current directory. <code>cd</code> is a built-in command (built into Bash), and <code>man</code> isn't useful with built-in commands, so instead of <code>man cd</code>, try <code>help cd</code>. Continuing...</p>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
173
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
174 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
175 ~/learn $ pwd
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
176 /Users/fschmidt/learn
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
177 ~/learn $ ls
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
178 ~/learn $ touch file1
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
179 ~/learn $ ls
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
180 file1
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
181 ~/learn $ touch file2
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
182 ~/learn $ touch file3
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
183 ~/learn $ ls
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
184 file1 file2 file3
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
185 ~/learn $ mkdir dir1
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
186 ~/learn $ ls
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
187 dir1 file1 file2 file3
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
188 ~/learn $ ls -F
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
189 dir1/ file1 file2 file3
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
190 ~/learn $ ls -a
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
191 . .. dir1 file1 file2 file3
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
192 ~/learn $ ls -a -F
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
193 ./ ../ dir1/ file1 file2 file3
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
194 ~/learn $ ls -aF
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
195 ./ ../ dir1/ file1 file2 file3
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
196 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
197
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
198 <p><code>ls</code> lists files and <code>touch</code> creates an empty file. Arguments that start with "-" are options. Do <code>man ls</code> to see what the options I used do. <code>-F</code> appends a "/" to directories, and <code>-a</code> shows files starting with "." which are usually hidden. Options can be combined.</p>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
199
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
200 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
201 ~/learn $ ls file1
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
202 file1
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
203 ~/learn $ ls qqq
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
204 ls: qqq: No such file or directory
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
205 ~/learn $ ls file1 qqq file2
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
206 ls: qqq: No such file or directory
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
207 file1 file2
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
208 ~/learn $ ls dir1
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
209 ~/learn $ touch dir1/d1file
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
210 ~/learn $ ls dir1
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
211 d1file
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
212 ~/learn $ ls -d dir1
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
213 dir1
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
214 ~/learn $ ls file1 file2 dir1
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
215 file1 file2
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
216
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
217 dir1:
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
218 d1file
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
219 ~/learn $ ls -d file1 file2 dir1
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
220 dir1 file1 file2
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
221 ~/learn $ ls -dF file1 file2 dir1
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
222 dir1/ file1 file2
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
223 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
224
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
225 <p>Without file arguments, <code>ls</code> lists files in the current directory. With file arguments, it lists those files if they exist. If the file is a directory, it will list what is in the directory unless the <code>-d</code> option is used.</p>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
226
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
227 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
228 ~/learn $ ls
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
229 dir1 file1 file2 file3
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
230 ~/learn $ ls .
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
231 dir1 file1 file2 file3
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
232 ~/learn $ ls -d .
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
233 .
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
234 ~/learn $ ls -dF .
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
235 ./
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
236 ~/learn $ ls ./file1
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
237 ./file1
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
238 ~/learn $ ls dir1
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
239 d1file
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
240 ~/learn $ ls ./dir1
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
241 d1file
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
242 ~/learn $ pwd
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
243 /Users/fschmidt/learn
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
244 ~/learn $ cd .
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
245 ~/learn $ pwd
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
246 /Users/fschmidt/learn
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
247 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
248
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
249 <p><code>.</code> is the current directory.</p>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
250
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
251 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
252 ~/learn $ pwd
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
253 /Users/fschmidt/learn
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
254 ~/learn $ cd dir1
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
255 ~/learn/dir1 $ pwd
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
256 /Users/fschmidt/learn/dir1
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
257 ~/learn/dir1 $ ls .
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
258 d1file
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
259 ~/learn/dir1 $ ls ..
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
260 dir1 file1 file2 file3
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
261 ~/learn/dir1 $ cd ..
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
262 ~/learn $ pwd
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
263 /Users/fschmidt/learn
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
264 ~/learn $ cd dir1
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
265 ~/learn/dir1 $ pwd
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
266 /Users/fschmidt/learn/dir1
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
267 ~/learn/dir1 $ cd ../..
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
268 ~ $ pwd
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
269 /Users/fschmidt
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
270 ~ $ cd learn
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
271 ~/learn $ pwd
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
272 /Users/fschmidt/learn
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
273 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
274
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
275 <p><code>..</code> is the parent directory.</p>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
276
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
277 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
278 ~/learn $ echo *
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
279 dir1 file1 file2 file3
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
280 ~/learn $ echo d*
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
281 dir1
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
282 ~/learn $ echo f*
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
283 file1 file2 file3
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
284 ~/learn $ echo *1
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
285 dir1 file1
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
286 ~/learn $ echo dir1/*
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
287 dir1/d1file
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
288 ~/learn $ echo */*
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
289 dir1/d1file
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
290 ~/learn $ echo qqq*
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
291 qqq*
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
292 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
293
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
294 <p><code>*</code> does wildcard matching of files. It is important to understand that Bash does the wildcard matching and then passes the resulting arguments to the command. <code>echo</code> never sees the "*" unless there is no match.</p>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
295
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
296 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
297 ~/learn $ ls *
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
298 file1 file2 file3
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
299
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
300 dir1:
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
301 d1file
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
302 ~/learn $ ls -dF *
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
303 dir1/ file1 file2 file3
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
304 ~/learn $ ls -dF d*
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
305 dir1/
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
306 ~/learn $ ls -dF f*
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
307 file1 file2 file3
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
308 ~/learn $ ls -dF *1
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
309 dir1/ file1
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
310 ~/learn $ ls dir1/*
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
311 dir1/d1file
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
312 ~/learn $ ls */*
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
313 dir1/d1file
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
314 ~/learn $ ls -dF qqq*
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
315 ls: qqq*: No such file or directory
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
316 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
317
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
318 <p>Should be self-explanatory.</p>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
319
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
320 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
321 ~/learn $ pwd
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
322 /Users/fschmidt/learn
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
323 ~/learn $ cd ~
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
324 ~ $ pwd
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
325 /Users/fschmidt
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
326 ~ $ cd learn/dir1
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
327 ~/learn/dir1 $ pwd
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
328 /Users/fschmidt/learn/dir1
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
329 ~/learn/dir1 $ cd
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
330 ~ $ pwd
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
331 /Users/fschmidt
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
332 ~ $ cd ~/learn
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
333 ~/learn $ pwd
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
334 /Users/fschmidt/learn
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
335 ~/learn $ echo ~
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
336 /Users/fschmidt
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
337 ~/learn $ echo .
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
338 .
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
339 ~/learn $ echo ..
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
340 ..
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
341 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
342
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
343 <p><code>~</code> means your home directory. <code>cd</code> without arguments is the same as <code>cd ~</code>. <code>~</code> is expanded into your home directory by Bash.</p>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
344
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
345 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
346 ~/learn $ ls -ltF
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
347 total 0
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
348 drwxr-xr-x 3 fschmidt staff 96 Jan 5 02:33 dir1/
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
349 -rw-r--r-- 1 fschmidt staff 0 Jan 5 02:21 file3
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
350 -rw-r--r-- 1 fschmidt staff 0 Jan 5 02:21 file2
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
351 -rw-r--r-- 1 fschmidt staff 0 Jan 5 02:21 file1
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
352 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
353
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
354 <p><code>-l</code> gives you this ugly techy format. You get the date that the file was last modified. Before the date is the file size. <code>-t</code> sorts by date descending.</p>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
355
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
356 <p>Lastly I will describe autocompletion. I type <code>echo d</code> without enter/return but instead then press the tab key. It autocompletes to <code>echo dir1/</code>. I press tab again and it autocompletes to <code>echo dir1/d1file</code>. Pressing tab while entering a file or directory makes Bash try to autocomplete using matching file names. If I enter <code>echo f</code> and press tab, I get <code>echo file</code>. It doesn't know which to choose next. Another tab just beeps. And another tab shows me the options like this:</p>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
357
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
358 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
359 ~/learn $ echo file
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
360 file1 file2 file3
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
361 ~/learn $ echo file
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
362 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
363
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
364 <p>In general, you can press tab anytime while entering a file name and see what happens. Autocompletion saves a lot of typing.</p>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
365 ` ,
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
366 },
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
367 files: {
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
368 title: 'Working with Files',
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
369 content: `\
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
370 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
371 ~/learn $ ls -F
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
372 dir1/ file1 file2 file3
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
373 ~/learn $ cp file1 copied
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
374 ~/learn $ ls -F
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
375 copied dir1/ file1 file2 file3
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
376 ~/learn $ mv copied moved
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
377 ~/learn $ ls -F
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
378 dir1/ file1 file2 file3 moved
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
379 ~/learn $ rm moved
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
380 ~/learn $ ls -F
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
381 dir1/ file1 file2 file3
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
382 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
383
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
384 <p><code>cp</code> copies files or directories. <code>mv</code> moves files or directories. <code>rm</code> removes files or directories. See the <code>man</code> pages of these commands for details.</p>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
385
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
386 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
387 ~/learn $ ls -F
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
388 dir1/ file1 file2 file3
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
389 ~/learn $ mkdir dir2
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
390 ~/learn $ touch dir2/d2file
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
391 ~/learn $ ls -F
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
392 dir1/ dir2/ file1 file2 file3
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
393 ~/learn $ ls dir2
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
394 d2file
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
395 ~/learn $ rm dir2
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
396 rm: dir2: is a directory
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
397 ~/learn $ rm -d dir2
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
398 rm: dir2: Directory not empty
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
399 ~/learn $ rm dir2/d2file
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
400 ~/learn $ rm -d dir2
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
401 ~/learn $ ls -F
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
402 dir1/ file1 file2 file3
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
403 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
404
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
405 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
406 ~/learn $ ls -F
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
407 dir1/ file1 file2 file3
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
408 ~/learn $ mkdir dir2
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
409 ~/learn $ touch dir2/d2file
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
410 ~/learn $ ls -F
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
411 dir1/ dir2/ file1 file2 file3
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
412 ~/learn $ rm -r dir2
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
413 ~/learn $ ls -F
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
414 dir1/ file1 file2 file3
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
415 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
416
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
417 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
418 ~/learn $ ls -F
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
419 dir1/ file1 file2 file3
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
420 ~/learn $ cp dir1 dir2
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
421 cp: dir1 is a directory (not copied).
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
422 ~/learn $ cp -r dir1 dir2
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
423 ~/learn $ ls -F
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
424 dir1/ dir2/ file1 file2 file3
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
425 ~/learn $ ls dir2
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
426 d1file
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
427 ~/learn $ cp f* dir2
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
428 ~/learn $ ls dir2
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
429 d1file file1 file2 file3
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
430 ~/learn $ rm -r dir2
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
431 ~/learn $ ls -F
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
432 dir1/ file1 file2 file3
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
433 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
434
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
435 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
436 ~/learn $ ls -F
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
437 dir1/ file1 file2 file3
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
438 ~/learn $ mkdir dir2
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
439 ~/learn $ cp -r dir1 dir2
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
440 ~/learn $ ls -F dir2
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
441 dir1/
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
442 ~/learn $ ls -F dir2/dir1
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
443 d1file
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
444 ~/learn $ rm -r dir2
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
445 ~/learn $ ls -F
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
446 dir1/ file1 file2 file3
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
447 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
448
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
449 <p>I could explain all this, but I won't. You should learn to understand commands and their options using <code>man</code> and by playing with them. Don't continue until you completely understand the above.</p>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
450 ` ,
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
451 },
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
452 quote: {
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
453 title: 'Quoting',
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
454 content: `\
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
455 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
456 ~/learn $ echo a b
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
457 a b
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
458 ~/learn $ echo "a b"
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
459 a b
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
460 ~/learn $ echo 'a b'
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
461 a b
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
462 ~/learn $ echo "a b" c
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
463 a b c
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
464 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
465
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
466 <p>Bash treats text in quotes as one argument. So in <code>echo a b</code>, <code>echo</code> has two arguments: "a" and "b". In <code>echo "a b"</code>, <code>echo</code> has one argument: "<span pre>a b</span>". In <code>echo 'a b'</code>, <code>echo</code> has one argument: "<span pre>a b</span>". In <code>echo "a b" c</code>, <code>echo</code> has two arguments: "<span pre>a b</span>" and "c".</p>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
467
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
468 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
469 ~/learn $ echo a\\ \\ \\ b
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
470 a b
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
471 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
472
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
473 <p>Outside of quotes, <code>\\ </code> is not treated as a separator, but rather is treated as a space character that is part of the argument.</p>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
474
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
475 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
476 ~/learn $ echo file*
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
477 file1 file2 file3
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
478 ~/learn $ echo "file*"
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
479 file*
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
480 ~/learn $ echo 'file*'
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
481 file*
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
482 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
483
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
484 <p>Quotes prevent wildcard expansion.</p>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
485 ` ,
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
486 },
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
487 vars: {
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
488 title: 'Variables',
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
489 content: `\
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
490 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
491 ~/learn $ echo $X
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
492
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
493 ~/learn $ X="some text"
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
494 ~/learn $ echo $X
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
495 some text
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
496 ~/learn $ echo "X is: $X"
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
497 X is: some text
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
498 ~/learn $ echo 'X is: $X'
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
499 X is: $X
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
500 ~/learn $ X="$X and more"
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
501 ~/learn $ echo $X
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
502 some text and more
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
503 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
504
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
505 <p>Here <code>X</code> is a variable. You get its value with <code>$X</code>. This also works inside double-quotes but not inside single-quotes.</p>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
506
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
507 <p>There are special variables called environment variables that are used by Bash.</p>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
508
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
509 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
510 ~/learn $ echo $PATH
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
511 /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Users/fschmidt/Dropbox/bin:/Users/fschmidt/hg/luan/scripts:/usr/local/opt/postgresql@9.5/bin
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
512 ~/learn $ which ls
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
513 /bin/ls
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
514 ~/learn $ cd /bin
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
515 /bin $ pwd
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
516 /bin
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
517 /bin $ ls
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
518 [ dd launchctl pwd test
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
519 bash df link rm unlink
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
520 cat echo ln rmdir wait4path
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
521 chmod ed ls sh zsh
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
522 cp expr mkdir sleep
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
523 csh hostname mv stty
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
524 dash kill pax sync
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
525 date ksh ps tcsh
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
526 /bin $ ls -F
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
527 [* dd* launchctl* pwd* test*
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
528 bash* df* link* rm* unlink*
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
529 cat* echo* ln* rmdir* wait4path*
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
530 chmod* ed* ls* sh* zsh*
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
531 cp* expr* mkdir* sleep*
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
532 csh* hostname* mv* stty*
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
533 dash* kill* pax* sync*
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
534 date* ksh* ps* tcsh*
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
535 /bin $ cd ~/learn
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
536 ~/learn $
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
537 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
538
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
539 <p><code>PATH</code> is an environment variable containing a list of directories separated by <code>:</code> that are searched for commands by Bash. The <code>which</code> command shows the full path to a command. <code>ls -F</code> appends a <code>*</code> to executable files.</p>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
540
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
541 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
542 ~/learn $ subl file1
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
543 -bash: subl: command not found
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
544 ~/learn $ "/Applications/Sublime Text.app/Contents/SharedSupport/bin/subl" file1
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
545 ~/learn $ PATH="$PATH:/Applications/Sublime Text.app/Contents/SharedSupport/bin"
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
546 ~/learn $ echo $PATH
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
547 /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Users/fschmidt/Dropbox/bin:/Users/fschmidt/hg/luan/scripts:/usr/local/opt/postgresql@9.5/bin:/Applications/Sublime Text.app/Contents/SharedSupport/bin
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
548 ~/learn $ subl file1
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
549 ~/learn $
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
550 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
551
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
552 <p>Here I edit the file <code>file1</code> with <a href="learn.html#editor">Sublime Text</a>, first by using the full path, and then by adding the directory to <code>PATH</code> so that Bash can find <code>subl</code>.</p>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
553
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
554 <p>I have Microsoft Word on Windows. From the Windows Command Prompt (not Bash):</p>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
555
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
556 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
557 C:\\Users\\fschmidt>winword
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
558
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
559 C:\\Users\\fschmidt>where winword
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
560 C:\\Program Files\\Microsoft Office\\root\\Office16\\WINWORD.EXE
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
561 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
562
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
563 <p><code>winword</code> runs Microsoft Word. The Command Prompt <code>where</code> command is like the Bash <code>which</code> command. So now on MSYS2:</p>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
564
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
565 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
566 ~ $ winword
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
567 bash: winword: command not found
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
568 ~ $ echo $PATH
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
569 /usr/local/bin:/usr/bin:/bin:/opt/bin:/c/Windows/System32:/c/Windows:/c/Windows/System32/Wbem:/c/Windows/System32/WindowsPowerShell/v1.0/:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl:/c/Program Files/TortoiseHg:/c/Program Files/Java/jdk1.8.0_202/bin
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
570 ~ $ PATH="$PATH:/c/Program Files/Microsoft Office/root/Office16"
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
571 ~ $ echo $PATH
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
572 /usr/local/bin:/usr/bin:/bin:/opt/bin:/c/Windows/System32:/c/Windows:/c/Windows/System32/Wbem:/c/Windows/System32/WindowsPowerShell/v1.0/:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl:/c/Program Files/TortoiseHg:/c/Program Files/Java/jdk1.8.0_202/bin:/c/Program Files/Microsoft Office/root/Office16
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
573 ~ $ winword
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
574 ~ $
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
575 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
576
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
577 <p>Returning to the Mac, there is another way to run applications found in Finder's "Applications" simply as applications instead of as commands.</p>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
578
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
579 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
580 ~/learn $ open -a 'Sublime Text' file1
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
581 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
582
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
583 <p>Another useful environment variable is <code>PS1</code> which controls the command prompt. I already have this set up, but if I didn't:</p>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
584
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
585 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
586 Franklins-MacBook-Pro:learn fschmidt$ echo $PS1
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
587 \\h:\\W \\u\\$
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
588 Franklins-MacBook-Pro:learn fschmidt$ PS1="\\w $ "
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
589 ~/learn $ echo $PS1
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
590 \\w $
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
591 ~/learn $
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
592 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
593
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
594 <p>Google "bash PS1" for more info.</p>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
595 ` ,
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
596 },
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
597 bash_profile: {
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
598 title: '.bash_profile',
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
599 content: `\
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
600 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
601 ~/learn $ cd
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
602 ~ $ ls .bash_profile
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
603 .bash_profile
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
604 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
605
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
606 <p>If <code>.bash_profile</code> isn't found then do <code>touch .bash_profile</code> to create it. This file contains Bash commands that are run when Bash starts. If you already have this file, it is likely to contain comments that start with <code>#</code>. Comments are ignored like this:</p>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
607
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
608 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
609 ~ $ # comment line, does nothing
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
610 ~ $ echo whatever # end of line comment
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
611 whatever
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
612 ~ $
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
613 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
614
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
615 <p>To edit <code>.bash_profile</code> on a Mac, you can do:</p>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
616
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
617 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
618 ~ $ open -a 'Sublime Text' .bash_profile
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
619 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
620
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
621 <p>To edit <code>.bash_profile</code> on Windows, you can do:</p>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
622
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
623 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
624 ~ $ notepad .bash_profile
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
625 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
626
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
627 <p>Now try adding this line to <code>.bash_profile</code>:</p>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
628
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
629 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
630 echo hello there
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
631 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
632
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
633 <p>Now when you open a new Bash terminal, you should see "hello there". <code>.bash_profile</code> runs when Bash is started by opening a new Bash terminal.</p>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
634
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
635 <p>I set <code>PS1</code> and <code>PATH</code> in <code>.bash_profile</code> to have the command prompt I want, and access to the commands that I want. I suggest that you make the <a href="https://www.sublimetext.com/docs/command_line.html">Sublime Text command</a> <code>subl</code> available in <code>PATH</code>.</p>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
636 ` ,
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
637 },
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
638 find: {
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
639 title: 'The "find" Command',
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
640 content: `\
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
641 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
642 ~/learn $ find .
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
643 .
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
644 ./file3
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
645 ./file2
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
646 ./file1
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
647 ./dir1
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
648 ./dir1/d1file
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
649 ~/learn $ find . -name 'file*'
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
650 ./file3
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
651 ./file2
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
652 ./file1
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
653 ~/learn $ find . -name '*file'
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
654 ./dir1/d1file
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
655 ~/learn $ find . -name 'd*'
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
656 ./dir1
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
657 ./dir1/d1file
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
658 ~/learn $ find . -name '*1' -or -name '*2'
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
659 ./file2
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
660 ./file1
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
661 ./dir1
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
662 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
663
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
664 <p><code>find</code> recursively searches for files in a directory tree. Note that in this case the <code>*</code> wildcard matching is not being done by Bash, it is being done by <code>find</code>. <code>find</code> has many options for searching for files and acting on them, see <code>man find</code>.</p>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
665 ` ,
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
666 },
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
667 io: {
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
668 title: 'Input and Output',
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
669 content: `\
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
670 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
671 ~/learn $ echo 'this is a test' >test.txt
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
672 ~/learn $ ls -F
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
673 dir1/ file1 file2 file3 test.txt
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
674 ~/learn $ cat test.txt
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
675 this is a test
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
676 ~/learn $ echo 'this is another test' >test.txt
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
677 ~/learn $ cat test.txt
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
678 this is another test
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
679 ~/learn $ echo 'another line' >>test.txt
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
680 ~/learn $ cat test.txt
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
681 this is another test
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
682 another line
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
683 ~/learn $ cat &lt;test.txt
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
684 this is another test
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
685 another line
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
686 ~/learn $ cat &lt;&lt;End >test.txt
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
687 > I am typing this
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
688 > and this
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
689 > End
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
690 ~/learn $ cat test.txt
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
691 I am typing this
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
692 and this
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
693 ~/learn $ (echo one; echo two) >test.txt
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
694 ~/learn $ cat test.txt
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
695 one
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
696 two
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
697 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
698
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
699 <p>All programs have standard input, standard output, and standard error. Programs write normal output to standard output and error messages to standard error. By default, standard input comes from the terminal, and standard output and standard error go to the terminal, but this can be changed. <code>>file</code> sends standard output to <code>file</code>. <code>>>file</code> appends standard output to <code>file</code>. <code>&lt;file</code> reads standard input from <code>file</code>. <code>&lt;&lt;whatever</code> reads standard input from the text that follows until a line with just <code>whatever</code>. Commands can be combined between <code>(</code> and <code>)</code>. Be sure to <code>man cat</code> to understand how <code>cat</code> works.</p>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
700
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
701 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
702 ~/learn $ ls >ls.txt
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
703 ~/learn $ cat ls.txt
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
704 dir1
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
705 file1
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
706 file2
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
707 file3
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
708 ls.txt
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
709 test.txt
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
710 ~/learn $ ls -d f* q* >ls.txt
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
711 ls: q*: No such file or directory
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
712 ~/learn $ cat ls.txt
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
713 file1
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
714 file2
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
715 file3
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
716 ~/learn $ ls -d f* q* 2>ls.txt
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
717 file1 file2 file3
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
718 ~/learn $ cat ls.txt
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
719 ls: q*: No such file or directory
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
720 ~/learn $ ls -d f* q* | tee ls.txt
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
721 ls: q*: No such file or directory
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
722 file1
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
723 file2
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
724 file3
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
725 ~/learn $ cat ls.txt
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
726 file1
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
727 file2
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
728 file3
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
729 ~/learn $ ls -d f* q* 2>&1 | tee ls.txt
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
730 ls: q*: No such file or directory
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
731 file1
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
732 file2
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
733 file3
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
734 ~/learn $ cat ls.txt
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
735 ls: q*: No such file or directory
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
736 file1
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
737 file2
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
738 file3
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
739 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
740
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
741 <p><code>2>file</code> sends standard error to <code>file</code>. <code>|</code> sends standard output of the previous command to standard input of the following command. <code>2>&1</code> sends standard error to standard output. <code>tee file</code> reads standard input and then writes it to both standard output and to <code>file</code>.</p>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
742
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
743 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
744 ~/learn $ find . -type f | wc -l
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
745 6
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
746 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
747
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
748 <p>There are 6 files in <code>learn</code>. Use <code>man</code> to figure out how this works.</p>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
749 ` ,
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
750 },
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
751 ctrl: {
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
752 title: 'Control Keys',
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
753 content: `\
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
754 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
755 ~/learn $ sleep 3
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
756 ~/learn $ sleep 30
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
757 ^C
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
758 ~/learn $
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
759 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
760
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
761 <p><code>sleep 3</code> sleeps for 3 seconds, meaning it does nothing for 3 seconds. I waited 3 seconds for this command to finish. Then I ran <code>sleep 30</code> which would sleep for 30 seconds, but I lost my patience and pressed control+c which interrupts the program and breaks out of it. You can try control+c if you ever get stuck waiting for a command to finish.</p>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
762
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
763 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
764 ~/learn $ wc
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
765 I am typing this
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
766 and this
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
767 now I will end my input with control+d
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
768 3 14 65
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
769 ~/learn $ wc
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
770 this time I will use control+c to break out
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
771 ^C
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
772 ~/learn $
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
773 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
774
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
775 <p>Control+d means end of input.</p>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
776 ` ,
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
777 },
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
778 subst: {
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
779 title: 'Command Substitution',
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
780 content: `\
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
781 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
782 ~/learn $ echo I am in $(pwd)
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
783 I am in /Users/fschmidt/learn
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
784 ~/learn $ echo this directory contains: $(ls)
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
785 this directory contains: dir1 file1 file2 file3 ls.txt test.txt
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
786 ~/learn $ echo this directory contains $(ls | wc -l) files
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
787 this directory contains 6 files
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
788 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
789
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
790 <p><code>cmd $(commands)</code> will use the output of <code>commands</code> as argument text for <code>cmd</code>.</p>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
791
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
792 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
793 ~/learn $ cat $(find . -type f) | wc -c
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
794 86
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
795 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
796
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
797 <p>The files in <code>learn</code> contain a total of 86 bytes. Use <code>man</code> to figure out how this works.</p>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
798 ` ,
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
799 },
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
800 ampersand: {
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
801 title: 'Ampersand',
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
802 content: `\
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
803 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
804 ~/learn $ (sleep 5; echo done) &
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
805 [1] 10080
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
806 ~/learn $ echo waiting
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
807 waiting
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
808 ~/learn $ done
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
809
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
810 [1]+ Done ( sleep 5; echo done )
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
811 ~/learn $
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
812 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
813
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
814 <p>Normally Bash waits for a command to complete before showing the command prompt and allowing input. But ending a command line with <code>&</code> tells bash not to wait, but instead to run the command in a separate process. Above in <code>~/learn $ echo waiting</code>, I typed in <code>echo waiting</code>. But in <code>~/learn $ done</code>, I did not type <code>done</code>. Instead this was produced by <code>echo done</code> after 5 seconds. <code>[1] 10080</code> tells me that a process was started and <code>[1]+ Done ( sleep 5; echo done )</code> tells me that the process finished.</p>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
815
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
816 <p>This is useful where you do not want to wait for a command to finish. Consider this on Windows:</p>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
817
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
818 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
819 ~ $ notepad
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
820 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
821
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
822 <p>Here you will not get a command prompt again until you quit Notepad because Bash is waiting for this command to finish. So instead do:
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
823
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
824 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
825 ~ $ notepad &
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
826 [1] 2010
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
827 ~ $
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
828 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
829
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
830 <p>Now Notepad will run and you can continue using Bash.</p>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
831 ` ,
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
832 },
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
833 scripts: {
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
834 title: 'Shell Scripts',
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
835 content: `\
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
836 <p>Make a file called <code>test.sh</code> containing the following:</p>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
837
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
838 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
839 echo this is a shell script
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
840 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
841
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
842 <p>Now from Bash:</p>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
843
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
844 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
845 ~/learn $ cat test.sh
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
846 echo this is a shell script
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
847 ~/learn $ ./test.sh
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
848 -bash: ./test.sh: Permission denied
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
849 ~/learn $ ls -F test.sh
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
850 test.sh
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
851 ~/learn $ chmod +x test.sh
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
852 ~/learn $ ls -F test.sh
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
853 test.sh*
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
854 ~/learn $ ./test.sh
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
855 this is a shell script
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
856 ~/learn $
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
857 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
858
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
859 <p><code>chmod +x file</code> makes <code>file</code> into an executable that can be run. Now I will edit <code>test.sh</code></p>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
860
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
861 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
862 ~/learn $ # edit test.sh
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
863 ~/learn $ cat test.sh
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
864 nonsense
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
865 echo this is a shell script
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
866 ~/learn $ ./test.sh
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
867 ./test.sh: line 1: nonsense: command not found
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
868 this is a shell script
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
869 ~/learn $ # edit test.sh
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
870 ~/learn $ cat test.sh
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
871 set -e
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
872 nonsense
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
873 echo this is a shell script
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
874 ~/learn $ ./test.sh
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
875 ./test.sh: line 2: nonsense: command not found
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
876 ~/learn $
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
877 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
878
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
879 <p>By default, scripts continue running after an error. In longer scripts, we want the script to exit after an error. <code>set -e</code> does this, see <code>help set</code>.</p>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
880
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
881 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
882 ~/learn $ X=some
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
883 ~/learn $ echo $X
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
884 some
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
885 ~/learn $ echo $Xthing
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
886
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
887 ~/learn $ echo \${X}thing
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
888 something
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
889 ~/learn $ # edit test.sh
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
890 ~/learn $ cat test.sh
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
891 echo "\\$* = $*"
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
892 echo "\\$# = $#"
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
893 echo "\\$0 = $0"
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
894 echo "\\$1 = $1"
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
895 echo "\\$2 = $2"
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
896 echo "\\$3 = $3"
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
897 echo "\\$4 = $4"
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
898 echo "\\$14 = $14"
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
899 echo "\\\${14} = \$\{14}"
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
900 echo "\\$@ = $@"
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
901 ./count.sh "$*"
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
902 ./count.sh "$@"
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
903 ~/learn $ ./test.sh a b "c d"
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
904 $* = a b c d
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
905 $# = 3
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
906 $0 = ./test.sh
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
907 $1 = a
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
908 $2 = b
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
909 $3 = c d
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
910 $4 =
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
911 $14 = a4
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
912 \${14} =
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
913 $@ = a b c d
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
914 1
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
915 3
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
916 ~/learn $ cat count.sh
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
917 echo $#
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
918 ~/learn $
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
919 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
920
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
921 <p>Bash scripts have special defined variables. The difference between <code>$*</code> and <code>$@</code> is subtle, and you will usually just use <code>$*</code>. <code>$*</code> returns all arguments as one string while <code>$@</code> returns the arguments separately, but this distinction rarely makes any difference.</p>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
922 ` ,
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
923 },
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
924 vars_and_scripts: {
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
925 title: 'Variables and Scripts',
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
926 content: `\
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
927 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
928 ~/learn $ X=value
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
929 ~/learn $ echo $X
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
930 value
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
931 ~/learn $ # edit test.sh
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
932 ~/learn $ cat test.sh
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
933 echo "\\$X = $X"
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
934 ~/learn $ ./test.sh
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
935 $X =
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
936 ~/learn $ export X
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
937 ~/learn $ ./test.sh
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
938 $X = value
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
939 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
940
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
941 <p>Variables are defined in the current shell. Shell scripts are run in their own shell. So by default, they don't see variables defined in the terminal/parent shell. <code>export var</code> makes <code>var</code> available in descendant processes, meaning available in shell scripts. It is a good idea to do <code>export PATH</code> in <code>.bash_profile</code> so that your PATH is available to your scripts.</p>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
942
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
943 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
944 ~/learn $ X=terminal
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
945 ~/learn $ echo $X
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
946 terminal
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
947 ~/learn $ # edit test.sh
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
948 ~/learn $ cat test.sh
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
949 X=script
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
950 export X
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
951 ~/learn $ ./test.sh
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
952 ~/learn $ echo $X
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
953 terminal
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
954 ~/learn $ . test.sh
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
955 ~/learn $ echo $X
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
956 script
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
957 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
958
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
959 <p>You can export a variable from parent to children but not from children to parent. <code>. script</code> includes the text in the file <code>script</code> in the current shell. In this case, it is not run in a separate shell. This is the only way to have a script set variables in your terminal shell.</p>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
960
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
961 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
962 ~/learn $ pwd
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
963 /Users/fschmidt/learn
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
964 ~/learn $ # edit test.sh
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
965 ~/learn $ cat test.sh
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
966 cd ~
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
967 ~/learn $ ./test.sh
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
968 ~/learn $ pwd
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
969 /Users/fschmidt/learn
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
970 ~/learn $ . test.sh
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
971 ~ $ pwd
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
972 /Users/fschmidt
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
973 ~ $ cd learn
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
974 ~/learn $
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
975 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
976
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
977 <p>This illustrates the difference between <code>./script</code> and <code>. script</code>.</p>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
978 ` ,
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
979 },
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
980 your_scripts: {
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
981 title: 'Your Scripts',
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
982 content: `\
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
983 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
984 ~/learn $ echo $PATH
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
985 /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Users/fschmidt/Dropbox/bin:/Users/fschmidt/hg/luan/scripts:/usr/local/opt/postgresql@9.5/bin:/Applications/Sublime Text.app/Contents/SharedSupport/bin
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
986 ~/learn $ echo ~/Dropbox/bin
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
987 /Users/fschmidt/Dropbox/bin
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
988 ~/learn $ ls -F ~/Dropbox/bin/e
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
989 /Users/fschmidt/Dropbox/bin/e*
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
990 ~/learn $ cat ~/Dropbox/bin/e
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
991 open -a 'Sublime Text' $*
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
992 ~/learn $ e test.sh
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
993 ~/learn $
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
994 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
995
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
996 <p>When you write useful scripts, put them in a directory and add that directory to your PATH. I use <code>~/Dropbox/bin</code> and I have a script named <code>e</code> in that directory for editing files. So <code>e test.sh</code> lets me edit <code>test.sh</code> from the command line.</p>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
997
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
998 <p>Note that Bash will only look in your PATH for scripts unless you give an explicit path to the script.</p>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
999
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1000 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1001 ~/learn $ # edit test.sh
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1002 ~/learn $ cat test.sh
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1003 echo this is a shell script
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1004 ~/learn $ test.sh
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1005 -bash: test.sh: command not found
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1006 ~/learn $ ./test.sh
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1007 this is a shell script
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1008 ~/learn $
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1009 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1010
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1011 <p>Calling <code>test.sh</code> by itself fails because it isn't in the PATH. But <code>./test.sh</code> works because it is an explicit path.</p>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1012 ` ,
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1013 },
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1014 advanced: {
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1015 title: 'Advanced Scripting',
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1016 content: `\
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1017 <p>Here is a more advanced script called <code>undocx.sh</code> that unpacks a Word DOCX file.</p>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1018
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1019 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1020 #!/bin/bash
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1021
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1022 set -e
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1023
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1024 if [ $# -ne 1 ]; then
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1025 echo "usage: $0 filename"
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1026 exit 1
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1027 fi
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1028
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1029 FILE="$1"
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1030 NEWDIR=$(basename $FILE .docx)
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1031
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1032 mkdir $NEWDIR
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1033 unzip $FILE -d $NEWDIR
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1034
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1035 export XMLLINT_INDENT=$'\\t'
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1036 for file in $(find $NEWDIR -name "*.xml" -o -name "*.rels"); do
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1037 mv "$file" temp.xml
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1038 xmllint --format temp.xml >"$file"
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1039 done
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1040 rm temp.xml
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1041 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1042
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1043 <p>Bash is a full programming language containing all the usual features. Some commands in my script are well explained by <code>man</code>, but some are not. In particular, the documentation for <code>if</code> and <code>for</code> are poor. In cases like this, I suggest asking ChatGPT like this:
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1044
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1045 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1046 Please explain the Bash "if" statement.
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1047 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1048
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1049 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1050 Please explain the Bash "for" statement.
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1051 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1052
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1053 <p>ChatGPT knows Bash well. I trust ChatGPT to explain details but not to explain core concepts. You can also try Google, but ChatGPT is better than modern programmers.</p>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1054 ` ,
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1055 },
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1056 conclusion: {
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1057 title: 'Conclusion',
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1058 content: `\
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1059 <p>At least 90% of your usage of Bash will be simple commands that you enter in the terminal. Try to use Bash as much as possible instead of using the GUI so that you get practice using it. Unless you become system administrator, you won't use advanced scripting much. But with a solid understanding of the core basics, you should be able to figure out how to read or write advanced scripts when needed.</p>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1060 ` ,
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1061 },
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1062 };
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1063 </script>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1064 </head>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1065 <body>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1066 <script> header() </script>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1067 <div content>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1068 <h1><a href="bash.html">Bash Tutorial</a></h1>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1069 <hr>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1070 <h2>Contents</h2>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1071 <div toc>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1072 <script> showToc(content) </script>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1073 </div>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1074 <hr>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1075 <script> showContent(content,2) </script>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1076 </div>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1077 </body>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1078 </html>