【Missing Semester】01 课程概览与Shell
本文为计算机教育中缺失的一课 The Missing Semester of Your CS Education 笔记
Shell
Shell 是什么:
- Shell(计算机壳层)。
- “为使用者提供操作界面” 的软件(command interpreter,命令解析器)。
- 接收用户命令,然后调用相应的应用程序。
Shell 的种类:
-
zsh:很多人的 Mac 中会使用 zsh 而不是 bash,一大半是因为 oh-my-zsh 这个配置集。兼容 bash,有自动补全等好用的功能。
-
sh:全称 Bourne shell,由 AT&T 公司的 Steve Bourne开发。sh 是 UNIX 上的标准 shell,很多 UNIX 版本都配有 sh,是第一个流行的 shell。
-
csh:sh 之后另一个广为流传的 shell,由柏克莱大学的 Bill Joy 设计的,语法有点类似 C 语言,所以才得名为 C shell ,简称为 csh。
-
tcsh:tcsh 是 csh 的增强版,加入了命令补全功能,提供了更加强大的语法支持。
-
ash:一个简单的轻量级的 Shell,占用资源少,适合运行于低内存环境,与 bash 完全兼容。
-
bash:由 GNU 组织开发,保持了对 sh 的兼容性,是各种 Linux 发行版默认配置的 shell。
终端
打开终端的几种方法(Mac):
- 启动台 - 其它 - 终端。
- 选择一个文件夹 - 右键 - 新建位于文件夹位置的终端窗口。
- 选择一个文件夹 -
Option
+Command
+X
(自定义快捷键)。- 系统偏好设置 - 键盘 - 快捷键 - 服务 - 文件和文件夹 - 新建位于文件夹位置的终端窗口。
终端样式设置:
第一个命令:
echo
:打印。date
:显示系统时间。cat
:打印文件内容。
bogon:Missing Semester wangxinyuan$ echo "Hello World"
Hello World
bogon:Missing Semester wangxinyuan$ date
2022年 2月17日 星期四 10时55分59秒 CST
# 查看当前使用的Shell
bogon:Missing Semester wangxinyuan$ echo $SHELL
/bin/bash
# 查看安装的Shell
bogon:Missing Semester wangxinyuan$ cat /etc/shells
# List of acceptable shells for chpass(1).
# Ftpd will not allow users to connect who are not using
# one of these shells.
/bin/bash
/bin/csh
/bin/ksh
/bin/sh
/bin/tcsh
/bin/zsh
命令是如何执行的:
- 当你在 Shell 中执行命令时,实际上是在执行一段 Shell 可以解释执行的简短代码。如果你要求 Shell 执行某个指令,但是该指令并不是 Shell 所了解的编程关键字,那么它会去咨询环境变量
$PATH
,它会列出当 Shell 接到某条指令时,进行程序搜索的路径。
bogon:Missing Semester wangxinyuan$ echo $PATH
/usr/local/opt/ruby/bin:/usr/local/lib/ruby/gems/3.0.0/bin:/usr/local/opt/ruby/bin:/usr/local/lib/ruby/gems/3.0.0/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/Frameworks/Mono.framework/Versions/Current/Commands
# 定位echo
bogon:Missing Semester wangxinyuan$ which echo
/bin/echo
bogon:Missing Semester wangxinyuan$ which ruby
/usr/bin/ruby
# 等价于echo “Hello World”
bogon:Missing Semester wangxinyuan$ /bin/echo "Hello World"
Hello World
文件
路径:
pwd
:显示当前工作目录。cd
:切换工作目录。.
表示当前目录。..
表示上级目录。cd ~
或cd
:Go to the home directory of the current user。cd -
:Go to the previously chosen directory。- 如果某个路径以
/
开头,那么它是一个绝对路径,其他的都是相对路径 。
ls
:查看指定目录下包含哪些文件。ls -l
得到的长格式文件和目录信息中,三组rwx
依次代表拥有者、所属组、其他人的权限;对于目录,r
代表是否可以查看目录里面的内容,w
代表是否可以在目录里创建、删除、重命名文件,w
代表是否可以进入这个目录。
bogon:Missing Semester wangxinyuan$ pwd
/Users/wangxinyuan/Desktop/Missing Semester
# 绝对路径
bogon:Missing Semester wangxinyuan$ cd /Users/wangxinyuan/Desktop
# .
bogon:Desktop wangxinyuan$ cd ./Missing\ Semester
# ..
bogon:Missing Semester wangxinyuan$ cd ..
# 相对路径
bogon:Desktop wangxinyuan$ cd "Missing Semester"
# previously
bogon:Missing Semester wangxinyuan$ cd -
/Users/wangxinyuan/Desktop
# home
bogon:Desktop wangxinyuan$ cd
bogon:~ wangxinyuan$ ls
Applications Library Pictures a.out bt.plist
Desktop Movies Public ap.plist history.plist
Documents Music PycharmProjects apps.plist
Downloads OneDrive Users brew_install
一些文件操作命令:
mkdir
:新建文件夹。touch
:新建文件或更改文件访问修改时间。rm
:删除文件或文件夹。mv
:移动或重命名文件或文件夹。cp
:拷贝文件或文件夹。
# 在当前文件夹创建"名未命文件夹"
bogon:tmp wangxinyuan$ mkdir 名未命文件夹
# 在"名未命文件夹"中新建"笔记文件"
bogon:tmp wangxinyuan$ touch ./名未命文件夹/笔记.txt
# 删除"名未命文件夹"中"笔记文件"
bogon:tmp wangxinyuan$ rm ./名未命文件夹/笔记.txt
# 删除"名未命文件夹"
bogon:tmp wangxinyuan$ rm -r 名未命文件夹
# 将"missing文件夹"中"semester.txt文件"移动到"名未命文件夹"
bogon:tmp wangxinyuan$ mv missing/semester.txt 名未命文件夹
# 将"名未命文件夹"文件夹中"semester.txt文件"移动到"missing文件夹"并重命名为"hhh.txt"
bogon:tmp wangxinyuan$ mv 名未命文件夹/semester.txt missing/hhh.txt
# 将"missing文件夹"中"hhh.txt文件"复制到"名未命文件夹"
bogon:tmp wangxinyuan$ cp missing/hhh.txt 名未命文件夹
查看帮助信息:
man 程序名
,如man ls
,按下键盘q
退出。- 一个神秘网站:>tldr_
流
流:
- 标准输入:
stdin
,由 \(0\) 表示。 - 标准输出:
stdout
,由 \(1\) 表示。 - 标准错误:
stderr
,由 \(2\) 表示。
流的重定向:
< file
:将程序的输入流重定向到文件。> file
:将程序的输出流重定向到文件。- 三种流可以同时重定向。
- 例:
echo hhh 1> output.txt 2> err.txt
。
>
与 >>
:
- 当 out.txt 不存在时,
>
与>>
都会默认创建 out.txt,并将Hello World
保存到 out.txt 中。 - 当 out.txt 存在时,
>
会将 out.txt 中的内容清空,并将Hello World
存入;而>>
会将Hello World
追加保存到 out.txt 的末尾。
bogon:tmp wangxinyuan$ echo "Hello World" > out.txt
bogon:tmp wangxinyuan$ cat out.txt
Hello World
# out.txt中内容如下
# Hello World
bogon:tmp wangxinyuan$ echo "Hello WXY" >> out.txt
# out.txt中内容如下
# Hello World
# Hello WXY
bogon:tmp wangxinyuan$ echo "hhh" > out.txt
# out.txt中内容如下
# hhh
|
操作符:
- 将一个程序的输出和另外一个程序的输入连接起来。
bogon:tmp wangxinyuan$ ls -l
total 8
drwxr-xr-x 3 wangxinyuan staff 96 2 17 14:25 missing
-rw-r--r--@ 1 wangxinyuan staff 251 2 17 14:44 out.txt
drwxr-xr-x 4 wangxinyuan staff 128 2 17 14:27 名未命文件夹
bogon:tmp wangxinyuan$ ls -l | tail -n1
drwxr-xr-x 4 wangxinyuan staff 128 2 17 14:27 名未命文件夹
根用户
-
根用户(root user)几乎不受任何限制,他可以创建、读取、更新和删除系统中的任何文件。
-
sudo
命令:以根用户的身份执行一些操作。
课后练习
5 ~ 8 题:
# 创建exercise
bogon:tmp wangxinyuan$ touch exercise
# 写入exercise
bogon:tmp wangxinyuan$ echo '#!/bin/sh' >> exercise
bogon:tmp wangxinyuan$ echo "curl --head --silent https://baidu.com" >> exercise
# 打印exercise内容
bogon:tmp wangxinyuan$ cat exercise
#!/bin/sh
curl --head --silent https://baidu.com
# 使用./exercise执行exercise,失败
bogon:tmp wangxinyuan$ ./exercise
-bash: ./exercise: Permission denied
# 使用sh执行exercise
bogon:tmp wangxinyuan$ sh exercise
HTTP/1.1 302 Moved Temporarily
Server: bfe/1.0.8.18
Date: Thu, 17 Feb 2022 07:20:58 GMT
Content-Type: text/html
Content-Length: 161
Connection: keep-alive
Location: http://www.baidu.com/
# 失败原因:没有执行权限
bogon:tmp wangxinyuan$ ls -l exercise
-rw-r--r-- 1 wangxinyuan staff 49 2 17 15:20 exercise
# 使用chmod修改权限
bogon:tmp wangxinyuan$ chmod a+rx exercise
bogon:tmp wangxinyuan$ ls -l exercise
-rwxr-xr-x 1 wangxinyuan staff 49 2 17 15:20 exercise
# 使用./exercise执行exercise,成功
bogon:tmp wangxinyuan$ ./exercise
HTTP/1.1 302 Moved Temporarily
Server: bfe/1.0.8.18
Date: Thu, 17 Feb 2022 07:21:56 GMT
Content-Type: text/html
Content-Length: 161
Connection: keep-alive
Location: http://www.baidu.com/