MIT-Missing-Semester 01 The Shell
Lee Hero

MIT-Missing Semester

Topic 01: The Shell

什么是 Shell

Shell 是操作系统的最外层,是一个用户跟操作系统之间交互的命令解释器. 它允许“执行程序,输入并获取某种半结构化的输出”. 当可视化界面无法解决问题,调用这些基于命令行或者文本的工具是必要的.

最广泛使用的一种Shell——Bash*(Bourne Again SHell)*

最主要的文本接口:

1
missing:~$
  • 主机名:missing
  • 当前工作目录:~(home)

一些例子:

1
2
missing:~$ date
Fri 10 Jan 2020 11:49:31 AM EST
1
2
3
4
missing:~$ echo hello
hello
missing:~$ echo hello\ world
hello world
  • shell 基于空格分隔命令并解析,然后执行第一个单词代表的程序。如果传递的参数包含空格,需要通过\进行转义。eg. My\ Photos
1
2
3
4
5
6
missing:~$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
missing:~$ which echo
/bin/echo
missing:~$ /bin/echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
  • shell 实际上是个编程环境,具备变量、条件、循环和函数。
  • 当要求 shell 执行某个指令时,会在环境变量 $PATH 下搜索 : 分隔的一系列目录,搜索以你的指令名命名的程序,当找到便执行(若可执行)
  • 确定程序名具体代表哪个程序,可以使用 which 程序
  • 也可以直接指定路径(绝对路径)来执行程序,绕过 $PATH

在 Shell 中导航

绝对路径:能完全确定文件位置的路径,从根目录/文件系统的顶部开始。在 Linux 文件系统中以 / 开头,在 Windows下每个盘有根目录,eg C:\

相对路径:相对于当前工作目录的路径。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
missing:~$ pwd
/home/missing
missing:~$ cd /home
missing:/home$ pwd
/home
missing:/home$ cd ..
missing:/$ pwd
/
missing:/$ cd ./home
missing:/home$ pwd
/home
missing:/home$ cd missing
missing:~$ pwd
/home/missing
missing:~$ ../../bin/echo hello
hello
  • 获取当前工作目录:pwd

  • 切换目录:cd

  • 相对路径表示中:. 当前目录;.. 父目录

  • ~ 扩展到主目录,可以用来写相对路径 eg. cd ~/dev/pdos/classes/missing-semsester

1
2
3
4
5
6
7
8
9
10
11
12
missing:~$ ls
missing:~$ cd ..
missing:/home$ ls
missing
missing:/home$ cd ..
missing:/$ ls
bin
boot
dev
etc
home
...
  • 当前目录文件列表:ls,后面可以接路径
    • eg. ls .. 与分别执行 cd ..ls 显示效果相同。

标记和选项/带有值的标记以 - 开头。

可以通过 -h-help 打印帮助信息;ls -l 可以详细列出目录下文件/文件夹的信息,如:

1
2
missing:~$ ls -l /home
drwxr-xr-x 1 missing users 4096 Jun 15 2019 missing
  • dmissing 是一个目录

  • 后续每三个字符为一组(wxr),分别代表文件/目录于所有者-missing、用户-user 以及其他人在修改-w、执行-x、读取-r 上具有的权限;- 表示不具备对应权限

  • 对于目录而言,x 代表是否被允许进入这个目录

一些有用的命令

  • 重命名/移动文件:mv

  • 拷贝文件:cp

  • 删除文件:rm

    • 删除给定路径下所有内容,使用递归标志 -r
  • 新建文件夹:mkdir

  • 删除空目录:rmdir

  • 查询命令使用手册:manq 退出

在程序之间创建连接

程序两个主要的流:输入流(读取)、输出流(打印)

一般来说,输入输出流都是终端,也就是键盘为输入、显示器为输出。但输入输出流可以重定向

1
2
3
4
5
6
7
8
9
10
11
missing:~$ echo hello > hello.txt
missing:~$ cat hello.txt
hello
missing:~$ cat < hello.txt
hello
missing:~$ cat < hello.txt > hello2.txt
missing:~$ cat hello2.txt
hello
missing:~$ cat < hello.txt >> hello2.txt
missing:~$ cat hello2.txt
hello hello
  • < file> file 可以把程序输入输出分别重定向到指定文件

  • 打印文件内容:cat

  • cat < hello.txt > hello2.txt - 用 hello.txt 作为命令输入,将输出结果写入 hello2.txt。由此实现了 cp 的功能

  • 向一个文件追加内容:>>

1
2
3
4
missing:~$ ls -l / | tail -n1
drwxr-xr-x 1 root root 4096 Jun 20 2019 var
missing:~$ curl --head --silent google.com | grep --ignore-case content-length | cut --delimiter=' ' -f2
219
  • 管道操作符 |:让 | 左边的输出成为 | 右边的输出

更强大的权限

根用户具有几乎一切权限,如果在这样的身份下登录系统,出现错误操作可能造成的破坏性是致命的。取而代之,我们会在需要的时候使用 sudo 命令,临时使用根用户的身份

sysfs 文件写入内容仅允许在根用户身份下进行。它挂载在 /sys

  • 将输入内容写入文件并输出到标准输出:tee
1
2
3
4
5
6
$ sudo find -L /sys/class/backlight -maxdepth 2 -name '*brightness*'
/sys/class/backlight/thinkpad_screen/brightness
$ cd /sys/class/backlight/thinkpad_screen
$ sudo echo 3 > brightness
An error occurred while redirecting file 'brightness'
open: Permission denied

关于 shell,有件事我们必须要知道。|>、和 < 是通过 shell 执行的,而不是被各个程序单独执行。 echo 等程序并不知道 | 的存在,它们只知道从自己的输入输出流中进行读写。 对于上面这种情况, shell (权限为您的当前用户) 在设置 sudo echo 前尝试打开 brightness 文件并写入,但是系统拒绝了 shell 的操作因为此时 shell 不是根用户。

1
$ echo 3 | sudo tee brightness

因为打开 /sys 文件的是 tee 这个程序,并且该程序以 root 权限在运行,因此操作可以进行