《MIT缺失的一课》笔记:一、课程概览与 shell
记录
-
课程动机:挖掘现有工具的潜力,探索开发更多工具
-
课程结构:11课时,每个课时关注一个 特定的主题
-
课程主题:The Shell
-
shell是什么:它允许你执行程序,输入并获取某种半结构化的输出
-
使用shell:shell 是一个编程环境,所以它具备变量、条件、循环和函数。当你在 shell 中执行命令时,您实际上是在执行一段 shell 可以解释执行的简短代码。如果你要求 shell 执行某个指令,但是该指令并不是 shell 所了解的编程关键字,那么它会去咨询 环境变量
$PATH
,它会列出当 shell 接到某条指令时,进行程序搜索的路径。当我们执行echo
命令时,shell 了解到需要执行echo
这个程序,随后它便会在$PATH
中搜索由:
所分割的一系列目录,基于名字搜索该程序。当找到该程序时便执行(假定该文件是 可执行程序,后续课程将详细讲解)。确定某个程序名代表的是哪个具体的程序,可以使用which
程序。我们也可以绕过$PATH
,通过直接指定需要执行的程序的路径来执行该程序。 -
在shell中导航:shell 中的路径是一组被分割的目录,在 Linux 和 macOS 上使用
/
分割,而在Windows上是\
。路径/
代表的是系统的根目录,所有的文件夹都包括在这个路径之下,在Windows上每个盘都有一个根目录(例如:C:\
)。 我们假设您在学习本课程时使用的是 Linux 文件系统。如果某个路径以/
开头,那么它是一个 绝对路径,其他的都是 相对路径 。相对路径是指相对于当前工作目录的路径,当前工作目录可以使用pwd
命令来获取。此外,切换目录需要使用cd
命令。在路径中,.
表示的是当前目录,而..
表示上级目录。 -
在程序间创建连接:在 shell 中,程序有两个主要的“流”:它们的输入流和输出流。 当程序尝试读取信息时,它们会从输入流中进行读取,当程序打印信息时,它们会将信息输出到输出流中。 通常,一个程序的输入输出流都是您的终端。也就是,您的键盘作为输入,显示器作为输出。最简单的重定向是
< file
和> file
。这两个命令可以将程序的输入输出流分别重定向到文件。还可以使用>>
来向一个文件追加内容。使用管道( pipes ),我们能够更好的利用文件重定向。操作符|
允许我们将一个程序的输出和另外一个程序的输入连接起来。 -
根用户:对于大多数的类 Unix 系统,有一类用户是非常特殊的,那就是:根用户(root user)。 您应该已经注意到了,在上面的输出结果中,根用户几乎不受任何限制,他可以创建、读取、更新和删除系统中的任何文件。 通常在我们并不会以根用户的身份直接登录系统,因为这样可能会因为某些错误的操作而破坏系统。 取而代之的是我们会在需要的时候使用 sudo 命令。顾名思义,它的作用是让您可以以 su(super user 或 root 的简写)的身份执行一些操作。 当您遇到拒绝访问(permission denied)的错误时,通常是因为此时您必须是根用户才能操作。然而,请再次确认您是真的要执行此操作。有一件事情是您必须作为根用户才能做的,那就是向 sysfs 文件写入内容。系统被挂载在 /sys 下,sysfs 文件则暴露了一些内核(kernel)参数。 因此,您不需要借助任何专用的工具,就可以轻松地在运行期间配置系统内核。注意 Windows 和 macOS 没有这个文件。
简化
-
shell是编程环境
-
shell解析命令程序
-
绝对路径 与 相对路径
-
程序间创建链接
-
根用户
-
命令:
echo
、which
、pwd
、cd
、ls
、mv
、cp
、mkdir
、man
、sudo
、touch
及chmod
讲述
-
shell是一个编程环境,具备变量、条件、循环和函数
-
shell解析命令程序,当在shell中执行命令时,实际在执行shell可以解释执行的简短代码
-
绝对路径以
/
开头,那么它是一个 绝对路径,其他的都是 相对路径 -
程序间创建的链接,如
|
、>
、和<
是通过 shell 执行的,而不是被各个程序单独执行 -
遇到拒绝访问的错误时,通常需使用根用户权限才能执行
-
推荐掌握的命令:
echo
(打印参数)、which
(确定某个程序名代表的是哪个具体的程序)、pwd
(获取当前工作目录的路径)、cd
(切换目录)、ls
(查看指定目录下包含哪些文件)、mv
(用于重命名或移动文件)、cp
(拷贝文件)、mkdir
(新建文件夹)、man
(查询程序参数、输入输出的信息)、sudo
(以 su【super user 或 root 的简写】的身份执行)、touch
(新建文件)及chmod
(改变权限)
思考
1. echo
命令详解
输出指定的字符串或者变量
补充说明
echo命令 用于在shell中打印shell变量的值,或者直接输出指定的字符串。linux的echo命令,在shell编程中极为常用, 在终端下打印变量value的时候也是常常用到的,因此有必要了解下echo的用法echo命令的功能是在显示器上显示一段文字,一般起到一个提示的作用。
语法
echo(选项)(参数)
选项
-e:启用转义字符。
-E: 不启用转义字符(默认)
-n: 结尾不换行
使用-e
选项时,若字符串中出现以下字符,则特别加以处理,而不会将它当成一般文字输出:
\a
发出警告声;\b
删除前一个字符;\c
不产生进一步输出 (\c 后面的字符不会输出);\f
换行但光标仍旧停留在原来的位置;\n
换行且光标移至行首;\r
光标移至行首,但不换行;\t
插入tab;\v
与\f相同;\\
插入\字符;\nnn
插入nnn
(八进制)所代表的ASCII字符;
参数
变量:指定要打印的变量。
实例
/bin/echo Hello, world!
在上面的命令中,两个词(Hello 和 world!)作为单独的参数传递给 echo,并且 echo 按顺序打印它们,用空格分隔
下一个命令产生相同的输出:
/bin/echo 'Hello, World!'
但是,与第一个示例不同,上述命令提供了单引号字符串 'Hello, world!' 作为一个单一的一个参数。
单引号将可靠地保护它免受 shell 解释,将特殊字符和转义序列逐字传递给 echo。
例如,在 bash shell
中,变量名前面有一个美元符号 ($)。 在下一个命令中,引号内的变量名按字面意思处理; 在引号之外,它被转换为它的值。
/bin/echo 'The value of $PATH is' $PATH
# The value of $PATH is
# /home/hope/bin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
用echo命令打印带有色彩的文字:
文字色:
# 这段命令在我的Mac上没有执行成功
echo -e "\e[1;31mThis is red text\e[0m"
This is red text
\e[1;31m
将颜色设置为红色\e[0m
将颜色重新置回
颜色码:重置=0,黑色=30,红色=31,绿色=32,黄色=33,蓝色=34,洋红=35,青色=36,白色=37
# 这段执行成功
echo -e "\x1b[30;1m 0 黑色 \x1b[0m"\
"\x1b[31;1m 1 红色 \x1b[0m"\
"\x1b[32;1m 2 绿色 \x1b[0m"\
"\x1b[33;1m 3 黄色 \x1b[0m"\
"\x1b[34;1m 4 蓝色 \x1b[0m"\
"\x1b[35;1m 5 洋红 \x1b[0m"\
"\x1b[36;1m 6 青色 \x1b[0m"\
"\x1b[37;1m 7 白色 \x1b[0m"
背景色 :
# 这段也没执行成功
echo -e "\e[1;42mGreed Background\e[0m"
Greed Background
颜色码:重置=0,黑色=40,红色=41,绿色=42,黄色=43,蓝色=44,洋红=45,青色=46,白色=47
文字闪动:
# 这段执行成功
echo -e "\033[37;31;5mMySQL Server Stop...\033[39;49;0m"
红色数字处还有其他数字参数:0 关闭所有属性、1 设置高亮度(加粗)、4 下划线、5 闪烁、7 反显、8 消隐
输出内容结尾不添加换行符
echo -n 'hello'
2. touch
命令详解
创建新的空文件
补充说明
touch命令 有两个功能:一是用于把已存在文件的时间标签更新为系统当前的时间(默认方式),它们的数据将原封不动地保留下来;二是用来创建新的空文件。
语法
touch(选项)(参数)
选项
-a:或--time=atime或--time=access或--time=use 只更改存取时间;
-c:或--no-create 不建立任何文件;
-d:<时间日期> 使用指定的日期时间,而非现在的时间;
-f:此参数将忽略不予处理,仅负责解决BSD版本touch指令的兼容性问题;
-m:或--time=mtime或--time=modify 只更该变动时间;
-r:<参考文件或目录> 把指定文件或目录的日期时间,统统设成和参考文件或目录的日期时间相同;
-t:<日期时间> 使用指定的日期时间,而非现在的时间;
--help:在线帮助;
--version:显示版本信息。
参数
文件:指定要设置时间属性的文件列表。
实例
touch ex2
在当前目录下建立一个空文件ex2,然后,利用ls -l
命令可以发现文件ex2的大小为0,表示它是空文件。
批量创建文件
touch file{1..5}.txt
创建 job1.md
文件,并写入 job 1
echo "job 1" > job1.md
3. chmod
命令详解
用来变更文件或目录的权限
概要
chmod [OPTION]... MODE[,MODE]... FILE...
chmod [OPTION]... OCTAL-MODE FILE...
chmod [OPTION]... --reference=RFILE FILE...
主要用途
- 通过符号组合的方式更改目标文件或目录的权限。
- 通过八进制数的方式更改目标文件或目录的权限。
- 通过参考文件的权限来更改目标文件或目录的权限。
参数
mode:八进制数或符号组合。
file:指定要更改权限的一到多个文件。
选项
-c, --changes:当文件的权限更改时输出操作信息。
--no-preserve-root:不将'/'特殊化处理,默认选项。
--preserve-root:不能在根目录下递归操作。
-f, --silent, --quiet:抑制多数错误消息的输出。
-v, --verbose:无论文件是否更改了权限,一律输出操作信息。
--reference=RFILE:使用参考文件或参考目录RFILE的权限来设置目标文件或目录的权限。
-R, --recursive:对目录以及目录下的文件递归执行更改权限操作。
--help:显示帮助信息并退出。
--version:显示版本信息并退出。
返回值
返回状态为成功除非给出了非法选项或非法参数。
例子
参考man chmod
文档的DESCRIPTION
段落得知:
u
符号代表当前用户。g
符号代表和当前用户在同一个组的用户,以下简称组用户。o
符号代表其他用户。a
符号代表所有用户。r
符号代表读权限以及八进制数4
。w
符号代表写权限以及八进制数2
。x
符号代表执行权限以及八进制数1
。X
符号代表如果目标文件是可执行文件或目录,可给其设置可执行权限。s
符号代表设置权限suid和sgid,使用权限组合u+s
设定文件的用户的ID位,g+s
设置组用户ID位。t
符号代表只有目录或文件的所有者才可以删除目录下的文件。+
符号代表添加目标用户相应的权限。-
符号代表删除目标用户相应的权限。=
符号代表添加目标用户相应的权限,删除未提到的权限。
linux文件的用户权限说明:
# 查看当前目录(包含隐藏文件)的长格式。
ls -la
-rw-r--r-- 1 user staff 651 Oct 12 12:53 .gitmodules
# 第1位如果是d则代表目录,是-则代表普通文件。
# 更多详情请参阅info coreutils 'ls invocation'(ls命令的info文档)的'-l'选项部分。
# 第2到4位代表当前用户的权限。
# 第5到7位代表组用户的权限。
# 第8到10位代表其他用户的权限。
# 添加组用户的写权限。
chmod g+w ./test.log
# 删除其他用户的所有权限。
chmod o= ./test.log
# 使得所有用户都没有写权限。
chmod a-w ./test.log
# 当前用户具有所有权限,组用户有读写权限,其他用户只有读权限。
chmod u=rwx, g=rw, o=r ./test.log
# 等价的八进制数表示:
chmod 764 ./test.log
# 将目录以及目录下的文件都设置为所有用户拥有读写权限。
# 注意,使用'-R'选项一定要保留当前用户的执行和读取权限,否则会报错!
chmod -R a=rw ./testdir/
# 根据其他文件的权限设置文件权限。
chmod --reference=./1.log ./test.log
注意
-
该命令是
GNU coreutils
包中的命令,相关的帮助信息请查看man chmod
或info coreutils 'chmod invocation'
。 -
符号连接的权限无法变更,如果用户对符号连接修改权限,其改变会作用在被连接的原始文件。
-
使用
-R
选项一定要保留当前用户的执行和读取权限,否则会报错!
复习
- 掌握
echo
、touch
、chmod
等命令 - 回顾原文示例代码
- 动手写写