missing semester - The shell

shell如何寻找诸如echo、date的命令?

shell 是一个编程环境,所以它具备变量、条件、循环和函数。在 shell 中执行命令时,实际上是在执行一段 shell 可以解释执行的简短代码。如果用户要求 shell 执行某个指令,但是该指令并不是 shell 所了解的编程关键字,那么它会去查询 环境变量environment variable$PATH,它会列出当 shell 接到某条指令时,进行程序搜索的路径。

当执行 echo 命令时,shell 了解到需要执行 echo 这个程序,随后它便会在 $PATH 中搜索由 : 所分割的一系列目录,基于名字搜索该程序。当找到该程序时便执行。

确定某个程序名代表的是哪个具体的程序,可以使用 which 程序。

image-20210919163039892

以Linux/Mac OS为例说明文件系统的使用:

路径 / 代表的是系统的根目录。

如果某个路径以 / 开头,那么它是一个 绝对路径

其他的路径都是 相对路径 。相对路径是指相对于当前工作目录的路径,当前工作目录可以使用 pwd 命令来获取。

切换目录需要使用 cd 命令。

在路径中,. 表示的是当前目录,而 .. 表示上级目录(空目录中也包含... )。

一般来说,当运行一个程序时,如果没有指定路径,则该程序会在当前目录下执行。

大多数的命令接受标记(Flag)和选项(带有值的标记)(Option),它们以 - 开头,并可以改变程序的行为。通常,在执行程序时使用 -h--help 标记可以打印帮助信息,以便了解有哪些可用的标记或选项。

image-20210919164243174

这个参数可以打印出更加详细地列出目录下文件或文件夹的信息。

第一个字符 d 表示 missing 是一个目录。

然后接下来的九个字符,每三个字符构成一组(rwx)。它们分别代表了文件所有者(missing),用户组(users) 以及其他所有人具有的权限。其中 - 表示该用户不具备相应的权限。

为了进入某个文件夹,用户需要具备该文件夹以及其父文件夹的“搜索”权限(以“可执行”:x)权限表示。

为了列出它的包含的内容,用户必须对该文件夹具备读权限(r)。

命令 完成动作 注意事项
pwd 打印当前工作目录
cd 切换目录 cd -: 切换空间
ls 查看指定目录下包含哪些文件
mv 重命名或移动文件 source->dest
cp 拷贝文件 source->dest
rm 删除文件 删除文件夹需要使用-r(递归)标记
mkdir 新建文件夹 空格间隔会创建多个文件夹
rmdir 删除文件夹 只能删除空文件夹

Connecting programs

在 shell 中,程序有两个主要的“流”:

  • 输入流:当程序尝试读取信息时,它们会从输入流中进行读取。
  • 输出流:当程序打印信息时,它们会将信息输出到输出流中。

通常,一个程序的输入输出流都是终端(程序会默认打开0-2三个fd表示输入、输出、错误)。

符号 动作
< file1 重定向file1至输入流
> file2 重定向file2至输出流
>> file3 向一个文件追加内容
command1 ` ` command2

image-20210919173634035

A versatile and powerful tool

对于大多数的类 Unix 系统,根用户(root user)是非常特殊的。

根用户几乎不受任何限制,他可以创建、读取、更新和删除系统中的任何文件。

通常在我们并不会以根用户的身份直接登录系统,因为这样可能会因为某些错误的操作而破坏系统。 在需要的时候使用 sudo 命令。顾名思义,它的作用是可以以 su(super user 或 root 的简写)的身份执行一些操作。 当遇到拒绝访问(permission denied)的错误时,通常是因为此时必须是根用户才能操作。

对于|>、和 <,需要注意一点,sudo需要加在对应程序前(修改显示器亮度,前者不行,后者可以,tee用于读取标准输入的数据,并将其内容输出成文件)。

$ sudo echo 3 > brightness
An error occurred while redirecting file 'brightness'
open: Permission denied

$ echo 3 | sudo tee brightness

Exercises

  1. /tmp 下新建一个名为 missing 的文件夹。

image-20210919184918711

  1. man 查看程序 touch 的使用手册。

image-20210919185026503

  1. touchmissing 文件夹中新建一个叫 semester 的文件。

image-20210919185011466

  1. 将以下内容一行一行地写入 semester 文件:
#!/bin/sh
curl --head --silent https://missing.csail.mit.edu

做法1:(\代表转义)

echo \#\!/bin/sh > semester
echo "curl --head --silent https://missing.csail.mit.edu" >> semester

image-20210919185355332

做法2:(用单引号括住字符(" ')保留了引号内每个字符的文字值)

Enclosing characters in single quotes (‘'’) preserves the literal value of each character within the quotes. A single quote may not occur between single quotes, even when preceded by a backslash.

echo '#!/bin/sh' > semester
echo "curl --head --silent https://missing.csail.mit.edu" >> semester

image-20210919185703703

  1. 尝试执行这个文件。例如,将该脚本的路径(./semester)输入到您的shell中并回车。如果程序无法执行,请使用 ls 命令来获取信息并理解其不能执行的原因。

image-20210919190119200

  1. 查看 chmod 的手册(例如,使用 man chmod 命令)

image-20210919190206549

  1. 使用 chmod 命令改变权限,使 ./semester 能够成功执行

image-20210919190655870

  1. 使用 |> ,将 semester 文件输出的最后更改日期信息,写入主目录下的 last-modified.txt 的文件中

image-20210919190916787

posted @ 2021-09-19 17:57  zju_cxl  阅读(689)  评论(0编辑  收藏  举报