Linux学习笔记 #1 终端与Shell

本文最后更新于:2024年6月15日 下午

继 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 权限:

1
2
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 脚本:

1
2
3
4
5
# 通过将文件作为参数传递给 shell 以运行 shell 脚本
$ bash example.sh # 这种方法不需要有 x 权限
# 通过具体指定 shell 脚本的路径来执行脚本
$ chmod u+x script.sh
$ ./example.sh # 注意这种方法必须有 ./ z

常用命令摘要

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

唤出帮助界面命令

  • 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 命令可省略 -

常用于定位 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 外,需要输入该使用者的密码。

系统状态检测命令

  • 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
  • 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/解压缩到目标目录
  • tee:读取标准输入的数据,并将其内容输出成文件,格式为 tee [参数] 目标文件

默认新建、覆盖目标文件,使用参数 -a 可以附加到已有文件的后方,参数 -i 忽略中断信号。目标文件可以是多个,用空格隔开。

使用命令后会提示用户输入数据,此时键入终端的内容将被读取。也可以结合管道运算符,将上一个任务的输出保存到目标文件:python test.py | tee -a test.log

tee 实现的是复制标准输出,如果想要直接重定向所有输出,可以使用 python test.py &> test.log

注意,有时候输出内容并不会实时显示到文件中,这是因为 Python 程序中的 print() 带有输出缓冲区,需要加上参数 flush=True


Linux学习笔记 #1 终端与Shell
https://hwcoder.top/Linux-Note-1
作者
Wei He
发布于
2021年9月6日
许可协议