1、Linux基础
1.1、用户类型
- root用户
- 一个特殊的管理账户(超级用户)
- 可以对系统几乎完整的控制
- 有对系统进行几乎无限损害的权限
- 生产环境中,root权限不轻易授权给其他用户
- 除非必要,不能直接登录root
- 普通用户(非特权用户)
- 权限有限
- 造成损害的能力有限
1.2、终端Terminal
- 终端设备:键盘、鼠标、显示器
- 控制台终端:/dev/console
- 串行终端:/dev/ttyS#
- 虚拟终端:tty:teletypewriters /dev/tty# tty可以有多个 Ctrl+Alt+(F1/F2/F3/F4)
- 伪终端:pty:pseudo-tty /dev/pts/# SSH远程连接
- 图形终端:startx、xwindows
#查看当前所在终端
[root@centos79 ~]# tty
/dev/pts/0
1.3、交互式接口
交互式接口:启动中端口,在终端设备附加一个交互式应用程序
- GUI:Graphic User Interface X protocol, window manager, desktop
GNOME (C, 图形库gtk),KDE (C++,图形库qt),XFCE (轻量级桌面) - CLI:Command Line Interface
shell程序
1.4、Shell
![图片[1]-Linux入门-李佳程的个人主页](http://39.101.72.1/wp-content/uploads/2022/11/image-21.png)
Shell 是Linux系统的用户界面,提供了用户与内核进行交互操作的一种接口。它接收用户输入的命令并把它送入内核去执行;
Shell也被称为LINUX的命令解释器(command interpreter),Shell 本身是一个程序。将用户输入的
命令行拆解为”命令名“与”参数“。接着,根据命令名找到对应要执行的程序,对被执行的程序进行初始化,然后将刚才解析出来的参数传给该程序并执行;
Shell是一种高级程序设计语言,提供了变量,函数,条件判断,循环等开发语言的功能由于Shell本身是个程序,所以它可以被任何用户自己开发的各种Shell所代替;
Shell种类
![图片[2]-Linux入门-李佳程的个人主页](http://39.101.72.1/wp-content/uploads/2022/11/image-22.png)
- sh:Steve Bourne
- bash:Bourne-Again Shell,GPL,CentOS 和 Ubuntu 默认使用
- csh:c shell , C 语言风格
- tcsh
- ksh :Korn Shell, AIX 默认 shell
- zsh: MacOS默认shell
#GNU Bourne-Again Shell(bash)是GNU计划中重要的工具软件之一,目前也是 Linux标准的shell,与sh兼容
#显示当前使用的shell
[root@centos79 ~]# echo ${SHELL}
/bin/bash
#显示当前系统使用的所有shell
[root@centos79 ~]# cat /etc/shells
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
/usr/bin/tmux
1.5、设置主机名
#主机名不支持使用下划线,但支持横线,可使用字母,横线或数字组合
#有些软件对主机名有特殊要求
#临时生效
hostname NAME
#范例
[root@centos79 ~]# hostname centos7-9-test
[root@centos79 ~]# su -
Last login: Tue Nov 8 15:52:52 CST 2022 on pts/0
[root@centos7-9-test ~]#
#持久生效
hostnamectl set-hostname NAME
#范例
[root@centos7-9-test ~]# hostnamectl set-hostname centos79_test
[root@centos7-9-test ~]# su -
Last login: Tue Nov 8 15:53:28 CST 2022 on pts/0
[root@centos79_test ~]#
1.6、执行命令
输入命令后回车,shell程序找到键入命令所对应的可执行程序或代码,并由其分析后提交给内核分配资源将其运行起来。
可执行的两种命令:
- 内部命令:由shell自带的,而且通过某命令形式提供, ,用户登录后自动加载并常驻内存中;
- 外部命令:在文件系统路径下有对应的可执行程序文件,当执行命令时才从磁盘加载至内存中,执行完毕后从内存中删除;
#区别命令是内部或外部命令
type COMMAND
#范例:查看是否存在对应内部和外部命令
[root@centos79_test ~]# type -a echo
echo is a shell builtin
echo is /bin/echo
echo is /usr/bin/echo
内部命令相关
- help 列出内部命令
- enable 管理内部命令
- enable cmd 启用内部命令
- enable –n cmd 禁用内部命令
- enable –n 查看所有禁用的内部命令
执行外部命令
- which -a
- which –skip-alias
- whereis
Hash缓存表
系统初始hash表为空,当外部命令执行时,默认会从PATH路径下寻找该命令,找到后会将这条命令的
路径记录到hash表中,当再次使用该命令时,shell解释器首先会查看hash表,存在将执行之,如果不存在,将会去PATH路径下寻找,利用hash缓存表可大大提高命令的调用速率。
- hash 显示hash缓存
- hash -l 显示hash缓存,可作为输入使用
- hash -p path name 将命令全路径path起别名为name
- hash -t name 打印缓存中name的路径
- hash -d name 清除name缓存
- hash -r 清除缓存
命令别名
对于经常执行的较长的命令,可以将其定义成较短的别名,以方便执行。
#显示当前shell进程所有可用的命令别名
[root@centos79_test ~]# alias
alias cp='cp -i'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
#定义别名NAME,其相当于执行命令VALUE
alias NAME='VALUE'
#撤消别名:unalias
unalias [-a] name [name ...]
unalias -a #取消所有别名
#在命令行中定义的别名,仅对当前shell进程有效
#如果想永久有效,要定义在配置文件中
#仅对当前用户:~/.bashrc
#对所有用户有效:/etc/bashrc
#编辑配置给出的新配置不会立即生效,bash进程重新读取配置文件
source /path/to/config_file
. /path/to/config_file
命令格式
COMMAND [OPTIONS...] [ARGUMENTS...]
COMMAND [COMMAND] [COMMAND] ....
- 选项:用于启用或关闭命令的某个或某些功能
- 短选项:UNIX 风格选项,-c 例如:-l, -h
- 长选项:GNU风格选项,–word 例如:–all, –human
- BSD风格选项: 一个字母,例如:a,使用相对较少
- 参数:命令的作用对象,比如:文件名,用户名等
[root@centos79_test ~]# id -u test
1000
[root@centos79_test ~]# ls -a
[root@centos79_test ~]# ls --all
[root@centos79_test ~]# free -h
[root@centos79_test ~]# free --human
[root@centos79_test ~]# ps a
- 多个选项以及多参数和命令之间使用空白字符分隔
- 取消和结束命令执行:Ctrl+c,Ctrl+d
- 多个命令可以用 “;” 符号分开
- 一个命令可以用\分成多行
1.7、常用命令
查看CPU
lscpu命令可以查看cpu信息
cat /proc/cpuinfo也可看查看到
[root@centos79_test ~]# lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 2
On-line CPU(s) list: 0,1
Thread(s) per core: 1 #每个core 有1个线程
Core(s) per socket: 1 #每个槽位有1个core
Socket(s): 2 #服务器面板上有2个cpu 槽位
NUMA node(s): 1 #nodes的数量
Vendor ID: GenuineIntel
CPU family: 6
Model: 167
Model name: 11th Gen Intel(R) Core(TM) i5-11400 @ 2.60GHz
Stepping: 1
CPU MHz: 2592.004
BogoMIPS: 5184.00
Hypervisor vendor: VMware
Virtualization type: full
L1d cache: 48K
L1i cache: 32K
L2 cache: 512K
L3 cache: 12288K
NUMA node0 CPU(s): 0,1 #对应的core
查看内存
[root@centos79_test ~]# free -h
total used free shared buff/cache available
Mem: 3.7G 235M 3.3G 11M 124M 3.3G
Swap: 2.0G 0B 2.0G
[root@centos79_test ~]# cat /proc/meminfo
MemTotal: 3861288 kB
MemFree: 3492760 kB
MemAvailable: 3430576 kB
Buffers: 2108 kB
Cached: 106080 kB
SwapCached: 0 kB
Active: 80728 kB
Inactive: 74628 kB
Active(anon): 47928 kB
Inactive(anon): 11160 kB
Active(file): 32800 kB
Inactive(file): 63468 kB
Unevictable: 0 kB
Mlocked: 0 kB
SwapTotal: 2097148 kB
SwapFree: 2097148 kB
Dirty: 0 kB
Writeback: 0 kB
AnonPages: 47168 kB
Mapped: 23836 kB
Shmem: 11920 kB
Slab: 50036 kB
SReclaimable: 19616 kB
SUnreclaim: 30420 kB
KernelStack: 4288 kB
PageTables: 5144 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 4027792 kB
Committed_AS: 305872 kB
VmallocTotal: 34359738367 kB
VmallocUsed: 182880 kB
VmallocChunk: 34359310332 kB
Percpu: 22528 kB
HardwareCorrupted: 0 kB
AnonHugePages: 6144 kB
CmaTotal: 0 kB
CmaFree: 0 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
DirectMap4k: 98112 kB
DirectMap2M: 3047424 kB
DirectMap1G: 3145728 kB
查看硬盘
[root@centos79_test ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 19G 0 part
├─centos-root 253:0 0 17G 0 lvm /
└─centos-swap 253:1 0 2G 0 lvm [SWAP]
sr0 11:0 1 4.4G 0 rom
[root@centos79_test ~]# cat /proc/partitions
major minor #blocks name
11 0 4601856 sr0
8 0 20971520 sda
8 1 1048576 sda1
8 2 19921920 sda2
253 0 17821696 dm-0
253 1 2097152 dm-1
查看系统版本
[root@centos79_test ~]# arch
x86_64
[root@centos79_test ~]# uname -r
3.10.0-1160.el7.x86_64
[root@centos79_test ~]# cat /etc/os-release
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"
CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"
[root@centos79_test ~]# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)
日期和时间
- Linux的两种时钟
- 系统时钟:由Linux内核通过CPU的工作频率进行的
- 硬件时钟:主板
#date 显示和设置系统时间
[root@centos79_test ~]# date +%s
1667895959
[root@centos79_test ~]# date -d @`date +%s`
Tue Nov 8 16:26:04 CST 2022
[root@centos79_test ~]# date -d @1584689051
Fri Mar 20 15:24:11 CST 2020
[root@centos79_test ~]# date -d @1584689051 +%F_%T
2020-03-20_15:24:11
[root@centos79_test ~]# date -d "2020-02-02" +%s
1580572800
#clock,hwclock: 显示硬件时钟
-s, --hctosys #以硬件时钟为准,校正系统时钟
-w, --systohc #以系统时钟为准,校正硬件时钟
[root@centos79_test ~]# ll /usr/sbin/clock
lrwxrwxrwx. 1 root root 7 Nov 8 14:51 /usr/sbin/clock -> hwclock
#时区
/etc/localtime
timedatectl list-timezones
timedatectl set-timezone Asia/Shanghai
timedatectl status
ll /etc/localtime
cat /etc/timezone
[root@centos79_test ~]# timedatectl set-timezone Asia/Shanghai
[root@centos79_test ~]# timedatectl status
Local time: Tue 2022-11-08 16:28:35 CST
Universal time: Tue 2022-11-08 08:28:35 UTC
RTC time: Tue 2022-11-08 08:28:35
Time zone: Asia/Shanghai (CST, +0800)
NTP enabled: n/a
NTP synchronized: no
RTC in local TZ: no
DST active: n/a
[root@centos79_test ~]# ll /etc/localtime
lrwxrwxrwx. 1 root root 35 Nov 8 14:53 /etc/localtime -> ../usr/share/zoneinfo/Asia/Shanghai
#修改时间
[root@centos79_test ~]# date -s 8:31:40
Tue Nov 8 08:31:40 CST 2022
#同步到硬件
[root@centos79_test ~]# hwclock --systohc
关机和重启
- 关机:
- halt
- poweroff
- 重启:
- reboot
- -f: 强制,不调用shutdown
- -p: 切断电源
- ctrl+alt+delete 三个键
- reboot
- 关机或重启:shutdown
shutdown [OPTION]... [TIME] [MESSAGE]
-r: reboot
-h: halt
-c:cancel
TIME:无指定,默认相当于+1(CentOS7)
now: 立刻,相当于+0
+#: 相对时间表示法,几分钟之后;例如 +3
hh:mm: 绝对时间表示,指明具体时间
用户登录信息查看命令
- whoami: 显示当前登录有效用户
- who: 系统当前所有的登录会话
- w: 系统当前所有的登录会话及所做的操作
输出信息 echo
echo 命令可以将后面跟的字符进行输出
功能:显示字符,echo会将输入的字符串送往标准输出,输出的字符串间以空白字符隔开, 并在最后加上换行号。
echo [-neE][字符串]
- 选项:
- -E (默认)不支持 \ 解释功能
- -n 不自动换行
- -e 启用 \ 字符的解释功能
#显示变量
echo "$VAR_NAME” #用变量值替换,弱引用
echo '$VAR_NAME’ #变量不会替换,强引用
启用命令选项-e,若字符串中出现以下字符,则特别加以处理,而不会将它当成一般文字输出
- \a 发出警告声
- \b 退格键
- \c 最后不加上换行符号
- \e escape,相当于\033
- \n 换行且光标移至行首
- \r 回车,即光标移至行首,但不换行
- \t 插入tab
- \ 插入\字符
- \0nnn 插入nnn(八进制)所代表的ASCII字符
- \xHH插入HH(十六进制)所代表的ASCII数字(man 7 ascii)
1.8、命令行扩展和被括起来的集合
命令行扩展:“ 和 $()
把一个命令的输出打印给另一个命令的参数,放在“中的一定是有输出信息的命令。
$(COMMAND)
`COMMAND`
#比较 “ ” ,‘ ’, ``三者区别
[root@centos79_test ~]# echo "echo $HOSTNAME"
echo centos79_test
[root@centos79_test ~]# echo 'echo $HOSTNAME'
echo $HOSTNAME
[root@centos79_test ~]# echo `echo $HOSTNAME`
centos79_test
- 单引号:强引用,都当成了普通的字符串;
- 双引号:弱引用,不能识别命令,可以识别变量;
- 反向单引号:里面的内容必须是能执行的命令并且有输出信息,变量和命令都识别,并且会将反向单引号的内容当成命令进行执行后,再交给调用反向单引号的命令继续;
#比较$( ) 和 ``
[root@centos79_test ~]# touch `echo `date +%F`.txt`
-bash: .txt: command not found
[root@centos79_test ~]# ll
total 4
-rw-------. 1 root root 1447 Nov 8 2022 anaconda-ks.cfg
-rw-r--r-- 1 root root 0 Nov 8 08:50 date
-rw-r--r-- 1 root root 0 Nov 8 08:50 +%F
[root@centos79_test ~]# touch $(echo $(date +%F).txt)
[root@centos79_test ~]# ll
total 4
-rw-r--r-- 1 root root 0 Nov 8 08:50 2022-11-08.txt
-rw-------. 1 root root 1447 Nov 8 2022 anaconda-ks.cfg
-rw-r--r-- 1 root root 0 Nov 8 08:50 date
-rw-r--r-- 1 root root 0 Nov 8 08:50 +%F
[root@centos79_test ~]# touch `echo $(date +%F).txt`
[root@centos79_test ~]# ll
total 4
-rw-r--r-- 1 root root 0 Nov 8 08:51 2022-11-08.txt
-rw-------. 1 root root 1447 Nov 8 2022 anaconda-ks.cfg
-rw-r--r-- 1 root root 0 Nov 8 08:50 date
-rw-r--r-- 1 root root 0 Nov 8 08:50 +%F
[root@centos79_test ~]# touch $(echo `date +%F`.txt)
[root@centos79_test ~]# ll
total 4
-rw-r--r-- 1 root root 0 Nov 8 08:52 2022-11-08.txt
-rw-------. 1 root root 1447 Nov 8 2022 anaconda-ks.cfg
-rw-r--r-- 1 root root 0 Nov 8 08:50 date
-rw-r--r-- 1 root root 0 Nov 8 08:50 +%F
括号扩展:{ }
{} 可以实现打印重复字符串的简化形式
{元素1,元素2,元素3}
{元素1..元素2}
#范例
[root@centos79_test file]# echo file{1,3,5}
file1 file3 file5
[root@centos79_test file]# echo {1..10}
1 2 3 4 5 6 7 8 9 10
[root@centos79_test file]# echo {1..10..2}
1 3 5 7 9
[root@centos79_test file]# echo {000..20..2}
000 002 004 006 008 010 012 014 016 018 020
[root@centos79_test file]# echo {a..z}
a b c d e f g h i j k l m n o p q r s t u v w x y z
[root@centos79_test file]# echo {a..z} {A..Z}
a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
[root@centos79_test file]# echo {A..z}
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z
1.9、tab键补全
命令补全
tab 键可以实现命令及路径等补全,提高输入效率,避免出错
- bash根据PATH环境变量定义的路径,自左而右在每个路径搜寻以给定命令名命名的文件,第一次找到的命令即为要执行的命令;
- 命令的子命令补全,需要安装 bash-completion;
- 用户给定的字符串只有一条惟一对应的命令,直接补全,否则,再次Tab会给出列表
路径补全
把用户给出的字符串当做路径开头,并在其指定上级目录下搜索以指定的字符串开头的文件名如果惟一则直接补全,否则再次Tab给出列表
双击tab键
- command 2Tab 所有子命令或文件补全
- string2Tab 以string开头命令
- /2Tab 显示所有根目录下一级目录,包括隐藏目录
- ./2Tab 当前目录下子目录,包括隐藏目录
- *2Tab 当前目录下子目录,不包括隐藏目录
- ~2Tab 所有用户列表
- $2Tab 所有变量
- @2Tab /etc/hosts记录 (centos7 不支持)
- =2Tab 相当于ls –A (centos7不支持)
1.10、命令行历史
- 当执行命令后,系统默认会在内存记录执行过的命令;
- 当用户正常退出时,会将内存的命令历史存放对应历史文件中,默认是 ~/.bash_history;
- 登录shell时,会读取命令历史文件中记录下的命令加载到内存中;
- 登录进shell后新执行的命令只会记录在内存的缓存区中;这些命令会用户正常退出时“追加”至命令历史文件中;
- 利用命令历史,可以用它来重复执行命令,提高输入效率;
history [-c] [-d offset] [n]
history -anrw [filename]
history -ps arg [arg...]
- -c: 清空命令历史
- -d offset: 删除历史中指定的第offset个命令
- n: 显示最近的n条历史
- -a: 追加本次会话新执行的命令历史列表至历史文件
- -r: 读历史文件附加到历史列表
- -w: 保存历史列表到指定的历史文件
- -n: 读历史文件中未读过的行到历史列表
- -p: 展开历史参数成多行,但不存在历史列表中
- -s: 展开历史参数成一行,附加在历史列表后
命令历史相关环境变量
HISTSIZE:命令历史记录的条数
HISTFILE:指定历史文件,默认为~/.bash_history
HISTFILESIZE:命令历史文件记录历史的条数
HISTTIMEFORMAT="%F %T `whoami` " 显示时间和用户
HISTIGNORE="str1:str2*:…" 忽略str1命令,str2开头的历史
HISTCONTROL:控制命令历史的记录方式
ignoredups 是默认值,可忽略重复的命令,连续且相同为“重复”
ignorespace 忽略所有以空白开头的命令
ignoreboth 相当于ignoredups, ignorespace的组合
erasedups 删除重复命令
持久保存变量
以上变量可以 export 变量名=”值” 形式存放在 /etc/profile 或 ~/.bash_profile
调用命令行历史
#重复前一个命令方法
重复前一个命令使用上方向键,并回车执行
按 !! 并回车执行
输入!-1 并回车执行
按 Ctrl+p 并回车执行
!:0 执行前一条命令(去除参数)
!n 执行history命令输出对应序号n的命令
!-n 执行history历史中倒数第n个命令
!string 重复前一个以“string”开头的命令
!?string 重复前一个包含string的命令
!string:p 仅打印命令历史,而不执行
!$:p 打印输出 !$ (上一条命令的最后一个参数)的内容
!*:p 打印输出 !*(上一条命令的所有参数)的内容
^string 删除上一条命令中的第一个string
^string1^string2 将上一条命令中的第一个string1替换为string2
!:gs/string1/string2 将上一条命令中所有的string1都替换为 string2
使用up(向上)和down(向下)键来上下浏览从前输入的命令
ctrl-r来在命令历史中搜索命令
(reverse-i-search)`’:
Ctrl+g:从历史搜索模式退出
#要重新调用前一个命令中最后一个参数
!$ 表示前一个命令中最后一个参数
Esc, . 点击Esc键后松开,然后点击 . 键
Alt+ . 按住Alt键的同时点击 . 键
command !^ 利用上一个命令的第一个参数做command的参数
command !$ 利用上一个命令的最后一个参数做command的参数
command !* 利用上一个命令的全部参数做command的参数
command !:n 利用上一个命令的第n个参数做command的参数
command !n:^ 调用第n条命令的第一个参数
command !n:$ 调用第n条命令的最后一个参数
command !n:m 调用第n条命令的第m个参数
command !n:* 调用第n条命令的所有参数
command !string:^ 从命令历史中搜索以 string 开头的命令,并获取它的第一个参数
command !string:$ 从命令历史中搜索以 string 开头的命令,并获取它的最后一个参数
command !string:n 从命令历史中搜索以 string 开头的命令,并获取它的第n个参数
command !string:* 从命令历史中搜索以 string 开头的命令,并获取它的所有参数
1.11、bash快捷键
Ctrl + l 清屏,相当于clear命令
Ctrl + o 执行当前命令,并重新显示本命令
Ctrl + s 阻止屏幕输出,锁定
Ctrl + q 允许屏幕输出,解锁
Ctrl + c 终止命令
Ctrl + z 挂起命令
Ctrl + a 光标移到命令行首,相当于Home
Ctrl + e 光标移到命令行尾,相当于End
Ctrl + f 光标向右移动一个字符
Ctrl + b 光标向左移动一个字符
Ctrl + xx 光标在命令行首和光标之间移动
ctrl+ > 光标向右移动一个单词尾,相当于 Alt + f
ctrl+ < 光标向左移动一个单词首,相当于 Alt + b
Ctrl + u 从光标处删除至命令行首
Ctrl + k 从光标处删除至命令行尾
Alt + r 删除当前整行
Ctrl + w 从光标处向左删除至单词首
Alt + d 从光标处向右删除至单词尾
Alt + Backspace 删除左边单词
Ctrl + d 删除光标处的一个字符
Ctrl + h 删除光标前的一个字符
Ctrl + y 将删除的字符粘贴至光标后
Alt + c 从光标处开始向右更改为首字母大写的单词
Alt + u 从光标处开始,将右边一个单词更改为大写
Alt + l 从光标处开始,将右边一个单词更改为小写
Ctrl + t 交换光标处和之前的字符位置
Alt + t 交换光标处和之前的单词位置
Alt + # 提示输入指定字符后,重复显示该字符#次
Alt 组合快捷键经常和其它软件冲突
xshell中启动 alt 键
![图片[3]-Linux入门-李佳程的个人主页](http://39.101.72.1/wp-content/uploads/2022/11/image-23.png)