🥲

【missing-semester】1.课程概览与 shell

2024/05/09に公開

动机

计算机相关工作中,挖掘现有工具的潜力,并介绍一些新的工具。

shell 是什么

shell 是用户与操作系统内核之间的接口,用户可以通过输入命令来执行各种操作,例如运行程序、管理文件和目录、配置系统等。常见的 Shell 包括 Unix/Linux 系统中的 Bash(Bourne Again Shell)、Zsh(Z Shell)和 Windows 系统中的 PowerShell。

使用文字进行指令的输入,核心功能都是一样的:它允许你执行程序,输入并获取某种半结构化的输出。

环境变量

如果你要求 shell 执行某个指令,但是该指令并不是 shell 所了解的编程关键字,那么它会去咨询 环境变量 $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

在程序间创建连接

  • 输入流:输入流是数据从外部环境流入程序的流。它通常用于从文件、键盘、网络连接或其他设备读取数据到程序中。例如,当你从键盘输入字符时,这些字符就是通过输入流输入到程序中进行处理的。
  • 输出流:输出流是数据从程序流出到外部环境的流。它通常用于将程序处理后的数据输出到文件、屏幕、网络连接或其他设备中。例如,当程序将结果打印到屏幕上时,这些数据就是通过输出流输出到屏幕上显示的。
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

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

missing:~$ ls -l / | tail -n1
drwxr-xr-x 1 root  root  4096 Jun 20  2019 var

课后练习

  1. 使用echo $SHELL命令可以查看您的 shell 是否满足要求。如果打印结果为/bin/bash或/usr/bin/zsh则是可以的。
ouharu@MBA ~ % echo $SHELL
/bin/zsh `
  1. 在 /tmp 下新建一个名为 missing 的文件夹。
ouharu@MBA ~ % mkdir /tmp/missing
ouharu@MBA ~ % cd /tmp/missing
  1. 用 man 查看程序 touch 的使用手册。
ouharu@MBA missing % man touch
  1. 用 touch 在 missing 文件夹中新建一个叫 semester 的文件。
  2. 将以下内容一行一行地写入 semester 文件:
    #!/bin/sh
    curl --head --silent https://missing.csail.mit.edu
    第一行可能有点棘手, # 在Bash中表示注释,而 ! 即使被双引号(")包裹也具有特殊的含义。 单引号(')则不一样,此处利用这一点解决输入问题。更多信息请参考 Bash quoting 手册
ouharu@MBA missing % echo '#!/bin/sh' > semester
ouharu@MBA missing % echo 'curl --head --silent https://missing.csail.mit.edu' >> semester 
ouharu@MBA missing % cat semester               
#!/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
ouharu@MBA missing % chmod 744 semester 
ouharu@MBA missing % ./semester 
HTTP/2 200 
server: GitHub.com
content-type: text/html; charset=utf-8
x-origin-cache: HIT
last-modified: Sat, 02 Mar 2024 14:52:48 GMT
access-control-allow-origin: *
etag: "65e33d40-2015"
expires: Wed, 08 May 2024 01:45:02 GMT
cache-control: max-age=600
x-proxy-cache: MISS
x-github-request-id: 1D3C:1D457:63C62E:6906F2:663AD6C6
accept-ranges: bytes
age: 0
date: Wed, 08 May 2024 16:18:58 GMT
via: 1.1 varnish
x-served-by: cache-nrt-rjtf7700023-NRT
x-cache: HIT
x-cache-hits: 0
x-timer: S1715185138.349312,VS0,VE162
vary: Accept-Encoding
x-fastly-request-id: 9432480b1356be6eb294975c00e90fd0eb96835a
content-length: 8213

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

ouharu@MBA missing % ls -l semester | cut -d ' ' -f9-12 > sudo tee /last-modified.txt

ouharu@MBA missing % ./semester | grep last-modified > ~/last-modified.txt
ouharu@MBA missing % cat ~/last-modified.txt 
last-modified: Sat, 02 Mar 2024 14:52:48 GMT

10.写一段命令来从 /sys 中获取笔记本的电量信息,或者台式机 CPU 的温度。注意:macOS 并没有 sysfs,所以 Mac 用户可以跳过这一题。

Discussion