Linux学习笔记 #1 终端与Shell
本文最后更新于:2024年8月5日 下午
继 Git 后贵系的另一个暑培项目,讲授 Linux 的基本用法,恰好这学期「操作系统」课程实验需要用到 Linux,而且实验室的服务器也需要学习相关用法,故学之。
本文部分内容参考了清华 ZAH 同学的教程,部分参考了 刘遄 老师的《Linux 就该这么学》,菜鸟教程-Linux。
Linux 简介
Linux,全称 GNU/Linux,是一套免费使用和自由传播的类 Unix 操作系统。相比于其他系统,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 权限:
1 | |
输入密码后,可以看到提示符变成了 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 --help,man -h。短格式之间可以合并,合并后仅保留一个减号即可。
在 Linux 相关的手册中,我们会约定俗成地将可选择的、非必需的参数使用中括号引起来,而命令所要求的、必须有的参数或对象值,则不带中括号。
此外,要注意 Linux 系统中的命令、参数、对象都是严格区分大小写的。
Shell 脚本
Shell 除了是一个交互式(Interactive)的命令解释器,它还是一种程序设计语言(Shell Script)。它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支。
用 Shell 编写的脚本文件即 .sh 文件,它能在 Shell 环境下运行,fork 出一个子进程,调用系统内核来执行批处理(Batch)的系统控制。在文件的第一行,通常是 #!/bin/bash,这句话约定了这个脚本需要哪种 Shell 环境来执行。
通过如下命令就可以执行一个 Shell 脚本:
1 | |
常用命令摘要
下面罗列了部分常用指令与参数的介绍,更多功能请在帮助手册中检索。
唤出帮助界面命令
man:代表 Manuel,查看帮助手册,格式为man 命令名称。会进入「导航」模式,使用如下快捷键进行查阅:
按键 作用 <空格键>向下翻一页 PaDn/PgUp向下/上翻一页 home/end直接前往首页/尾页 /从上至下搜索某个关键词,如 /linux?从下至上搜索某个关键词,如 ?linuxq退出帮助文档
常用系统工作命令
echo:输出字符串或变量提取后的值,格式为echo [字符串] [$变量]。
样例 功能 echo 'hello world'输出一个字符串参数, hello worldecho hello world输出两个空格隔开的字符串参数, hello和worldecho hello\ world输出一个字符串参数, \转义空格echo $PATH输出环境变量 PATH的提取值
date:显示或设置系统的时间与日期,格式为:date [+指定的格式]。
样例 功能 date显示 Sat Sep 5 09:13:45 CST 2020date "+%Y-%m-%d %H:%M:%S"按格式显示 2020-09-05 09:14:35date -s "20201101 8:30:00"设置系统时间
reboot:重启系统,无格式,需要root权限。poweroff:关闭系统,无格式,需要root权限。ps:代表 Processes,查看系统中的进程状态,格式为ps [参数]。
参数 功能 -a显示所有进程(包括其他用户的进程) -u显示用户以及其他详细信息 -x显示没有控制终端的进程 aux合并三个参数, ps命令可省略-常用于定位 PID,例如
ps aux | grep run.py,定位后用于 kill 等操作。
pstree:以树状图形式展示进程之间关系,无格式。top:动态地监视进程活动及系统负载等信息,无格式。htop:更加直观、友好的资源监控界面,显示系统的负载情况,包括 CPU、内存、交换分区等,按照 CPU 使用率进行排序,显示进程树形结构,无格式。nice:调整进程的优先级,格式为nice -n 优先级数字 服务名称。取值为 -20 到 19,数字越小,优先级越高。pidof:查询指定进程的 PID,格式为pidof [参数] 服务名称。kill:终止指定 PID 值的进程,格式为kill [参数] PID。参数-9表示最高权限终止。sudo:以临时管理员身份(root)执行命令,格式为sudo 命令,需要被授予权限。su:代表 Switch User,更换其他使用者,除 root 外,需要输入该使用者的密码。tee:读取标准输入的数据,并将其内容输出成文件,格式为tee [参数] 目标文件。
默认新建、覆盖目标文件,使用参数
-a可以附加到已有文件的后方,参数-i忽略中断信号。目标文件可以是多个,用空格隔开。使用命令后会提示用户输入数据,此时键入终端的内容将被读取。也可以结合管道运算符,将上一个任务的输出保存到目标文件:
python test.py | tee -a test.log。
tee实现的是复制标准输出,如果想要直接重定向所有输出,可以使用python test.py &> test.log。注意,有时候输出内容并不会实时显示到文件中,这是因为 Python 程序中的
print()带有输出缓冲区,需要加上参数flush=True。
系统状态检测命令
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 ~ <username>切换到其他用户的 /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 变量所指定的路径中检索。du:disk usage,一个专门用于查看目录和文件磁盘使用情况的命令。
样例 功能 du -h --max-depth=1显示当前目录下的子目录大小 du -h --max-depth=1 /path/to/directory指定目录显示 du -h --max-depth=1 | sort -h对输出进行排序
文本统计编辑命令
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按照间隔符,指定第几列值
less:快速浏览文件,仅阅读模式,防止误修改,格式为less 文件名称,常用参数有-S表示不自动换行。快捷键为:
滚屏 向上滚屏 向下滚屏 一页 b(back)空格半页 u(undo)d(down)一行 y回车跳跃 gG
搜索 说明 /pattern向后搜索 pattern ?pattern向前搜索 pattern n跳跃到下一个 pattern N跳跃到上一个 pattern &patternDisplay only matching lines !/patternSearch for NON-matching lines
文件目录管理命令
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)
scp:服务器之间拷贝数据,格式为scp [参数] 源文件名称 目标文件名称。
源文件 目标文件 功能 文件 目录 把源文件复制到该目录中 文件 文件 询问是否要覆盖它(需要 -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 文件进行打包压缩或解压,格式为tar 参数 压缩包名称 要压缩的文件或目录。
参数 功能 -c创建压缩文件 -x解开压缩文件 -t查看压缩包内有哪些文件 -v显示真正压缩或解压的过程 -C指定解压到的目录 -f指定压缩包名称 -z真正的「压缩」命令 需要注意的是 tar 命令只是将文件或目录打包,并不具有压缩功能,因此压缩后的大小与源文件相同。常用的命令如下:
样例 功能 tar -cvf data.tar file创建一个压缩包,压缩文件 tar -czvf data.tar.gz file1 file2 file3创建一个真正的压缩包,压缩多个文件 tar -xvf data.tar解压缩到当前目录 tar -Cxvf data.tar.gz ./data/解压缩到指定目录
zip/unzip:zip 文件进行压缩、解压缩,格式为zip/unzip [参数] 压缩包名称 [要压缩的文件或目录]。
参数 功能 -d 目标目录解压到指定目录下,默认当前目录 -v查看压缩文件的详细信息,但并不解压 -t测试压缩文件有无损坏,但并不解压 -o解压时覆盖已经存在的文件,并且无需用户确认 -n解压时并不覆盖已经存在的文件 -r递归地压缩目录及其内容(仅适用于 .zip 格式) -z使用 gzip 进行压缩(仅适用于 .tar 或 .tar.gz 格式) 常用命令如下:
样例 功能 zip data.zip file1 file2 file3创建一个压缩包,压缩多个文件 zip -r data.zip ./data/*递归压缩目录及内容 unzip data.zip解压缩到当前目录 unzip data.zip -d ./data/解压缩到目标目录
du:disk usage,一个专门用于查看目录和文件磁盘使用情况的命令。
样例 功能 du -h --max-depth=1显示当前目录下的子目录大小 du -h --max-depth=1 /path/to/directory指定目录显示 du -h --max-depth=1 | sort -h对输出进行排序