『Linux 干货』#1 终端与Shell(简明)

访问博客查看 本文 排版更美观ヾ(•ω•`)o

Linux 系列学习笔记:

  • Linux学习笔记 #1 终端与Shell
  • Linux学习笔记 #2 高级的Shell与文件管理
  • Linux学习笔记 #3 使用远程服务器

继 Git 后贵系的另一个暑培项目,讲授 Linux 的基本用法,恰好这学期「操作系统」课程实验需要用到 Linux,而且实验室的服务器也需要学习相关用法,故学之。

本文部分内容参考了清华 ZAH 同学的教程,部分参考了 刘遄 老师的《Linux 就该这么学》,菜鸟教程-Linux。

Linux 简介

Linux,全称 GNU/Linux,是一套免费使用和自由传播的类 Unix 操作系统。相比于其他系统,Linux 更加稳定且有效率、更加安全、相对不耗资源……以至于几乎所有长期稳定运行的网站服务器上、在处理大数据的集群系统中,以及需要协同工作的服务器环境都采用 Linux 系统。

Linux 发行版

Linux 严格来说是单指操作系统的内核,因操作系统中包含了许多用户图形接口和其他实用工具。如今 Linux 常用来指「基于 Linux 的完整操作系统」,内核则改以「Linux 内核」称之。

一些组织或厂商将 Linux 内核与各种软件和文档包装起来,并提供系统安装界面和系统配置、设定与管理工具,就构成了 Linux 的发行版本。

常见的Linux发行版

命令行与终端

在学习 Linux 的过程中,有几个易混淆的概念:

  • 图形用户界面(GUI)= 使用图形方式进行交互的用户界面
  • 命令行界面(CLI)= 使用文本命令进行交互的用户界面
  • 控制台(Console)= 物理意义的终端,电脑主机的一部分
  • 终端(Terminal)= TTY (Teletypewriter,打字机) = 文本输入输出环境
  • 终端模拟器(Terminal Emulator)= 套壳程序,用来模拟传统终端
  • Shell = 一个程序,命令行解释器,执行用户输入的命令并返回结果

CLI

命令行界面(Command-Line Interface,CLI)是在图形用户界面得到普及之前使用最为广泛的用户界面,它通常不支持鼠标,用户通过键盘输入指令,计算机接收到指令后,予以执行。也有人称之为字符用户界面(Character User Interface,CUI)。

一般来说,在服务器中较多采用的是 CLI 界面,或许有以下几点原因:

  • 服务器的功能是对外提供服务,并不需要直观的 GUI 界面来让用户日常使用,使用 GUI 界面反而浪费资源。
  • 使用 CLI 界面管理服务器,本质上是直接用命令控制服务器,这允许一系列的自动化脚本(Shell 脚本)出现来节省时间。
  • 方便自动化、规模化部署服务器。

Shell

Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 等系统的桥梁,如同「」一般。它的本质是一个命令解释器,将用户输入的命令(符合 Shell 语法)处理成对应操作系统的控制命令,处理完毕后再将结果反馈给用户。

不同操作系统下面的 Shell 种类众多,常见的有:

  • Windows:cmd (Command Shell)、PowerShell;
  • Linux/macOS:sh、bash、zsh 等。

Ken Thompson 的 sh 是第一种 Unix Shell,本教程关注的是 Bash,也就是 Bourne Again Shell,Bash 也是大多数 Linux 系统默认的 Shell。

Terminal

终端 (Terminal),是一种用来让用户输入数据至计算机,以及显示其计算结果的机器。早期的终端通常就是一台电子打字机(Teletypewriter, TTY),后来随着计算机的发展,打字机被键盘和显示器取代,而 GUI 界面也成了主流。

于是,这时候我们就需要一个程序来模拟传统终端的行为,即终端模拟器(Terminal Emulator),当用户打开终端模拟器时,实际上是进入一个会话进程(Session)。终端模拟器有很多,这里举几个经典的例子:

  • GNU/Linux:gnome-terminal、Konsole;
  • macOS:Terminal.app、iTerm2;
  • Windows:Windows Terminal、Cmder 等。

Shell 使用

在 Linux 系统中打开终端时,会看到一个提示符,通常类似 hewei@hewei-VirtualBox ~$。在提示符下,命令会被 Shell 环境解析并反馈到终端中。

提示符是 Shell 最主要的文本接口。它告诉你,你的主机名是 hewei-VirtualBox,你现在的身份是 hewei 并且你当前的工作目录(Current working directory)是 ~ (默认在 /home/hewei/ 用户目录)。

$ 符号表示您现在的身份不是 root,输入如下命令可以暂时切换到 root 权限:

hewei@hewei-VirtualBox ~$ sudo su  # 获取 root 权限
[sudo] hewei 的密码:  # 在此输入密码,Terminal 下密码都是不可见的

输入密码后,可以看到提示符变成了 root@hewei-VirtualBox:/home/hewei#,其中 # 符号就是超级用户权限的标志。再输入 exit 即可退回普通用户身份。

终端快捷键

在 Git学习笔记 #1 基础知识介绍 中,已经简单介绍了命令行界面的一些使用技巧,这些命令在 Linux 系统的 Bash 中同样使用。这里罗列出 Linux 常用快捷键:

  • Ctrl+Shift+T:唤出一个终端窗口。
  • Tab:实现对命令、参数或文件的内容补全。
  • Ctrl+C:终止当前进程的运行,重获终端的控制权。
  • Ctrl+Z:挂起当前进程。
  • Ctrl+D:结束键盘输入,若正在使用 Shell 则退出,相当于输入 exit()
  • Ctrl+L:清空当前终端中已有的内容,相当于输入 clear
  • <上下键>:翻看使用过的命令记录。
  • Shift+PgUp/PgDn:翻页终端。
  • home/end:光标快速移动到当前行首或行尾。
  • Ctrl/Shift+Ins :复制粘贴文本。
  • ‘’“”:命令参数中若存在空格,需要用引号括起来。

命令格式

常见的执行 Linux 命令的格式是这样的:命令名称 [命令参数] [命令对象]。其中,命令参数用于对命令进行调整,使之更好地贴近需求,参数分为长格式短格式,如:man --helpman -h。短格式之间可以合并,合并后仅保留一个减号即可。

在 Linux 相关的手册中,我们会约定俗成地将可选择的、非必需的参数使用中括号引起来,而命令所要求的、必须有的参数或对象值,则不带中括号。

此外,要注意 Linux 系统中的命令、参数、对象都是严格区分大小写的。

Shell 脚本

Shell 除了是一个交互式(Interactive)的命令解释器,它还是一种程序设计语言(Shell Script)。它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支。

用 Shell 编写的脚本文件.sh 文件,它能在 Shell 环境下运行,fork 出一个子进程,调用系统内核来执行批处理(Batch)的系统控制。在文件的第一行,通常是 #!/bin/bash,这句话约定了这个脚本需要哪种 Shell 环境来执行。

通过如下命令就可以执行一个 Shell 脚本:

$ bash example.sh

常用命令摘要

下面罗列了部分常用指令与参数的介绍,更多功能请在帮助手册中检索。

唤出帮助界面命令

  • man:代表 Manuel,查看帮助手册,格式为 man 命令名称。会进入「导航」模式,使用如下快捷键进行查阅:
按键 作用
<空格键> 向下翻一页
PaDn/PgUp 向下/上翻一页
home/end 直接前往首页/尾页
/ 从上至下搜索某个关键词,如 /linux
? 从下至上搜索某个关键词,如 ?linux
q 退出帮助文档

常用系统工作命令

  • echo:输出字符串变量提取后的值,格式为 echo [字符串] [$变量]
样例 功能
echo 'hello world' 输出一个字符串参数,hello world
echo hello world 输出两个空格隔开的字符串参数,helloworld
echo hello\ world 输出一个字符串参数,\ 转义空格
echo $PATH 输出环境变量 PATH 的提取值
  • date:显示或设置系统的时间与日期,格式为:date [+指定的格式]
样例 功能
date 显示 Sat Sep 5 09:13:45 CST 2020
date "+%Y-%m-%d %H:%M:%S" 按格式显示 2020-09-05 09:14:35
date -s "20201101 8:30:00" 设置系统时间
  • reboot:重启系统,无格式,需要 root 权限。
  • poweroff:关闭系统,无格式,需要 root 权限。
  • ps:代表 Processes,查看系统中的进程状态,格式为 ps [参数]
参数 功能
-a 显示所有进程(包括其他用户的进程)
-u 显示用户以及其他详细信息
-x 显示没有控制终端的进程
aux 合并三个参数,ps 命令可省略 -
  • pstree:以树状图形式展示进程之间关系,无格式。

  • top动态地监视进程活动及系统负载等信息,无格式。

  • nice:调整进程的优先级,格式为 nice -n 优先级数字 服务名称。取值为 -20 到 19,数字越小,优先级越高。

  • pidof:查询指定进程的 PID,格式为 pidof [参数] 服务名称

  • kill:终止指定 PID 值的进程,格式为 kill [参数] PID

系统状态检测命令

  • ifconfig:代表 Interface config,获取网卡配置与网络状态等信息。
  • ipaddr:代表 IP address,获取 IP 地址等信息。
  • uname:代表 Unix name,查看系统内核版本与系统架构等信息。
  • uptime:查看系统的负载信息(当前系统时间、已运行时间、启用终端数、平均负载值),无格式。
  • free:显示当前系统中内存的使用量,格式为 free [-h]-h 为易读模式(human readable)。
  • who:查看当前登入主机的用户终端信息,无格式。
  • ping:测试主机之间的网络连通性,格式为 ping [参数] 主机地址
  • history:显示执行过的命令历史,格式为 history [-c]-c 为清空(clear)。

查找定位文件命令

  • pwd:代表 Print working directory,显示用户当前所处的工作目录,无格式。
  • cd:代表 Change directory,切换当前的工作路径,格式为 cd [参数] [目录]
样例 功能
cd - 返回到上一次所处的目录
cd . 进入目录(无变化)
cd .. 进入上级目录
cd / 切换到根目录
cd ~ 切换到当前用户的 /home/ 目录
cd ~ 切换到其他用户的 /home/ 目录
cd /bin 切换到绝对路径 /bin
  • ls:代表 List,显示目录中的文件信息,格式为 ls [参数] [文件名称]
样例 功能
ls -a 查看全部文件(包括隐藏文件)
ls -l 列表形式,查看文件的属性、大小等详细信息
ls -al 合并以上两个参数
ls -alh 易读显示(human readable)
ls -ld 查看当前路径文件夹的属性、大小等详细信息
  • tree:以树状图的形式列出目录内容及结构,无格式。
  • find:指定条件查找文件所对应的位置,格式为 find [查找范围] 寻找条件
样例 功能
find /etc -name "host*" 查找 /etc 路径下 host 开头的文件
find / -perm -4000 整个系统中搜索权限包括 SUID 的文件
  • updatedb:生成文件索引库,无格式。和以下命令配合使用,快于 find

  • locate:按照名称快速搜索文件所对应的位置,格式为 locate 文件名称

  • whereis:按照名称快速搜索命令源代码帮助文件的位置,格式为 whereis 命令名称

  • which:按照名称检索命令的位置,格式为 which 命令名称,默认在 PATH 变量所指定的路径中检索。

文本统计编辑命令

  • cat:代表 Concatenate,查看内容较少的纯文本文件,格式为 cat [参数] 文件名称
样例 功能
cat a.txt 查看当前目录下文件内容
cat -n a.txt 查看时显示行号
cat /etc/os-release 查看操作系统信息
  • more:查看内容较多的纯文本文件,格式为 more [参数] 文件名称。用空格键或回车键向下滚动查看。
  • head:查看纯文本文件的前 N 行,格式为 head -n [行数] 文件名称
  • tail:查看纯文本文件的后 N 行,格式为 tail [参数] 文件名称
样例 功能
tail -n 10 a.txt 显示文件的后 10 行
tail -f /var/log/messages 查看并实时刷新,常用于日志文件
  • tr:代表 Translate,替换文本内容中的字符,格式为 tr [原始字符] [目标字符]
样例 功能
cat a.txt丨tr [a-z] [A-Z] 把文本中的英文以全大写输出(经过管道运算符)
  • wc:统计指定文本文件的行数 -l、字数 -w 或字节数 -c,格式为 wc [参数] 文件名称
样例 功能
wc -l /etc/passwd 统计 passwd 行数,等价于求用户数
wc 1.txt 不加参数,默认三个值都返回
  • stat:查看文件的具体存储细节和时间等信息,格式为 stat 文件名称
  • grep:代表 Global Regular Expression Print,按行提取文本内容,格式为 grep [参数] 查询内容 文件名称
参数 功能
-b 将可执行文件 (bin) 当作文本文件 (txt) 来搜索
-c 仅显示找到的行数
-i 忽略查询内容的大小写
-n 同时显示行号
-v 反向选择,列出不包含查询内容的行
  • diff:比较多个文件之间内容的差异,格式为 diff [参数] 文件名称A 文件名称B
样例 功能
diff --brief diff_A.txt diff_B.txt 仅显示判断结果
diff -c diff_A.txt diff_B.txt 描述不同的行
  • uniq:代表 Unique,去除文本中连续的重复行,格式为 uniq [参数] 文件名称
  • sort:对文本内容进行再排序,格式为 sort [参数] 文件名称
参数 功能
-f 忽略大小写
-b 忽略缩进与空格
-n 以数值型排序
-r 反向排序
-u 去除重复行
-t 指定间隔符
-k 按照间隔符,指定第几列值

文件目录管理命令

  • touch:创建空白文件或设置文件的时间,格式为 touch [参数] 文件名称
样例 功能
touch 1.txt 创建一个空白文件
touch -d "2020-05-04 15:44" 1.txt 设置文件上次修改时间
  • mkdir:代表 Make directory,创建空白的目录,格式为 mkdir [参数] 目录名称
样例 功能
mkdir mydir 在当前路径下新建文件夹
mkdir -p a/b/c/d/e 创建层叠目录
  • cp:代表 Copy,复制文件或目录,格式为 cp [参数] 源文件名称 目标文件名称
源文件 目标文件 功能
文件 目录 把源文件复制到该目录中
文件 文件 询问是否要覆盖它(需要 -i
文件 不存在 执行正常的复制操作(如备份
目录 目录 递归持续复制(需要 -r-a
  • mv:移动文件,格式为 mv [参数] 源文件名称 目标文件名称。不同于复制操作,默认会把源文件删除,只保留剪切后的文件。
样例 功能
mv 1.txt 2.txt 相当于重命名文件
mv 1.txt mydir 剪切到新目录下
  • rm:删除文件或目录,格式为 rm [参数] 文件名称
参数 功能
-f 强制执行,不询问
-i 删除前询问(默认)
-r 递归删除目录
-v 显示正在删除过程
  • rmdir:删除目录,格式为 rmdir [参数] 目录名称
样例 功能
rmdir mydir 删除当前路径的目录
rmdir -p a/b/c 删除层叠空目录
  • file:查看文件的类型,常用于无后缀文件,格式为 file 文件名称

Linux 中一切皆文件,而许多文件都是没有后缀的。

不像 Windows,用户双击鼠标打开文件,此时系统会自行判断用户双击的文件是什么类型,因此需要有后缀进行区别。

而 Linux 系统则是根据用户执行的命令来调用文件,例如执行 cat 命令查看文本等,所以也就不需要强制让用户给文件设置后缀了。

  • tar:文件进行打包压缩或解压,格式为 tar 参数 文件名称
参数 功能
-c 创建压缩文件
-x 解开压缩文件
-t 查看压缩包内有哪些文件
-v 显示真正压缩或解压的过程
-C 指定解压到的目录

你可能感兴趣的:(『Linux 干货』#1 终端与Shell(简明))