Course & Shell

本文是 Shell 入门教程,介绍了 Shell 的概念、使用方法,包括命令解析、命令执行、文件导航、重定向与管道以及用户权限管理。通过实例演示了如何在命令行中执行命令、改变文件权限以及进行数据交互。并给出了课后练习,帮助读者巩固所学知识。

系列文章目录

提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
例如:第一章 Python 机器学习入门之pandas的使用


提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

本系列文章是关于MIT课程: The Missing Semester of Your CS Education。

本系列文章主要内容:

shell
shell 工具
编辑器 (vim)
数据整理(data wrangling)
命令行环境(command line)
版本控制 (git)
调试与配置(debugging-profiling)
元编程(metaprogramming)
安全(security)
其他

本文主要内容为shell


一、shell 是什么?

shell是计算机上的文本接口,几乎所有平台都支持某种形式的shell。虽然它们之间的细节有所差异,但是核心功能相同:允许操作者执行程序,输入并获取某种半结构化的输出。
本节课我们会使用 Bourne Again Shell, 简称 bash 。 这是被最广泛使用的一种 shell,它的语法和其他的 shell 都是类似的。

二、使用 shell

1.命令解析

$符号表示当前用户不是 root 用户(稍后会介绍)。在这个提示符中,用户可以输入命令 ,命令最终会被 shell 解析。
shell基于空格分割命令并进行解析,然后执行第一个单词代表的程序,并将后续的单词作为程序可以访问的参数。
若希望传递的参数中包含空格,则有两种方式:

  1. 单引号或者双引号包裹参数;
  2. 在空格前使用转义符\

2.echo命令

当执行 echo 命令时,shell 了解到需要执行 echo 这个程序,随后它便会在 $PATH 中搜索由 :所分割的一系列目录,基于名字搜索该程序,当找到该程序时便执行。
确定某个程序名代表的是哪个具体的程序,可以使用 which 程序。
也可以绕过 $PATH,通过直接指定需要执行的程序的路径来执行该程序

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

3.在shell中导航

shell 中的路径是一组被分割的目录,在 Linux 和 macOS 上使用 /分割,而在Windows上是\。路径/代表的是系统的根目录,所有的文件夹都包括在这个路径之下,在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

为了查看指定目录下的文件,使用ls命令;查看文件的详细信息可采用ls -l

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

这个参数可以打印出更加详细地列出目录下文件或文件夹的信息。首先,本行第一个字符 d 表示 missing 是一个目录。
然后接下来的九个字符,每三个字符构成一组,分别代表了文件所有者(missing),用户组(users) 以及其他所有人具有的权限。
其中w代表可以修改,如添加或者删除文件;
r代表可以读取,如列出文件夹的内容;
'x代表执行,如为了进入某个文件夹,用户需要搜索权限;
- 表示该用户不具备相应的权限。
对于文件来说,权限的意义也是类似的。注意,/bin 目录下的程序在最后一组,即表示所有人的用户组中,均包含 x权限,也就是说任何人都可以执行这些程序。

常用的文件命令:mv用于重命名或移动文件、 cp用于拷贝文件以及 mkdir用于新建文件夹。

如果想要知道关于程序参数、输入输出的信息,亦或是想要了解它们的工作方式,利用man这个程序。它会接受一个程序名作为参数,然后显示用户文档。注意,使用 q 可以退出该程序。

4.程序中创建连接

在 shell 中,程序有两个主要的“流”:它们的输入流和输出流。 当程序尝试读取信息时,它们会从输入流中进行读取,当程序打印信息时,它们会将信息输出到输出流中。 通常,一个程序的输入输出流都是您的终端。也就是,您的键盘作为输入,显示器作为输出。 但是,我们也可以重定向这些流!
最简单的重定向是 < file> file。这两个命令可以将程序的输入输出流分别重定向到文件:

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

还可以使用 >> 来向一个文件追加内容。使用管道( pipes ),我们能够更好的利用文件重定向。|操作符允许我们将一个程序的输出和另外一个程序的输入连接起来:

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

注:head函数用于取数据头行,tail函数用于取数据尾行。

5.用户权限

对于大多数的类 Unix 系统,有一类用户是非常特殊的,那就是:超级用户(root user)。
超级用户几乎不受任何限制,可以创建、读取、更新和删除系统中的任何文件。 通常在我们并不会以根用户的身份直接登录系统,因为这样可能会因为某些错误的操作而破坏系统。 取而代之的是我们会在需要的时候使用 sudo 命令。顾名思义,它的作用是让您可以以 su(super user 或 root 的简写)的身份执行一些操作。 当您遇到拒绝访问(permission denied)的错误时,通常是因为此时您必须是超级用户才能操作。
只有超级用户可以向 sysfs 文件写入内容。系统被挂载在 /sys 下,sysfs 文件则暴露了一些内核参数。 因此,您不需要借助任何专用的工具,就可以轻松地在运行期间配置系统内核。注意 Windows 和 macOS 没有这个文件。
例如,改变屏幕亮度:

$ 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 执行的,而不是被各个程序单独执行。 echo 等程序并不知道 | 的存在,它们只知道从自己的输入输出流中进行读写。 对于上面这种情况, shell (权限为您的当前用户) 在设置sudo echo 前尝试打开 brightness 文件并写入,但是系统拒绝了 shell 的操作因为此时 shell 不是根用户。
因此,采用如下操作:

$ echo 3 | sudo tee brightness

其中,tee函数在两个管道文件之间复制数据,是零拷贝操作,它不消耗数据,因此源文件上的数据仍然可以用于后续操作;tee命令既可以把输出保存到文件,又可以在屏幕显示。

三、课后练习

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

  2. 用 man 查看程序 touch 的使用手册。

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

  4. 将以下内容一行一行地写入 semester 文件:
    第一行可能有点棘手, # 在Bash中表示注释,而! 即使被双引号"包裹也具有特殊的含义。 单引号'则不一样,此处利用这一点解决输入问题。

#!/bin/sh
curl --head --silent https://missing.csail.mit.edu
  1. 尝试执行这个文件。例如,将该脚本的路径(./semester)输入到您的shell中并回车。如果程序无法执行,请使用 ls 命令来获取信息并理解其不能执行的原因。

  2. 查看 chmod 的手册(例如,使用 man chmod 命令)

  3. 使用 chmod 命令改变权限,使 ./semester 能够成功执行,不要使用 sh semester 来执行该程序。您的 shell 是如何知晓这个文件需要使用 sh 来解析呢?更多信息请参考:shebang

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

  5. 写一段命令来从 /sys 中获取笔记本的电量信息,或者台式机 CPU 的温度。


# 总结 本文主要是关于shell的基本概念和简单命令。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值