annotate src/computer_literacy/bash.html @ 27:9134d56639ae default tip

finish computer_literacy
author Franklin Schmidt <fschmidt@gmail.com>
date Thu, 09 Oct 2025 19:15:03 -0600
parents fb87f762847e
children
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: `\
27
9134d56639ae finish computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents: 26
diff changeset
14 <p><a href="https://www.gnu.org/software/bash/">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>
26
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 },
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
17 access: {
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
18 title: 'Running Bash',
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
19 content: `\
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
20 <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
21 ` ,
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
22 },
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
23 start: {
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
24 title: 'Getting Started',
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
25 content: `\
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
26 <p>When I start Bash on my Mac I see:</p>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
27
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
28 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
29 Last login: Thu Jan 4 23:25:35 on ttys004
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
30
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
31 The default interactive shell is now zsh.
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
32 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
33 For more details, please visit https://support.apple.com/kb/HT208050.
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
34 ~ $
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
35
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
36 </code>
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 <p>On Windows - MSYS2 I just see:</p>
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 <code block>
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
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
43 </code>
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 <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
46
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
47 <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
48
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
49 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
50 ~ $ qqq
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
51 -bash: qqq: command not found
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
52 ~ $
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
53 </code>
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 <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
56
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
57 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
58 ~ $ echo hi
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
59 hi
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
60 ~ $ echo how are you
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
61 how are you
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
62 ~ $ echo bye
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
63 bye
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
64 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
65
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
66 <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
67
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
68 <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
69
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
70 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
71 ~ $ echo how are you
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
72 how are you
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
73 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
74
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
75 <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
76
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
77 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
78 ~ $ echo one; echo two
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
79 one
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
80 two
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
81 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
82
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
83 <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
84 ` ,
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
85 },
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
86 man: {
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
87 title: 'The "man" Command',
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
88 content: `\
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
89 <p>Enter:</p>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
90 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
91 ~ $ man echo
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
92 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
93
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
94 <p>You should get something like:</p>
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 <code block>
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 ECHO(1) BSD General Commands Manual ECHO(1)
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 NAME
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
101 echo -- write arguments to the standard output
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
102
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
103 SYNOPSIS
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
104 echo [-n] [string ...]
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
105
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
106 DESCRIPTION
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
107 The echo utility writes any specified operands, separated by single blank
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
108 (' ') characters and followed by a newline ('\\n') character, to the stan-
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
109 dard output.
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
110
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
111 The following option is available:
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 -n Do not print the trailing newline character. This may also be
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
114 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
115 iBCS2 compatible systems. Note that this option as well as the
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
116 effect of '\\c' are implementation-defined in IEEE Std 1003.1-2001
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
117 (''POSIX.1'') as amended by Cor. 1-2002. Applications aiming for
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
118 maximum portability are strongly encouraged to use printf(1) to
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
119 suppress the newline character.
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
120 :
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
121 </code>
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 <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
124
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
125 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
126 ~ $ pacman -S man-db
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
127 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
128
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
129 <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
130
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
131 <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
132
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
133 <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
134 ` ,
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
135 },
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
136 dirs: {
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
137 title: 'Directories',
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
138 content: `\
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
139 <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
140
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
141 <p>On Mac:</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 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
144 ~ $ pwd
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
145 /Users/fschmidt
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
146 ~ $ open .
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
147 ~ $
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
148 </code>
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 <p>On Windows:</p>
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 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
153 ~ $ pwd
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
154 /home/fschmidt
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
155 ~ $ explorer .
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
156 ~ $
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
157 </code>
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 <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
160
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
161 <p>Continuing on my Mac:</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 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
164 ~ $ mkdir learn
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
165 ~ $ cd learn
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
166 ~/learn $ pwd
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
167 /Users/fschmidt/learn
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
168 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
169
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
170 <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
171
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
172 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
173 ~/learn $ pwd
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
174 /Users/fschmidt/learn
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
175 ~/learn $ ls
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
176 ~/learn $ touch file1
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 file1
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
179 ~/learn $ touch file2
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
180 ~/learn $ touch file3
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
181 ~/learn $ ls
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
182 file1 file2 file3
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
183 ~/learn $ mkdir dir1
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
184 ~/learn $ ls
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
185 dir1 file1 file2 file3
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
186 ~/learn $ ls -F
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 -a
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 -F
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 -aF
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 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
195
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
196 <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
197
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
198 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
199 ~/learn $ ls file1
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
200 file1
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
201 ~/learn $ ls qqq
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
202 ls: qqq: No such file or directory
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
203 ~/learn $ ls file1 qqq file2
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 file1 file2
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
206 ~/learn $ ls dir1
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
207 ~/learn $ touch dir1/d1file
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 d1file
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
210 ~/learn $ ls -d dir1
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
211 dir1
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
212 ~/learn $ ls file1 file2 dir1
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
213 file1 file2
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
214
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
215 dir1:
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
216 d1file
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
217 ~/learn $ ls -d file1 file2 dir1
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
218 dir1 file1 file2
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
219 ~/learn $ ls -dF 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 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
222
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
223 <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
224
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
225 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
226 ~/learn $ ls
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
227 dir1 file1 file2 file3
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 -d .
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
231 .
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
232 ~/learn $ ls -dF .
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 ./file1
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
235 ./file1
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
236 ~/learn $ ls dir1
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
237 d1file
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 $ pwd
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
241 /Users/fschmidt/learn
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
242 ~/learn $ cd .
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
243 ~/learn $ pwd
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
244 /Users/fschmidt/learn
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
245 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
246
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
247 <p><code>.</code> is the current directory.</p>
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 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
250 ~/learn $ pwd
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
251 /Users/fschmidt/learn
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
252 ~/learn $ cd dir1
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
253 ~/learn/dir1 $ pwd
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
254 /Users/fschmidt/learn/dir1
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
255 ~/learn/dir1 $ ls .
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
256 d1file
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 dir1 file1 file2 file3
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
259 ~/learn/dir1 $ cd ..
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
260 ~/learn $ pwd
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
261 /Users/fschmidt/learn
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
262 ~/learn $ cd dir1
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
263 ~/learn/dir1 $ pwd
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
264 /Users/fschmidt/learn/dir1
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
265 ~/learn/dir1 $ cd ../..
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
266 ~ $ pwd
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
267 /Users/fschmidt
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
268 ~ $ cd learn
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
269 ~/learn $ pwd
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
270 /Users/fschmidt/learn
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
271 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
272
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
273 <p><code>..</code> is the parent directory.</p>
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 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
276 ~/learn $ echo *
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
277 dir1 file1 file2 file3
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
278 ~/learn $ echo d*
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
279 dir1
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
280 ~/learn $ echo f*
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
281 file1 file2 file3
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
282 ~/learn $ echo *1
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
283 dir1 file1
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
284 ~/learn $ echo dir1/*
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
285 dir1/d1file
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
286 ~/learn $ echo */*
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 qqq*
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
289 qqq*
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
290 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
291
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
292 <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
293
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
294 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
295 ~/learn $ ls *
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
296 file1 file2 file3
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
297
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
298 dir1:
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
299 d1file
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
300 ~/learn $ ls -dF *
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
301 dir1/ file1 file2 file3
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
302 ~/learn $ ls -dF d*
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
303 dir1/
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
304 ~/learn $ ls -dF f*
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
305 file1 file2 file3
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
306 ~/learn $ ls -dF *1
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
307 dir1/ file1
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
308 ~/learn $ ls dir1/*
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
309 dir1/d1file
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
310 ~/learn $ ls */*
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 -dF qqq*
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
313 ls: qqq*: No such file or directory
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
314 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
315
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
316 <p>Should be self-explanatory.</p>
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 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
319 ~/learn $ pwd
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
320 /Users/fschmidt/learn
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
321 ~/learn $ cd ~
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
322 ~ $ pwd
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
323 /Users/fschmidt
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
324 ~ $ cd learn/dir1
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
325 ~/learn/dir1 $ pwd
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
326 /Users/fschmidt/learn/dir1
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
327 ~/learn/dir1 $ cd
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
328 ~ $ pwd
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
329 /Users/fschmidt
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
330 ~ $ cd ~/learn
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
331 ~/learn $ pwd
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
332 /Users/fschmidt/learn
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
333 ~/learn $ echo ~
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
334 /Users/fschmidt
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 .
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 </code>
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 <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
342
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
343 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
344 ~/learn $ ls -ltF
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
345 total 0
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
346 drwxr-xr-x 3 fschmidt staff 96 Jan 5 02:33 dir1/
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
347 -rw-r--r-- 1 fschmidt staff 0 Jan 5 02:21 file3
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
348 -rw-r--r-- 1 fschmidt staff 0 Jan 5 02:21 file2
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
349 -rw-r--r-- 1 fschmidt staff 0 Jan 5 02:21 file1
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
350 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
351
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
352 <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
353
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
354 <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
355
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
356 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
357 ~/learn $ echo file
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
358 file1 file2 file3
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 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
361
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
362 <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
363 ` ,
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
364 },
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
365 files: {
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
366 title: 'Working with Files',
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
367 content: `\
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
368 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
369 ~/learn $ ls -F
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
370 dir1/ file1 file2 file3
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
371 ~/learn $ cp file1 copied
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
372 ~/learn $ ls -F
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
373 copied dir1/ file1 file2 file3
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
374 ~/learn $ mv copied moved
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
375 ~/learn $ ls -F
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
376 dir1/ file1 file2 file3 moved
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
377 ~/learn $ rm moved
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
378 ~/learn $ ls -F
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
379 dir1/ file1 file2 file3
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
380 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
381
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
382 <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
383
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
384 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
385 ~/learn $ ls -F
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
386 dir1/ file1 file2 file3
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
387 ~/learn $ mkdir dir2
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
388 ~/learn $ touch dir2/d2file
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
389 ~/learn $ ls -F
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
390 dir1/ dir2/ file1 file2 file3
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
391 ~/learn $ ls dir2
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
392 d2file
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
393 ~/learn $ rm dir2
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
394 rm: dir2: is a directory
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
395 ~/learn $ rm -d dir2
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
396 rm: dir2: Directory not empty
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
397 ~/learn $ rm dir2/d2file
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
398 ~/learn $ rm -d dir2
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
399 ~/learn $ ls -F
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
400 dir1/ file1 file2 file3
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
401 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
402
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
403 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
404 ~/learn $ ls -F
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
405 dir1/ file1 file2 file3
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
406 ~/learn $ mkdir dir2
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
407 ~/learn $ touch dir2/d2file
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
408 ~/learn $ ls -F
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
409 dir1/ dir2/ file1 file2 file3
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
410 ~/learn $ rm -r dir2
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
411 ~/learn $ ls -F
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
412 dir1/ file1 file2 file3
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
413 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
414
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
415 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
416 ~/learn $ ls -F
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
417 dir1/ file1 file2 file3
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
418 ~/learn $ cp dir1 dir2
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
419 cp: dir1 is a directory (not copied).
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
420 ~/learn $ cp -r dir1 dir2
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
421 ~/learn $ ls -F
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
422 dir1/ dir2/ file1 file2 file3
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
423 ~/learn $ ls dir2
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
424 d1file
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
425 ~/learn $ cp f* dir2
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
426 ~/learn $ ls dir2
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
427 d1file file1 file2 file3
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
428 ~/learn $ rm -r dir2
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
429 ~/learn $ ls -F
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
430 dir1/ file1 file2 file3
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
431 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
432
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
433 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
434 ~/learn $ ls -F
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
435 dir1/ file1 file2 file3
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
436 ~/learn $ mkdir dir2
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
437 ~/learn $ cp -r dir1 dir2
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
438 ~/learn $ ls -F dir2
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
439 dir1/
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
440 ~/learn $ ls -F dir2/dir1
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
441 d1file
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
442 ~/learn $ rm -r dir2
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
443 ~/learn $ ls -F
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
444 dir1/ file1 file2 file3
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
445 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
446
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
447 <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
448 ` ,
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
449 },
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
450 quote: {
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
451 title: 'Quoting',
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
452 content: `\
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
453 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
454 ~/learn $ echo a b
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
455 a b
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" c
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
461 a b c
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
462 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
463
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
464 <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
465
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
466 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
467 ~/learn $ echo a\\ \\ \\ b
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
468 a b
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
469 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
470
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
471 <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
472
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
473 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
474 ~/learn $ echo file*
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
475 file1 file2 file3
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 file*
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 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
481
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
482 <p>Quotes prevent wildcard expansion.</p>
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 },
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
485 vars: {
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
486 title: 'Variables',
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
487 content: `\
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
488 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
489 ~/learn $ echo $X
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
490
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
491 ~/learn $ X="some text"
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
492 ~/learn $ echo $X
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
493 some text
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
494 ~/learn $ echo "X is: $X"
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
495 X is: 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: $X
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
498 ~/learn $ X="$X and more"
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
499 ~/learn $ echo $X
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
500 some text and more
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
501 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
502
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
503 <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
504
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
505 <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
506
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
507 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
508 ~/learn $ echo $PATH
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
509 /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
510 ~/learn $ which ls
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
511 /bin/ls
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
512 ~/learn $ cd /bin
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
513 /bin $ pwd
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
514 /bin
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
515 /bin $ ls
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
516 [ dd launchctl pwd test
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
517 bash df link rm unlink
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
518 cat echo ln rmdir wait4path
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
519 chmod ed ls sh zsh
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
520 cp expr mkdir sleep
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
521 csh hostname mv stty
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
522 dash kill pax sync
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
523 date ksh ps tcsh
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
524 /bin $ ls -F
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
525 [* dd* launchctl* pwd* test*
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
526 bash* df* link* rm* unlink*
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
527 cat* echo* ln* rmdir* wait4path*
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
528 chmod* ed* ls* sh* zsh*
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
529 cp* expr* mkdir* sleep*
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
530 csh* hostname* mv* stty*
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
531 dash* kill* pax* sync*
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
532 date* ksh* ps* tcsh*
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
533 /bin $ cd ~/learn
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
534 ~/learn $
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
535 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
536
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
537 <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
538
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
539 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
540 ~/learn $ subl file1
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
541 -bash: subl: command not found
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
542 ~/learn $ "/Applications/Sublime Text.app/Contents/SharedSupport/bin/subl" file1
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
543 ~/learn $ PATH="$PATH:/Applications/Sublime Text.app/Contents/SharedSupport/bin"
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
544 ~/learn $ echo $PATH
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
545 /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
546 ~/learn $ subl file1
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
547 ~/learn $
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
548 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
549
27
9134d56639ae finish computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents: 26
diff changeset
550 <p>Here I edit the file <code>file1</code> with <a href="computer_literacy.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>
26
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>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
553
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
554 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
555 C:\\Users\\fschmidt>winword
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
556
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
557 C:\\Users\\fschmidt>where winword
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
558 C:\\Program Files\\Microsoft Office\\root\\Office16\\WINWORD.EXE
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
559 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
560
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
561 <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
562
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
563 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
564 ~ $ winword
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
565 bash: winword: command not found
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
566 ~ $ echo $PATH
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
567 /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
568 ~ $ PATH="$PATH:/c/Program Files/Microsoft Office/root/Office16"
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
569 ~ $ echo $PATH
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
570 /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
571 ~ $ winword
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
572 ~ $
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
573 </code>
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 <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
576
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
577 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
578 ~/learn $ open -a 'Sublime Text' file1
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
579 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
580
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
581 <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
582
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
583 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
584 Franklins-MacBook-Pro:learn fschmidt$ echo $PS1
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
585 \\h:\\W \\u\\$
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
586 Franklins-MacBook-Pro:learn fschmidt$ PS1="\\w $ "
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
587 ~/learn $ echo $PS1
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
588 \\w $
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
589 ~/learn $
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
590 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
591
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
592 <p>Google "bash PS1" for more info.</p>
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 },
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
595 bash_profile: {
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
596 title: '.bash_profile',
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
597 content: `\
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
598 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
599 ~/learn $ cd
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
600 ~ $ ls .bash_profile
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
601 .bash_profile
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
602 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
603
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
604 <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
605
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
606 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
607 ~ $ # comment line, does nothing
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
608 ~ $ echo whatever # end of line comment
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
609 whatever
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
610 ~ $
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
611 </code>
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 <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
614
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
615 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
616 ~ $ open -a 'Sublime Text' .bash_profile
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
617 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
618
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
619 <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
620
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
621 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
622 ~ $ notepad .bash_profile
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
623 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
624
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
625 <p>Now try adding this line to <code>.bash_profile</code>:</p>
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 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
628 echo hello there
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
629 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
630
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
631 <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
632
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
633 <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
634 ` ,
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
635 },
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
636 find: {
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
637 title: 'The "find" Command',
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
638 content: `\
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
639 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
640 ~/learn $ find .
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
641 .
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
642 ./file3
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
643 ./file2
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
644 ./file1
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
645 ./dir1
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
646 ./dir1/d1file
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
647 ~/learn $ find . -name 'file*'
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
648 ./file3
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
649 ./file2
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
650 ./file1
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
651 ~/learn $ find . -name '*file'
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
652 ./dir1/d1file
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
653 ~/learn $ find . -name 'd*'
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
654 ./dir1
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
655 ./dir1/d1file
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
656 ~/learn $ find . -name '*1' -or -name '*2'
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
657 ./file2
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
658 ./file1
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
659 ./dir1
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
660 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
661
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
662 <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
663 ` ,
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
664 },
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
665 io: {
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
666 title: 'Input and Output',
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
667 content: `\
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
668 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
669 ~/learn $ echo 'this is a test' >test.txt
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
670 ~/learn $ ls -F
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
671 dir1/ file1 file2 file3 test.txt
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
672 ~/learn $ cat test.txt
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
673 this is a test
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
674 ~/learn $ echo 'this is another test' >test.txt
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
675 ~/learn $ cat test.txt
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
676 this is another test
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
677 ~/learn $ echo 'another line' >>test.txt
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
678 ~/learn $ cat test.txt
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
679 this is another test
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
680 another line
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
681 ~/learn $ cat &lt;test.txt
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
682 this is another test
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
683 another line
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
684 ~/learn $ cat &lt;&lt;End >test.txt
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
685 > I am typing this
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
686 > and this
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
687 > End
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
688 ~/learn $ cat test.txt
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
689 I am typing this
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
690 and this
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
691 ~/learn $ (echo one; echo two) >test.txt
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
692 ~/learn $ cat test.txt
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
693 one
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
694 two
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
695 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
696
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
697 <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
698
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
699 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
700 ~/learn $ ls >ls.txt
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
701 ~/learn $ cat ls.txt
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
702 dir1
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
703 file1
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
704 file2
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
705 file3
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
706 ls.txt
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
707 test.txt
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
708 ~/learn $ ls -d f* q* >ls.txt
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
709 ls: q*: No such file or directory
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
710 ~/learn $ cat ls.txt
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
711 file1
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
712 file2
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
713 file3
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
714 ~/learn $ ls -d f* q* 2>ls.txt
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
715 file1 file2 file3
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
716 ~/learn $ cat ls.txt
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
717 ls: q*: No such file or directory
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
718 ~/learn $ ls -d f* q* | tee 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 file1
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
721 file2
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
722 file3
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
723 ~/learn $ cat ls.txt
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
724 file1
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
725 file2
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
726 file3
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
727 ~/learn $ ls -d f* q* 2>&1 | tee ls.txt
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
728 ls: q*: No such file or directory
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
729 file1
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
730 file2
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
731 file3
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
732 ~/learn $ cat ls.txt
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
733 ls: q*: No such file or directory
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
734 file1
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
735 file2
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
736 file3
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
737 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
738
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
739 <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
740
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
741 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
742 ~/learn $ find . -type f | wc -l
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
743 6
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
744 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
745
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
746 <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
747 ` ,
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
748 },
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
749 ctrl: {
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
750 title: 'Control Keys',
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
751 content: `\
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
752 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
753 ~/learn $ sleep 3
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
754 ~/learn $ sleep 30
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
755 ^C
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
756 ~/learn $
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
757 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
758
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
759 <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
760
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
761 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
762 ~/learn $ wc
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
763 I am typing this
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
764 and this
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
765 now I will end my input with control+d
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
766 3 14 65
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
767 ~/learn $ wc
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
768 this time I will use control+c to break out
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
769 ^C
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
770 ~/learn $
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
771 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
772
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
773 <p>Control+d means end of input.</p>
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 },
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
776 subst: {
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
777 title: 'Command Substitution',
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
778 content: `\
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
779 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
780 ~/learn $ echo I am in $(pwd)
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
781 I am in /Users/fschmidt/learn
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
782 ~/learn $ echo this directory contains: $(ls)
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
783 this directory contains: dir1 file1 file2 file3 ls.txt test.txt
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
784 ~/learn $ echo this directory contains $(ls | wc -l) files
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
785 this directory contains 6 files
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
786 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
787
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
788 <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
789
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
790 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
791 ~/learn $ cat $(find . -type f) | wc -c
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
792 86
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
793 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
794
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
795 <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
796 ` ,
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
797 },
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
798 ampersand: {
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
799 title: 'Ampersand',
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
800 content: `\
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
801 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
802 ~/learn $ (sleep 5; echo done) &
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
803 [1] 10080
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
804 ~/learn $ echo waiting
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
805 waiting
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
806 ~/learn $ done
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
807
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
808 [1]+ Done ( sleep 5; echo done )
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
809 ~/learn $
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
810 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
811
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
812 <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
813
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
814 <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
815
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
816 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
817 ~ $ notepad
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
818 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
819
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
820 <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
821
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
822 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
823 ~ $ notepad &
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
824 [1] 2010
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
825 ~ $
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
826 </code>
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 <p>Now Notepad will run and you can continue using Bash.</p>
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 },
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
831 scripts: {
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
832 title: 'Shell Scripts',
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
833 content: `\
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
834 <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
835
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
836 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
837 echo this is a shell script
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
838 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
839
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
840 <p>Now from Bash:</p>
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 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
843 ~/learn $ cat test.sh
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
844 echo this is a shell script
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
845 ~/learn $ ./test.sh
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
846 -bash: ./test.sh: Permission denied
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
847 ~/learn $ ls -F test.sh
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
848 test.sh
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
849 ~/learn $ chmod +x test.sh
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
850 ~/learn $ ls -F test.sh
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
851 test.sh*
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
852 ~/learn $ ./test.sh
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
853 this is a shell script
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
854 ~/learn $
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
855 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
856
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
857 <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
858
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
859 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
860 ~/learn $ # edit test.sh
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
861 ~/learn $ cat test.sh
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
862 nonsense
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
863 echo this is a shell script
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
864 ~/learn $ ./test.sh
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
865 ./test.sh: line 1: nonsense: command not found
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
866 this is a shell script
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
867 ~/learn $ # edit test.sh
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
868 ~/learn $ cat test.sh
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
869 set -e
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
870 nonsense
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
871 echo this is a shell script
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
872 ~/learn $ ./test.sh
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
873 ./test.sh: line 2: nonsense: command not found
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
874 ~/learn $
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
875 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
876
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
877 <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
878
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
879 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
880 ~/learn $ X=some
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
881 ~/learn $ echo $X
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
882 some
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
883 ~/learn $ echo $Xthing
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
884
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
885 ~/learn $ echo \${X}thing
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
886 something
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
887 ~/learn $ # edit test.sh
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
888 ~/learn $ cat test.sh
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
889 echo "\\$* = $*"
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
890 echo "\\$# = $#"
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
891 echo "\\$0 = $0"
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
892 echo "\\$1 = $1"
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
893 echo "\\$2 = $2"
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
894 echo "\\$3 = $3"
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
895 echo "\\$4 = $4"
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
896 echo "\\$14 = $14"
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
897 echo "\\\${14} = \$\{14}"
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
898 echo "\\$@ = $@"
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
899 ./count.sh "$*"
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
900 ./count.sh "$@"
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
901 ~/learn $ ./test.sh a b "c d"
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
902 $* = a b c d
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
903 $# = 3
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
904 $0 = ./test.sh
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
905 $1 = a
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
906 $2 = b
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
907 $3 = c d
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
908 $4 =
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
909 $14 = a4
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
910 \${14} =
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
911 $@ = a b c d
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
912 1
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
913 3
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
914 ~/learn $ cat count.sh
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
915 echo $#
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
916 ~/learn $
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
917 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
918
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
919 <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
920 ` ,
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
921 },
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
922 vars_and_scripts: {
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
923 title: 'Variables and Scripts',
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
924 content: `\
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
925 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
926 ~/learn $ X=value
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
927 ~/learn $ echo $X
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
928 value
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
929 ~/learn $ # edit test.sh
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
930 ~/learn $ cat test.sh
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
931 echo "\\$X = $X"
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
932 ~/learn $ ./test.sh
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
933 $X =
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
934 ~/learn $ export X
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
935 ~/learn $ ./test.sh
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
936 $X = value
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
937 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
938
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
939 <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
940
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
941 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
942 ~/learn $ X=terminal
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
943 ~/learn $ echo $X
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
944 terminal
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
945 ~/learn $ # edit test.sh
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
946 ~/learn $ cat test.sh
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
947 X=script
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
948 export X
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
949 ~/learn $ ./test.sh
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
950 ~/learn $ echo $X
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
951 terminal
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
952 ~/learn $ . test.sh
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
953 ~/learn $ echo $X
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
954 script
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
955 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
956
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
957 <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
958
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
959 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
960 ~/learn $ pwd
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
961 /Users/fschmidt/learn
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
962 ~/learn $ # edit test.sh
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
963 ~/learn $ cat test.sh
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
964 cd ~
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
965 ~/learn $ ./test.sh
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
966 ~/learn $ pwd
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
967 /Users/fschmidt/learn
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
968 ~/learn $ . test.sh
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
969 ~ $ pwd
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
970 /Users/fschmidt
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
971 ~ $ cd learn
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
972 ~/learn $
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
973 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
974
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
975 <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
976 ` ,
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
977 },
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
978 your_scripts: {
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
979 title: 'Your Scripts',
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
980 content: `\
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
981 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
982 ~/learn $ echo $PATH
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
983 /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
984 ~/learn $ echo ~/Dropbox/bin
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
985 /Users/fschmidt/Dropbox/bin
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
986 ~/learn $ ls -F ~/Dropbox/bin/e
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
987 /Users/fschmidt/Dropbox/bin/e*
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
988 ~/learn $ cat ~/Dropbox/bin/e
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
989 open -a 'Sublime Text' $*
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
990 ~/learn $ e test.sh
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
991 ~/learn $
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
992 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
993
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
994 <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
995
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
996 <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
997
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
998 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
999 ~/learn $ # edit test.sh
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1000 ~/learn $ cat test.sh
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1001 echo this is a shell script
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1002 ~/learn $ test.sh
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1003 -bash: test.sh: command not found
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 this is a shell script
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1006 ~/learn $
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1007 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1008
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1009 <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
1010 ` ,
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1011 },
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1012 advanced: {
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1013 title: 'Advanced Scripting',
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1014 content: `\
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1015 <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
1016
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1017 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1018 #!/bin/bash
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1019
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1020 set -e
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 if [ $# -ne 1 ]; then
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1023 echo "usage: $0 filename"
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1024 exit 1
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1025 fi
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1026
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1027 FILE="$1"
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1028 NEWDIR=$(basename $FILE .docx)
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1029
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1030 mkdir $NEWDIR
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1031 unzip $FILE -d $NEWDIR
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1032
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1033 export XMLLINT_INDENT=$'\\t'
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1034 for file in $(find $NEWDIR -name "*.xml" -o -name "*.rels"); do
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1035 mv "$file" temp.xml
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1036 xmllint --format temp.xml >"$file"
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1037 done
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1038 rm temp.xml
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1039 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1040
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1041 <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
1042
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1043 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1044 Please explain the Bash "if" statement.
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1045 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1046
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1047 <code block>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1048 Please explain the Bash "for" statement.
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1049 </code>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1050
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1051 <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
1052 ` ,
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1053 },
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1054 conclusion: {
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1055 title: 'Conclusion',
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1056 content: `\
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1057 <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
1058 ` ,
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1059 },
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 </script>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1062 </head>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1063 <body>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1064 <script> header() </script>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1065 <div content>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1066 <h1><a href="bash.html">Bash Tutorial</a></h1>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1067 <hr>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1068 <h2>Contents</h2>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1069 <div toc>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1070 <script> showToc(content) </script>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1071 </div>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1072 <hr>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1073 <script> showContent(content,2) </script>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1074 </div>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1075 </body>
fb87f762847e start computer_literacy
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1076 </html>