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

1
2
cd ~/tmp
mkdir missing

2.用 touch 在 missing 文件夹中新建一个叫 semester 的文件

首先学习了一下touch的用法

作用:修改文件或者目录的时间属性,包括存取时间和更改时间。如果文件不存在,就建立一个新的文件

语法:touch [-acfm][-d<日期时间>][-r<参考文件或目录>] [-t<日期时间>][--help][--version][文件或目录…]

参数说明:

  • a 改变档案的读取时间记录。
  • m 改变档案的修改时间记录.
  • c 假如目的档案不存在,不会建立新的档案。与 --no-create 的效果一样。
  • f 不使用,是为了与其他 unix 系统的相容性而保留。
  • r 使用参考档的时间记录,与 --file 的效果一样。
  • d 设定时间与日期,可以使用各种不同的格式。
  • t 设定档案的时间记录,格式与 date 指令相同。
  • –no-create 不会建立新档案。
  • –help 列出指令格式。
  • –version 列出版本讯息。

实例与运行效果:

实例 运行效果
touch testfile 修改文件"testfile"的时间属性为当前系统时间
touch file 使用指令"touch"时,如果指定的文件不存在,则将创建一个新的空白文件

可以用ls -l来查看时间属性

1
2
cd missing
touch semester

3.将以下内容一行一行地写入 semester 文件:

#!/bin/sh

curl --head --silent https://missing.csail.mit.edu

这个题涉及到转义的问题,如果直接用双引号的话,!在双引号中也有特殊含义,下面详细讲一下shell中的转义问题。

shell中的转义有三种途径:\ ''""

三种转义方法的使用范围

1.\

\的范围是最广的,几乎可以对所有的特殊字符进行转义

2.'

'将会对其所包含的内容不加修饰,转义出来的内容就是所包含的内容,一个字符也不会改变

3.’"’

"的使用范围比'小,"会先将所包含的内容在shell中运行之后再进行输出

例如"tell me the date":这段字符中的date将会被shell运行,替换为当时的日期

此外,shell中的特殊字符都会保留有特殊含义,再显示之前都会对其评估

经以上总结,我们可以简单的写出这题的代码:

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

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

在我们直接在命令行输入.\semester时,我们会得到Permission denied,这是由于权限不够。

在输入ls -l之后,我们得到rw-r--r--,发现没有搜索的权限,所以我们无法运行程序,这时我们需要chmod命令来改变权限

chmod

作用:控制用户对文件的权限的命令

语法:chmod [-cfvR] [--help] [--version] mode file...

参数说明:

  • u 表示该文件的拥有者,g 表示与该文件的拥有者属于同一个群体(group)者,o 表示其他以外的人,a 表示这三者皆是
  • + 表示增加权限、- 表示取消权限、= 表示唯一设定权限
  • r 表示可读取,w 表示可写入,x 表示可执行,X 表示只有当该文件是个子目录或者该文件已经被设定过为可执行
  • -c : 若该文件权限确实已经更改,才显示其更改动作
  • -f : 若该文件权限无法被更改也不要显示错误讯息
  • -v : 显示权限变更的详细资料
  • -R : 对目前目录下的所有文件与子目录进行相同的权限变更(即以递归的方式逐个变更)
  • –help : 显示辅助说明
  • –version : 显示版本

示例

如上面的图片,该变权限实际上就是改变指定区域的字符,改变方式有八进制方式与符号模式。

实例 运行结果
chmod ugo+r file1.txt 将文件 file1.txt 设为所有人皆可读取
chmod a+r file1.txt 将文件 file1.txt 设为所有人皆可读取
chmod -R a+r * 将目前目录下的所有文件与子目录皆设为任何人可读取
chmod 777 file 将该目录对与所有对象的权限都设为rwx

所以解决这一题我们用如下的代码:

1
2
chmod u+x ./semester # 让文件所有者有搜索的权限
./semester # 运行程序

下面解释一下运行代码中第一行的#!/bin/sh

#!被称为Shebang(Hashbang),在文件中存在Shebang的情况下,类Unix操作系统的程序加载器会分析Shebang后的内容,将这些内容作为解释器指令,并调用该指令,并将载有Shebang的文件路径作为该解释器的参数。

所以在这里相当于这句话的作用是调用/bin/sh程序来执行下面的代码

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

1
./semester | grep last-modified > ~/last-modified.txt

借助将管道的输出信息输出给grep,然后grep查找输出中以last-modified开头的信息,然后重定向输出到主文件夹的last-modified.txt