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
?
从下至上搜索某个关键词,如 ?linux
q
退出帮助文档
常用系统工作命令
echo
:输出字符串或变量提取后的值,格式为echo [字符串] [$变量]
。
样例 功能 echo 'hello world'
输出一个字符串参数, hello world
echo hello world
输出两个空格隔开的字符串参数, hello
和world
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
命令可省略-
常用于定位 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
回车
跳跃 g
G
搜索 说明 /pattern
向后搜索 pattern ?pattern
向前搜索 pattern n
跳跃到下一个 pattern N
跳跃到上一个 pattern &pattern
Display only matching lines !/pattern
Search 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
对输出进行排序