实用的工具—shell

shell基础操作

参考课程:Missing Semester IAP 2020 Lecture 1: Course Overview + The Shell (2020)

image-20220628105449874

在这里,我们执行了程序,该程序打印当前日期和时间。

我们还可以执行带有参数的命令:

image-20220628120939299

在本例中,我们告诉 shell 使用参数执行程序。该程序只是打印出其参数。

shell 通过按空格拆分命令来解析命令,然后运行第一个单词指示的程序,将每个后续单词作为程序可以访问的参数提供。如果要提供包含空格或其他特殊字符的参数,则可以使用() 引用参数,或者仅使用() 转义相关字符。

shell是一个编程环境,就像Python或Ruby一样,所以它有变量,条件,循环和函数。

当在 shell 中运行命令时,实际上是在编写一小段代码,供 shell 解释。如果要求 shell 执行与其编程关键字之一不匹配的命令,它将查阅一个名为PATH的环境变量,该变量列出了在收到命令时 shell 应搜索哪些目录的程序:

image-20220628105521590

当我们运行该命令时,shell 看到它应该执行程序,然后在目录列表中搜索该名称的文件。当它找到它时,shell会运行它。

我们可以使用该程序找出为给定程序名称执行的文件。我们还可以通过提供要执行的文件的路径来完全绕过。

image-20220628121403128

在Linux和macOS上,路径是文件系统的“根”。使用pwd命令可以显示当前位置。

image-20220628121457768

使用...检索echo指令,并使用检索出的指令输出结果:

image-20220628110239266

通常,当我们运行程序时,它将在当前目录中运行,除非我们另有说明。例如,它通常会在那里搜索文件,并在需要时在那里创建新文件。

要查看给定目录中的内容,我们使用以下命令:ls

image-20220628110858370

image-20220628111154051

image-20220628111239969

可以使用--help查询对应指令的使用帮助:

image-20220628111434655

image-20220628113009178

  • mv将文件进行移动(文件名可以重新修改,同时原文件会删除)
  • cp将文件进行复制移动(文件名可以重新修改,同时原文件不会删除)
  • rm将文件进行删除(需要满足对应权限)

image-20220628112941489

  • mkdir指令用于创建文件夹,可以看到在创建过程中,如果文件夹名称中有空格,则需要使用转义符,如果直接输入空格会默认表示创建两个文件夹。

image-20220628113301679

一个快捷方式:ctrl+L可以清楚shell界面

在 shell 中,程序有两个与之关联的主要“流”:它们的输入流和输出流。当程序尝试读取输入时,它会从输入流中读取,当它打印某些内容时,它会打印到其输出流。通常,程序的输入和输出都是您的终端。也就是说,键盘作为输入,屏幕作为输出。

但是,我们也可以重新连接这些流!

image-20220628114346774

1
2
3
4
5
6
7
8
9
10
11
12
missing:~$ echo hello > hello.txt   #使用echo将hello输入hello.txt文件中
missing:~$ cat hello.txt #打印hello.txt中的内容
hello
missing:~$ cat < hello.txt #打印hello.txt中的内容
hello
missing:~$ cat < hello.txt > hello2.txt
#打印hello.txt中的内容到hello2.txt(覆盖打印,上面的截图中有证明这一点)
missing:~$ cat hello2.txt
hello

missing:~$ cat < hello.txt >> hello2.txt
#使用>>不进行覆盖

这种输入/输出重定向真正优秀的地方在于管道的使用。运算符|允许“链接”程序,使得一个程序的输出是另一个程序的输入:

image-20220628115018555

1
2
3
4
ls -l / | tail -n1 > ls.txt
#ls -l 显示文件的详细信息
#tail -n1 显示最后一行(通过管道链接)
#ls.txt 写入ls.txt文件中

另一个有趣的例子:

image-20220628115300810

1
2
3
4
curl --head --silent google.com | grep --ignore-case content-length | cut --delimiter=' ' -f2
#curl --head --silent google.com:打印对应的HTTP头
#grep --ignore-case content-length:搜索对应的字段
#cut --delimiter=' ' -f2:使用分隔符进行分割

在大多数类Unix系统上,一个用户是特殊的:“root”用户。您可能已经在上面的文件列表中看到了它。root用户高于所有访问限制,并且可以创建、读取、更新和删除系统中的任何文件。但是,您通常不会以root用户身份登录系统,因为不小心破坏某些东西太容易了。相反,您将使用该命令。顾名思义,它允许您sudo或者su做某些事情。当您收到权限被拒绝错误时,通常是因为您需要以root身份执行某些操作。虽然确保你首先仔细检查你真的想这样做!

/sys将许多内核参数公开为文件,以便您可以轻松地动态重新配置内核,而无需专门的工具。

image-20220628115816599

例如,笔记本电脑屏幕的亮度通过名为brightness

1
2
3
4
/sys/class/backlight
$ sudo find -L /sys/class/backlight -maxdepth 2 -name '*brightness*'
$ cd /sys/class/backlight/thinkpad_screen
$ sudo echo 3 > brightness

image-20220628120218923