MIT2020补习班——(一)Shell

课程地址:https://missing.csail.mit.edu/

课程概况

据介绍,设立该项课程的目的是为了帮助学生了解成为数据科学家和开发者的所有重要主题,但是具体内容是学生平时在课堂中学不到的。本课程非常实用,重点在于其中的实践。课程包括了各种工具的上手介绍——这些工具在开发过程中出现的频率很高,如命令行、git 等。

开课时间是今年的一月份,面向的主要是 MIT 的学生,但是课程资料会通过视频的方式开源给大众。大家可以通过上面的课程地址找到相应的视频和文字资料。

什么是Shell

现在的计算机有各种各样的界面来给它们发出命令;各种各样的图形用户界面、语音界面,甚至AR/VR也随处可见。对于80%的用例来说,这些都是很好的,但是它们通常在允许你做的事情上受到根本的限制——你不能按下一个不存在的按钮或者发出一个没有编程的语音命令。为了充分利用您的计算机提供的工具,我们需要Shell。

几乎所有你可以使用的平台都有这样或那样的shell。虽然它们在细节上可能有所不同,但它们的核心都大致相同:它们允许您以半结构化的方式运行程序、提供输入和检查输出。

在这堂课中,我们将再次关注伯恩贝壳Bourne Again SHell,简称“BASH”。这是最广泛使用的shell之一,其语法与您在许多其他shell中看到的类似。

使用Shell

当您启动终端时,您将看到一个提示,通常看起来有点像这样:

missing:~$ 

这是shell的主要文本接口。它告诉你你在机器missing上,你的“当前工作目录”,或者你现在所在的位置,是~(home的缩写)。$告诉您您不是根用户root(稍后将详细介绍)。在这个提示下,您可以键入一个命令,然后由shell解释该命令。最基本的命令是执行程序:

missing:~$ date
Fri 10 Jan 2020 11:49:31 AM EST
missing:~$ 

在这里,我们执行了date程序,它打印当前的日期和时间。然后shell要求我们执行另一个命令。我们还可以执行带参数的命令:

missing:~$ echo hello
hello

在本例中,我们告诉shell使用参数hello执行程序echo。echo程序只是打印出它的参数。shell通过将命令拆分为空白来进行解析,然后运行由第一个单词指示的程序,将每个后续单词作为程序可以访问的参数提供。如果要提供包含空格或其他特殊字符的参数(例如,名为“My Photos”的目录),可以用“My Photos”)引用该参数,也可以只用\My\ Photos)转义相关字符。

但是shell如何知道如何找到日期或echo程序呢?好吧,shell是一个编程环境,就像Python或Ruby一样,所以它有变量、条件、循环和函数。在shell中运行命令时,实际上是在编写一小段shell解释的代码。如果要求shell执行与其某个编程关键字不匹配的命令,它将引用一个名为$PATH的环境变量,该变量列出给定命令时shell应搜索的程序目录:

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

当我们运行echo命令时,shell看到它应该执行程序echo,然后在$PATH中的目录的-分隔列表中搜索该名称的文件。当它找到它时,它会运行它。我们可以使用哪个程序找出对给定程序名执行的文件。我们还可以通过提供要执行的文件的路径来完全绕过$PATH。

在Shell中导航

shell上的路径是一个分隔的目录列表;在Linux和macOS上用/分隔,在Windows上用\分隔。在Linux和macOS上,path/是文件系统的“根”,所有目录和文件都位于该系统下,而在Windows上,每个磁盘分区有一个根(例如C:\)。我们通常假设您在这个类中使用的是Linux文件系统。以/开头的路径称为绝对路径。任何其他路径都是相对路径。相对路径是相对于当前工作目录的,我们可以使用pwd命令查看该目录,并使用cd命令进行更改。

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

注意,shell提示符让我们知道当前的工作目录是什么。您可以将提示配置为向您显示各种有用的信息,我们将在以后的课程中介绍这些信息。

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

要查看给定目录中的内容,请使用ls命令:

missing:~$ ls
missing:~$ cd ..
missing:/home$ ls
missing
missing:/home$ cd ..
missing:/$ ls
bin
boot
dev
etc
home

除非给定一个目录作为其第一个参数,否则ls将打印当前目录的内容。大多数命令接受以-开头的标志和选项(带值的标志)来修改它们的行为。通常,运行带有-h或–help标志(/?在Windows上)将打印一些帮助文本,告诉您可用的标志和选项。

missing:~$ ls -l /home
drwxr-xr-x 1 missing  users  4096 Jun 15  2019 missing

这将为我们提供有关每个文件或目录的更多信息。首先,行开头的d告诉我们missing是一个目录。然后跟着三组三个字符(rwx)。这些指示文件所有者(missing)、所属组(user)和其他所有人分别对相关项拥有哪些权限。-表示给定主体没有给定权限。上面,只允许所有者修改(w)丢失的目录(即在其中添加/删除文件)。要输入目录,用户必须对该目录(及其父目录)具有“搜索”(用x表示)权限。要列出其内容,用户必须对该目录具有读取(r)权限。对于文件,权限与您预期的一样。注意/bin中的几乎所有文件都为最后一个组“everyone else”设置了x权限,以便任何人都可以执行这些程序。

在这一点上,还需要了解一些其他方便的程序:mv(重命名/移动文件)、cp(复制文件)和mkdir(创建新目录)。

如果你想知道更多关于程序的参数、输入、输出,或者它通常是如何工作的信息,可以试试man程序。它接受程序名作为参数,并向您显示其手册页。按Q退出。

missing:~$ man ls

连接程序

在shell中,程序有两个与它们相关联的主要“流”:它们的输入流和输出流。当程序试图读取输入时,它从输入流中读取,当它打印某些内容时,它打印到输出流中。通常,程序的输入和输出都是你的终端。也就是说,键盘作为输入,屏幕作为输出。但是,我们也可以重新连接这些流!

最简单的重定向形式是<file>file。它们允许您将程序的输入流和输出流分别重新连接到文件:

缺少:~$echo hello>hello.txt

缺少:~$cat hello.txt

你好

缺少:~$cat<hello.txt

你好

缺少:~$cat<hello.txt>hello2.txt

缺少:~$cat hello2.txt

你好

您也可以使用>>附加到文件。这种输入/输出重定向的真正亮点在于管道的使用。|运算符允许您“链接”程序,以便一个程序的输出是另一个程序的输入:

缺少:~$ls-l/|尾部-n1

drwxr-xr-x 1根4096 2019年6月20日var

缺少:~$curl--head--silent google.com | grep--ignore case content length | cut--delimiter=''-f2

219个

功能强大的工具

在大多数类Unix系统中,有一个用户是特殊的:“根”用户。您可能已经在上面的文件列表中看到了它。根用户超过(几乎)所有访问限制,可以创建、读取、更新和删除系统中的任何文件。但是,您通常不会以根用户身份登录到系统,因为很容易意外中断某些内容。相反,您将使用sudo命令。顾名思义,它允许您“做”一些“作为su”(简称“超级用户”,或“根”)。当您遇到拒绝权限的错误时,通常是因为您需要以根用户身份执行某些操作。

要想成为root用户,需要做的一件事是写入安装在/sys下的sysfs文件系统。sysfs将许多内核参数公开为文件,这样您就可以轻松地动态重新配置内核,而无需专门的工具。例如,你的笔记本电脑屏幕的亮度是通过一个名为brightness-under的文件显示的

/sys/class/backlight

通过将值写入该文件,我们可以更改屏幕亮度。你的第一反应可能是做如下事情:

$ 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

这个错误可能会让人吃惊。毕竟,我们用sudo运行命令!像|><这样的操作是由shell完成的,而不是由单个程序完成的。回声和朋友不知道|。他们只是从输入中读取并写入输出,不管是什么。在上述情况下,shell(与用户一样经过身份验证)在将亮度文件设置为sudo echo的输出之前尝试打开该文件进行写入,但由于shell不作为根运行,因此无法这样做。利用这些知识,我们可以解决以下问题:

$ echo 3 | sudo tee brightness

由于tee程序是打开/sys文件进行写入的程序,并且它是以根用户身份运行的,因此所有权限都可以工作。您可以通过/sys控制各种有趣和有用的东西,例如各种系统指示灯的状态(您的路径可能不同):

$ echo 1 | sudo tee /sys/class/leds/input6::scrolllock/brightness

练习:

通过shell命令查看CPU温度: cd /sys/class/thermal/thermal_zone0/
运行temp文件
Cpu 温度信息位于该目录中,并且是只读的,获得的温度参数应该除以1000,单位为摄氏度。

发布了28 篇原创文章 · 获赞 2 · 访问量 3259

猜你喜欢

转载自blog.csdn.net/Maestro_T/article/details/104315259