【Missing Semester】01 课程概览与Shell

本文为计算机教育中缺失的一课 The Missing Semester of Your CS Education 笔记


Shell

Shell 是什么:

  • Shell(计算机壳层)。
  • “为使用者提供操作界面” 的软件(command interpreter,命令解析器)。
  • 接收用户命令,然后调用相应的应用程序。

Shell 的种类:

  • zsh:很多人的 Mac 中会使用 zsh 而不是 bash,一大半是因为 oh-my-zsh 这个配置集。兼容 bash,有自动补全等好用的功能。

  • sh:全称 Bourne shell,由 AT&T 公司的 Steve Bourne开发。sh 是 UNIX 上的标准 shell,很多 UNIX 版本都配有 sh,是第一个流行的 shell。

  • csh:sh 之后另一个广为流传的 shell,由柏克莱大学的 Bill Joy 设计的,语法有点类似 C 语言,所以才得名为 C shell ,简称为 csh。

  • tcsh:tcsh 是 csh 的增强版,加入了命令补全功能,提供了更加强大的语法支持。

  • ash:一个简单的轻量级的 Shell,占用资源少,适合运行于低内存环境,与 bash 完全兼容。

  • bash:由 GNU 组织开发,保持了对 sh 的兼容性,是各种 Linux 发行版默认配置的 shell。


终端

打开终端的几种方法(Mac):

  • 启动台 - 其它 - 终端。
  • 选择一个文件夹 - 右键 - 新建位于文件夹位置的终端窗口。
  • 选择一个文件夹 - Option + Command + X(自定义快捷键)。
    • 系统偏好设置 - 键盘 - 快捷键 - 服务 - 文件和文件夹 - 新建位于文件夹位置的终端窗口。

终端样式设置:

第一个命令:

  • echo:打印。
  • date:显示系统时间。
  • cat:打印文件内容。
bogon:Missing Semester wangxinyuan$ echo "Hello World"
Hello World
bogon:Missing Semester wangxinyuan$ date
2022年 2月17日 星期四 10时55分59秒 CST

# 查看当前使用的Shell
bogon:Missing Semester wangxinyuan$ echo $SHELL
/bin/bash
# 查看安装的Shell
bogon:Missing Semester wangxinyuan$ cat /etc/shells
# List of acceptable shells for chpass(1).
# Ftpd will not allow users to connect who are not using
# one of these shells.

/bin/bash
/bin/csh
/bin/ksh
/bin/sh
/bin/tcsh
/bin/zsh

命令是如何执行的:

  • 当你在 Shell 中执行命令时,实际上是在执行一段 Shell 可以解释执行的简短代码。如果你要求 Shell 执行某个指令,但是该指令并不是 Shell 所了解的编程关键字,那么它会去咨询环境变量 $PATH,它会列出当 Shell 接到某条指令时,进行程序搜索的路径。
bogon:Missing Semester wangxinyuan$ echo $PATH
/usr/local/opt/ruby/bin:/usr/local/lib/ruby/gems/3.0.0/bin:/usr/local/opt/ruby/bin:/usr/local/lib/ruby/gems/3.0.0/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/Frameworks/Mono.framework/Versions/Current/Commands
# 定位echo
bogon:Missing Semester wangxinyuan$ which echo
/bin/echo
bogon:Missing Semester wangxinyuan$ which ruby
/usr/bin/ruby
# 等价于echo “Hello World”
bogon:Missing Semester wangxinyuan$ /bin/echo "Hello World"
Hello World

文件

路径:

  • pwd:显示当前工作目录。
  • cd:切换工作目录。
    • . 表示当前目录。
    • .. 表示上级目录。
    • cd ~cd:Go to the home directory of the current user。
    • cd -:Go to the previously chosen directory。
    • 如果某个路径以 / 开头,那么它是一个绝对路径,其他的都是相对路径
  • ls:查看指定目录下包含哪些文件。
    • ls -l 得到的长格式文件和目录信息中,三组 rwx 依次代表拥有者、所属组、其他人的权限;对于目录,r 代表是否可以查看目录里面的内容,w 代表是否可以在目录里创建、删除、重命名文件,w 代表是否可以进入这个目录。
bogon:Missing Semester wangxinyuan$ pwd
/Users/wangxinyuan/Desktop/Missing Semester
# 绝对路径
bogon:Missing Semester wangxinyuan$ cd /Users/wangxinyuan/Desktop

# .
bogon:Desktop wangxinyuan$ cd ./Missing\ Semester

# ..
bogon:Missing Semester wangxinyuan$ cd ..

# 相对路径
bogon:Desktop wangxinyuan$ cd "Missing Semester"

# previously
bogon:Missing Semester wangxinyuan$ cd -
/Users/wangxinyuan/Desktop

# home
bogon:Desktop wangxinyuan$ cd
bogon:~ wangxinyuan$ ls
Applications	Library		Pictures	a.out		bt.plist
Desktop		Movies		Public		ap.plist	history.plist
Documents	Music		PycharmProjects	apps.plist
Downloads	OneDrive	Users		brew_install

一些文件操作命令:

  • mkdir:新建文件夹。
  • touch:新建文件或更改文件访问修改时间。
  • rm:删除文件或文件夹。
  • mv:移动或重命名文件或文件夹。
  • cp:拷贝文件或文件夹。
# 在当前文件夹创建"名未命文件夹"
bogon:tmp wangxinyuan$ mkdir 名未命文件夹

# 在"名未命文件夹"中新建"笔记文件"
bogon:tmp wangxinyuan$ touch ./名未命文件夹/笔记.txt

# 删除"名未命文件夹"中"笔记文件"
bogon:tmp wangxinyuan$ rm ./名未命文件夹/笔记.txt

# 删除"名未命文件夹"
bogon:tmp wangxinyuan$ rm -r 名未命文件夹

# 将"missing文件夹"中"semester.txt文件"移动到"名未命文件夹"
bogon:tmp wangxinyuan$ mv missing/semester.txt 名未命文件夹

# 将"名未命文件夹"文件夹中"semester.txt文件"移动到"missing文件夹"并重命名为"hhh.txt"
bogon:tmp wangxinyuan$ mv 名未命文件夹/semester.txt missing/hhh.txt

# 将"missing文件夹"中"hhh.txt文件"复制到"名未命文件夹"
bogon:tmp wangxinyuan$ cp missing/hhh.txt 名未命文件夹

查看帮助信息:


流:

  • 标准输入:stdin,由 \(0\) 表示。
  • 标准输出:stdout,由 \(1\) 表示。
  • 标准错误:stderr,由 \(2\) 表示。

流的重定向:

  • < file:将程序的输入流重定向到文件。
  • > file:将程序的输出流重定向到文件。
  • 三种流可以同时重定向。
  • 例:echo hhh 1> output.txt 2> err.txt

>>>

  • 当 out.txt 不存在时,>>> 都会默认创建 out.txt,并将 Hello World 保存到 out.txt 中。
  • 当 out.txt 存在时,> 会将 out.txt 中的内容清空,并将 Hello World 存入;而 >> 会将 Hello World 追加保存到 out.txt 的末尾。
bogon:tmp wangxinyuan$ echo "Hello World" > out.txt
bogon:tmp wangxinyuan$ cat out.txt
Hello World
# out.txt中内容如下
# Hello World
bogon:tmp wangxinyuan$ echo "Hello WXY" >> out.txt
# out.txt中内容如下
# Hello World
# Hello WXY
bogon:tmp wangxinyuan$ echo "hhh" > out.txt
# out.txt中内容如下
# hhh

| 操作符:

  • 将一个程序的输出和另外一个程序的输入连接起来。
bogon:tmp wangxinyuan$ ls -l
total 8
drwxr-xr-x  3 wangxinyuan  staff   96  2 17 14:25 missing
-rw-r--r--@ 1 wangxinyuan  staff  251  2 17 14:44 out.txt
drwxr-xr-x  4 wangxinyuan  staff  128  2 17 14:27 名未命文件夹
bogon:tmp wangxinyuan$ ls -l | tail -n1
drwxr-xr-x  4 wangxinyuan  staff  128  2 17 14:27 名未命文件夹

根用户

  • 根用户(root user)几乎不受任何限制,他可以创建、读取、更新和删除系统中的任何文件。

  • sudo 命令:以根用户的身份执行一些操作。


课后练习

5 ~ 8 题:

# 创建exercise
bogon:tmp wangxinyuan$ touch exercise

# 写入exercise
bogon:tmp wangxinyuan$ echo '#!/bin/sh' >> exercise
bogon:tmp wangxinyuan$ echo "curl --head --silent https://baidu.com" >> exercise

# 打印exercise内容
bogon:tmp wangxinyuan$ cat exercise
#!/bin/sh
curl --head --silent https://baidu.com

# 使用./exercise执行exercise,失败
bogon:tmp wangxinyuan$ ./exercise
-bash: ./exercise: Permission denied

# 使用sh执行exercise
bogon:tmp wangxinyuan$ sh exercise
HTTP/1.1 302 Moved Temporarily
Server: bfe/1.0.8.18
Date: Thu, 17 Feb 2022 07:20:58 GMT
Content-Type: text/html
Content-Length: 161
Connection: keep-alive
Location: http://www.baidu.com/

# 失败原因:没有执行权限
bogon:tmp wangxinyuan$ ls -l exercise
-rw-r--r--  1 wangxinyuan  staff  49  2 17 15:20 exercise

# 使用chmod修改权限
bogon:tmp wangxinyuan$ chmod a+rx exercise
bogon:tmp wangxinyuan$ ls -l exercise
-rwxr-xr-x  1 wangxinyuan  staff  49  2 17 15:20 exercise

# 使用./exercise执行exercise,成功
bogon:tmp wangxinyuan$ ./exercise
HTTP/1.1 302 Moved Temporarily
Server: bfe/1.0.8.18
Date: Thu, 17 Feb 2022 07:21:56 GMT
Content-Type: text/html
Content-Length: 161
Connection: keep-alive
Location: http://www.baidu.com/

参考

posted @ 2022-02-17 15:53  空白4869  阅读(130)  评论(0编辑  收藏  举报