一台完整的计算机是由运算器、控制器、存储器、输入/输出等多种硬件设备共同组成的,而能让各种硬件设备各司其职且又能协同运行的东西就是系统内核。Linux 系统的内核负责完成对硬件资源的分配、调度等管理任务,对系统的正常运行起着十分重要的作用。

Shell 就是终端程序的统称,它充当了人与内核(硬件)之间的翻译官,用户把一些命令告诉终端程序,它就会调用相应的程序服务去完成某些工作。现在包括红帽系统在内的许多主流 Linux 系统默认使用的终端是 Bash(Bourne-Again SHell)解释器,这个 Bash 解释器主要有以下 4 项优势:

  • 通过上下方向键来调取执行过的 Linux 命令;
  • 命令或参数仅需输入前几位就可以用 Tab 键补全;
  • 具有强大的批处理脚本;
  • 具有实用的环境变量功能。

执行命令

命令    [命令参数]    [命令对象]

可选择的、可加或可不加的、非必需的参数使用中括号引起来,而命令所要求的、必须有的参数或对象值,则不带中括号。

  • 命令名称:就是语法中的动词,表达的是想要做的事情,例如创建用户、查看文件、重启系统等操作。

  • 命令参数:用于对命令进行调整,让修改过的命令能更好地贴合工作需求,达到事半功倍的效果。

Linux 命令参数的长格式与短格式示例:

类别示例
长格式man —help
短格式man -h
  • 命令对象:一般指要处理的文件、目录、用户等资源名称,也就是命令执行后的承受方。例如创建一位叫小明的用户、查看一个叫工资表的文件、重启一个 IP 为 192.168.10.10 的系统等。

Linux 系统中的命令、参数、对象都是严格区分大小写的。

目录移动

Linux 终端执行命令的很多情况下需要经常的更换目录,cd 命令、pushd 命令、popd 命令可以快速移动目录。

  • cd:回到当前用户目录。
  • cd ~:回到当前用户目录(方便切换到其他用户目录)。
  • cd -:回到上次工作的目录。
  • pushd path:存入 path 目录到目录栈。
  • popd:移动到目录栈弹出的目录。
# 使用 `cd` 命令回到当前用户目录
$ cd
$ pwd
/home/username
 
# 使用 `cd ~` 命令也可以回到当前用户目录
$ cd ~
$ pwd
/home/username
 
# 使用 `cd -` 命令回到上次工作的目录
$ cd /tmp
$ cd -
$ pwd
/home/username
 
# 使用 `pushd` 命令将目录存入目录栈
$ pushd /var
/var /home/username
 
# 使用 `popd` 命令移动到目录栈弹出的目录
$ popd
/home/username

快捷键

快捷键功能描述
Tab自动补全命令或文件名
Ctrl+C终止当前命令
Ctrl+Z将当前进程放到后台
Ctrl+D退出当前终端
Ctrl+L清屏
Ctrl+U删除从光标位置到行首的字符
Ctrl+K删除从光标位置到行尾的字符
Ctrl+A移动光标到行首
Ctrl+E移动光标到行尾
Ctrl+R反向搜索命令历史
Ctrl+W删除光标前的一个单词
Ctrl+Y粘贴由 Ctrl+U、Ctrl+K 或 Ctrl+W 删除的文本
Ctrl+T交换光标处字符与之前的字符
Alt+B向后移动一个单词(或 Ctrl+ 左箭头)
Alt+F向前移动一个单词(或 Ctrl+ 右箭头)
Ctrl+Shift+C复制(部分图形终端)
Ctrl+Shift+V粘贴(部分图形终端)

特殊符号

符号功能描述
!!引用上一条命令。例如,如果上一条命令是 ls -l,那么输入 !! 将再次执行 ls -l
!$引用上一条命令的最后一个参数。例如,如果上一条命令是 cp /some/long/path /another/path,那么输入 cd !$ 将执行 cd /another/path
!string引用最近一条以 string 开头的命令。例如,如果你之前执行过 ls -l,那么输入 !ls 将再次执行 ls -l
^string1^string2^快速替换上一条命令中的字符串并执行。例如,如果上一条命令是 cat file1,那么输入 ^file1^file2^ 将执行 cat file2
&&逻辑 AND。如果前一个命令成功执行(退出状态为 0),则执行后一个命令。例如,command1 && command2 会在 command1 成功后执行 command2
;命令分隔符。允许在一行中执行多个命令。例如,command1; command2 会依次执行 command1command2,不考虑前一个命令的成功与否。
>输出重定向。将命令的输出写入到文件中,而不是显示在屏幕上。例如,ls -l > file.txtls -l 的输出保存到 file.txt
>>追加输出重定向。将命令的输出追加到现有文件的末尾。例如,echo "hello" >> file.txt 将追加 “hello” 到 file.txt
<输入重定向。使用文件作为命令的输入。例如,cat < file.txt 会显示 file.txt 的内容。
反引号。执行其中的命令,并将输出作为另一个命令的参数。例如,echo “Today is `date`” 会显示今天的日期。
$( )命令替换。类似于反引号,但更易读,易用。例如,echo "Today is $(date)" 会显示今天的日期。
{ }大括号扩展。生成序列或列表。例如,echo {1..5} 会输出 1 2 3 4 5
#注释符号。# 后面的内容将被视为注释,不会被执行。例如,# This is a comment

常用命令

文件操作

命令全拼说明
lslist列出目录中的文件列表
cdchange directory更改当前工作目录
pwdprint working directory显示当前工作目录
mkdirmake directory创建新目录
rmdirremove directory删除空目录
touchtouch创建新文件
cpcopy复制文件或目录
mvmove移动文件或目录
rmremove删除文件或目录

文件处理

命令全拼说明
catconcatenate查看、合并文件内容
headhead查看文件头部内容
tailtail查看文件尾部内容
grepglobal regular expression print在文件中查找指定文本
sedstream editor流编辑器,用于对文件进行基本文本处理
awkawk文本和数据处理工具

系统管理

命令全拼说明
psprocess status查看进程状态
toptop实时查看系统进程状态
killkill终止进程
shutdownshutdown关闭系统
rebootreboot重启系统
unameuname显示系统信息
dfdisk free显示磁盘使用情况
dudisk usage显示目录空间使用情况
freefree显示系统内存使用情况

网络管理

命令命令全拼描述
ipinternet protocol显示和配置网络接口信息
pingping测试主机之间的连通性
nslookupname server lookup查询域名解析信息
traceroutetrace route显示数据包到达目的地经过的路由信息
routeroute显示和配置系统的路由表
netstatnetwork statistics显示网络连接状态和统计信息
tcpdumpTCP dump抓取网络数据包并进行分析

权限管理

命令命令全拼描述
chmodchange mode修改文件或目录的访问权限
chownchange owner修改文件或目录的所有者
chgrpchange group修改文件或目录的所属组
useradduser add添加用户账号
usermoduser modify修改用户账号信息
userdeluser delete删除用户账号
groupaddgroup add添加用户组
groupmodgroup modify修改用户组信息
groupdelgroup delete删除用户组
passwdpassword修改用户密码
suswitch user切换用户身份
sudosuperuser do以超级用户身份执行命令
visudovisual sudo编辑 sudo 配置文件
ididentity显示当前用户信息
whoamiwho am i显示当前登录用户名

软件管理

命令全拼说明
apt-getAdvanced Packaging ToolUbuntu 系统软件包管理工具
yumYellowdog Updater ModifiedCentOS、Fedora 等系统软件包管理工具
dpkgDebian PackageDebian、Ubuntu 等系统软件包管理工具
rpmRed Hat Package ManagerCentOS、Fedora 等系统软件包管理工具

磁盘管理

命令全拼描述
dfdisk filesystem显示磁盘空间使用情况
dudisk usage显示文件和目录的磁盘使用情况
fdiskfixed disk磁盘分区管理工具
fsckfile system check检查和修复文件系统
mkfsmake filesystem创建文件系统
mountmount挂载文件系统到目录上
umountunmount卸载文件系统

进程管理

命令命令全拼描述
psprocess status显示当前进程状态
toptask-oriented processor动态显示进程信息
killkill终止一个进程
killallkillall终止一个指定名称的进程
nicenice改变进程优先级
renicerenice改变正在运行进程的优先级
jobsjobs显示当前 shell 的活动作业
bgbackground将一个进程置于后台
fgforeground将一个进程置于前台
nohupno hang up在后台运行命令,并不挂起
pstreeprocess tree显示进程树

任务

Linux 系统中运行程序时,可以选择在前台或后台运行。在前台运行时,程序会占用终端并且输出信息直接显示在终端中。而在后台运行时,程序在后台默默地执行,不会占用终端并且不会直接显示输出信息。

运行

  • & 符号:在命令的末尾添加 & 符号,例如:command &。这将使命令在后台运行。
  • nohup 命令:nohup 命令可以使命令在后台运行,并忽略挂断信号(SIGHUP),**这意味着即使你退出当前终端,程序仍会继续运行。**用法为:nohup command &
# 在后台运行 sleep 命令(这个命令仅仅会让 shell 睡眠一段时间)
$ sleep 300 &
 
# 使用 nohup 命令在后台运行 sleep 命令,并且将输出信息存入 nohup.out 文件中
$ nohup sleep 300 &
 
# 使用 nohup 命令在后台运行 sleep 命令,并且将输出信息重定向到 output.txt 文件中
$ nohup sleep 300 > output.txt &
 
# 运行一个会产生错误的命令,并将错误信息重定向到 err.txt 文件中
$ ls /nonexistent > /dev/null 2> err.txt
 
# 使用 nohup 命令在后台运行一个会产生错误的命令,并将输出和错误信息重定向到相应的文件中
$ nohup ls /nonexistent > out.txt 2> err.txt &
 
# 使用 &> 符号将标准输出和错误输出都重定向到同一个文件中
$ ls /nonexistent &> all.txt
 
# 使用 |& 符号将错误输出重定向到另一个命令的标准输入
$ ls /nonexistent |& less

管理

Jobs

jobs 命令可以列出当前终端会话中正在运行的后台任务。每个任务都有一个唯一的编号,可以使用该编号来操作任务,例如将任务切换到前台或终止任务。

# 列出当前终端会话中的后台任务
$ jobs
选项选项全拼描述
-l—list列出每个作业的进程 ID 号
-p—pid仅列出作业的进程 ID 号
-n—new显示自上次通知以后已更改的作业
-r—running仅列出运行中的作业
-s—stopped仅列出停止的作业

fg、bg

fg 命令可以将一个后台任务切换到前台运行,bg 命令可以将一个在后台暂停的任务切换到后台继续运行。

# 将一个后台任务切换到前台运行,假设任务的编号是 1
$ fg %1
 
# 将一个后台任务切换到后台继续运行,假设任务的编号是 1
$ bg %1

Ps

ps 命令可以显示系统中所有进程的状态,包括后台运行的进程。

# 列出系统中所有进程的状态
$ ps
选项选项全拼描述
-A—all显示所有进程(在某些系统上,此选项为 -e)
-f—full完整格式列出
-u—user按用户列出
-x—all-user-processes列出所有用户的进程
-l—long长格式列出
-j—jobs工作格式列出
-r—running列出运行中的进程
-a—all-with-tty列出拥有终端的所有进程
-e—every列出所有进程(在某些系统上,此选项为 -A)
-p—pid列出指定进程号的进程

Kill

kill 命令是用于发送特定的信号到操作系统中的进程。默认情况下,如果不指定信号,kill 命令会发送 TERM (终止) 信号,这会请求一个进程自我终止。

# 终止一个后台任务,假设任务的编号是 1
$ kill %1
 
# 使用 ps 命令找到进程的 PID,然后使用 kill 命令终止进程
$ ps
$ kill PID
选项描述
-l列出所有可用的信号
-s signal指定发送的信号,可以是信号名或信号号码
-p不发送信号,只打印进程 ID
-9-KILL发送 KILL 信号强制终止进程

管道

管道命令符把前一个命令原本要输出到屏幕的信息当作后一个命令的标准输入,其执行格式为「命令 A | 命令 B」。按下键盘上的 Shift+ 反斜杠(\)键即可输入管道符,

# 输出禁止登录用户行数
grep /sbin/nologin /etc/passwd | wc -l
 
# 搜索与 bash 有关的进程
ps aux | grep bash

命令符可以无限组合,例如:命令 A | 命令 B | 命令 C |……

曾经有位东北的同学做了一个特别贴切的类比:把管道符当做流水线作业,这跟吃顿烧烤是同一个道理,即第一个人负责切肉,第二个人负责串肉,第三个人负责烧烤,最后的处理结果交付给用户。

重定向

输入重定向是指把文件导入到命令中,而输出重定向则是指把原本要输出到屏幕的数据信息写入到指定文件中。

  • 标准输入重定向(STDIN,文件描述符为 0):默认从键盘输入,也可从其他文件或命令中输入。

  • 标准输出重定向(STDOUT,文件描述符为 1):默认输出到屏幕。

  • 错误输出重定向(STDERR,文件描述符为 2):默认输出到屏幕。

对于重定向中的标准输出模式,可以省略文件描述符 1 不写,而错误输出模式的文件描述符 2 是必须要写的。

# 输入重定向:将 file1.txt 作为 sort 命令的标准输入
$ sort < file1.txt 
 
# 输入重定向并重定向输出:将 file1.txt 作为 sort 命令的输入,并将结果输出到 file2.txt 中
$ sort < file1.txt > file2.txt 
 
# Here 文档(<<):将两行 "This is a line." 作为 cat 的输入
$ cat << EOF
This is a line.
This is a line.
EOF
 
# 输出重定向:将 "Hello, World!" 输出到 output.txt 文件中(覆盖文件原有内容)
$ echo "Hello, World!" > output.txt 
 
# 错误输出重定向:将错误信息输出到 error.txt 文件中
$ ls /nonexistentdirectory 2> error.txt 
 
# 追加输出重定向:将 "Hello again!" 追加到 output.txt 文件中
$ echo "Hello again!" >> output.txt 
 
# 追加错误输出重定向:将错误信息追加到 error.txt 文件中
$ ls /anothernonexistentdirectory 2>> error.txt 
 
# 同时重定向标准输出和错误输出,追加到同一文件
$ ls /nonexistentdirectory >> all_output.txt 2>&1 
 
# 同时重定向标准输出和错误输出,追加到同一文件(简化写法)
$ ls /nonexistentdirectory &>> all_output.txt 
 

输入重定向

符号作用
命令 < 文件将文件作为命令的标准输入
命令 << 分界符从标准输入中读入,直到遇见分界符才停止
命令 < 文件 1 > 文件 2将文件 1 作为命令的标准输入并将标准输出到文件 2

输出重定向

符号作用
命令 > 文件将标准输出重定向到一个文件中(清空原有文件的数据)
命令 2> 文件将错误输出重定向到一个文件中(清空原有文件的数据)
命令 >> 文件将标准输出重定向到一个文件中(追加到原有内容的后面)
命令 2>> 文件将错误输出重定向到一个文件中(追加到原有内容的后面)
命令 >> 文件 2>&1、命令 &>> 文件将标准输出与错误输出共同写入到文件中(追加到原有内容的后面)

通配符

# 使用 * 通配符:列出所有 .txt 文件
$ ls *.txt
 
# 使用 ? 通配符:列出所有只有一个字符的 .txt 文件
$ ls ?.txt
 
# 使用 [] 通配符:列出所有以小写字母开始的 .txt 文件
$ ls [a-z]*.txt
通配符含义
*任意字符
?单个任意字符
[a-z]单个小写字母
[A-Z]单个大写字母
[a-Z]单个字母
[0-9]单个数字
:alpha:任意字母
:upper:任意大写字母
:lower:任意小写字母
:digit:所有数字
:alnum:任意字母加数字
:punct:标点符号

转义字符

# 使用反斜杠(\)使反斜杠后面的一个变量变为单纯的字符。
$ echo \$HOME
$HOME
 
# 使用单引号(' ')转义其中所有的变量为单纯的字符串。
$ echo '$HOME'
$HOME
 
# 使用双引号(" ")保留其中的变量属性,不进行转义处理。
$ echo "$HOME"
/home/username
 
# 使用反引号(` `)把其中的命令执行后返回结果。
$ echo `date`
Sun Sep 4 22:38:10 PDT 2023

环境变量

在 Linux 系统中,变量名称一般都是大写的,命令则都是小写的,这是一种约定俗成的规范。

Linux 系统中最重要的 10 个环境变量

变量名称作用
HOME用户的主目录(即家目录)
SHELL用户在使用的 Shell 解释器名称
HISTSIZE输出的历史命令记录条数
HISTFILESIZE保存的历史命令记录条数
MAIL邮件保存路径
LANG系统语言、语系名称
RANDOM生成一个随机数字
PS1Bash 解释器的提示符
PATH定义解释器搜索用户执行命令的路径
EDITOR用户默认的文本编辑器

帮助文档

Man

使用 man 命令查看到的帮助内容信息

按键作用
空格键向下翻一页
PaGe down向下翻一页
PaGe up向上翻一页
home直接前往首页
end直接前往尾页
/从上至下搜索某个关键词,如“/linux”
?从下至上搜索某个关键词,如“?linux”
n定位到下一个搜索到的关键词
N定位到上一个搜索到的关键词
q退出帮助文档

示例

# 查看 man 的帮助文件
man man
 
# 查看 ssh 的帮助文件
man sh