missing semester - The shell
shell如何寻找诸如echo、date的命令?
shell 是一个编程环境,所以它具备变量、条件、循环和函数。在 shell 中执行命令时,实际上是在执行一段 shell 可以解释执行的简短代码。如果用户要求 shell 执行某个指令,但是该指令并不是 shell 所了解的编程关键字,那么它会去查询 环境变量 (environment variable)$PATH
,它会列出当 shell 接到某条指令时,进行程序搜索的路径。
当执行 echo
命令时,shell 了解到需要执行 echo
这个程序,随后它便会在 $PATH
中搜索由 :
所分割的一系列目录,基于名字搜索该程序。当找到该程序时便执行。
确定某个程序名代表的是哪个具体的程序,可以使用 which
程序。
Navigating in the shell
以Linux/Mac OS为例说明文件系统的使用:
路径 /
代表的是系统的根目录。
如果某个路径以 /
开头,那么它是一个 绝对路径。
其他的路径都是 相对路径 。相对路径是指相对于当前工作目录的路径,当前工作目录可以使用 pwd
命令来获取。
切换目录需要使用 cd
命令。
在路径中,.
表示的是当前目录,而 ..
表示上级目录(空目录中也包含.
和..
)。
一般来说,当运行一个程序时,如果没有指定路径,则该程序会在当前目录下执行。
大多数的命令接受标记(Flag)和选项(带有值的标记)(Option),它们以 -
开头,并可以改变程序的行为。通常,在执行程序时使用 -h
或 --help
标记可以打印帮助信息,以便了解有哪些可用的标记或选项。
这个参数可以打印出更加详细地列出目录下文件或文件夹的信息。
第一个字符 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 |
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
- 在
/tmp
下新建一个名为missing
的文件夹。
- 用
man
查看程序touch
的使用手册。
- 用
touch
在missing
文件夹中新建一个叫semester
的文件。
- 将以下内容一行一行地写入
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
做法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
- 尝试执行这个文件。例如,将该脚本的路径(
./semester
)输入到您的shell中并回车。如果程序无法执行,请使用ls
命令来获取信息并理解其不能执行的原因。
- 查看
chmod
的手册(例如,使用man chmod
命令)
- 使用
chmod
命令改变权限,使./semester
能够成功执行
- 使用
|
和>
,将semester
文件输出的最后更改日期信息,写入主目录下的last-modified.txt
的文件中