Linux 学习笔记 2022-11-12---------Linux基础

Posted Amo Xiang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux 学习笔记 2022-11-12---------Linux基础相关的知识,希望对你有一定的参考价值。

目录

1. 用户类型

root 用户: 一个特殊的管理帐户,也被称为超级用户,root 已接近完整的系统控制,对系统损害几乎有无限的能力,除非必要,不要登录为 root。
普通(非特权)用户: 权限有限,造成损害的能力比较有限。

2. 终端 terminal

2.1 终端类型

控制台终端: 在现代 Linux 上,console 终端已经和原始的意义不太一样了,其设备映射在 /dev/console 上,所有内核输出的信息都输出到 console 终端,而其他用户程序输出的信息则输出到虚拟终端或伪终端。

虚拟终端: Linux 提供了很多种虚拟终端,使用 ttyN 表示,使用 Ctrl+Alt+F[1-6] 可以进行虚拟终端的切换,这些终端设备记录在 /dev/ 目录下。

tty 加上数值的就是虚拟终端,Ctrl+Alt+F1 表示切换到 tty1 终端,Ctrl+Alt+F2 表示切换到 tty2 终端,一般 Linux 上只提供了 Ctrl+Alt+F[1-6] 这6个终端之间切换的功能。两个特殊的终端是 tty 和 tty0,tty 表示当前正在使用的终端,tty0 表示当前已被激活的所有虚拟终端。还有 /dev/ttySN,这些表示串行终端。

图形终端: Startx、Xwindows

 CentOS 6: Ctrl + Alt + F7
 CentOS 7: 在哪个终端启动,即位于哪个虚拟终端

伪终端: 从 SSH 或 Telnet 等从网络连接到电脑上的终端,或者从图形虚拟终端打开的命令行终端,都称为伪终端,使用 pts/N 表示,对应的设备为 /dev/pts 目录下的数值N文件。

0 表示第一个伪终端,1表示第二个伪终端。说明:

伪终端和其它所有终端的管理方式都不一样,它是通过连接电脑的程序管理的,例如 SSH 连接则由 SSH 负责申请伪终端资源,并要求输入用户名和密码。如果 SSH 连接进程被杀,则此伪终端也相应的退出。另外,有些身份验证的程序并非一定会为连接从程序分配终端,例如执行 sudo ssh 时,sudo 就不一定会为 SSH 分配伪终端。

2.2 查看当前的终端设备

tty 命令可以查看当前所在终端,如下图所示:

其他命令:

  1. init 3 -->切换到完全的命令行模式,就是标准字符界面
  2. init 5 -->切换到图形模式(前提是安装了图形界面才可以)
  3. runlevel --> 查看系统的运行级别 命令执行后,返回两个数字,第1个数字代表在进入这个级别前,上一个级别是什么;第2个数字代表当前级别,示例如下:
  4. w --> w 命令用于显示目前登入系统的用户信息。执行这项指令可得知目前登入系统的用户有哪些人,以及他们正在执行的程序。单独执行 w 指令会显示所有的用户,也可指定用户名称,仅显示某位用户的相关信息。示例如下:

    详细用法:https://www.runoob.com/linux/linux-comm-w.html
  5. hostname -I 显示主机的所有IP地址
  6. who 命令:Linux 中 who 命令用于显示系统中有哪些使用者正在上面,显示的资料包含了使用者 ID、使用的终端机、从哪边连上来的、上线时间、呆滞时间、CPU 使用量、动作等等。

    补充说明: whoami 显示的是当前 操作用户 的用户名,而 who am i 显示的是 登录用户 的用户名。

3. 交互式接口

交互式接口:启动终端后,在终端设备附加一个交互式应用程序

3.1 交互式接口类型

GUI:Graphic User Interface,X protocol、Window manager、Desktop

Desktop: GNOME (C, 图形库gtk),KDE (C++,图形库qt),XFCE (轻量级桌面)

CLI:Command Line Interface ==> shell 程序

对于图形界面,用户点击某个图标就能启动某个程序;对于命令行,用户输入某个程序的名字(可以看做一个命令) 就能启动某个程序。这两者的基本过程都是类似的,都需要查找程序在硬盘上的安装位置,然后将它们加载到内存运行。换句话说,图形界面和命令行要达到的目的是一样的,都是让用户控制计算机。然而,真正能够控制计算机硬件(CPU、内存、显示器等) 的只有操作系统内核(Kernel),图形界面和命令行只是架设在用户和内核之间的一座桥梁。

3.2 什么是shell

由于安全、复杂、繁琐等原因,用户不能直接接触内核(也没有必要),需要另外再开发一个程序,让用户直接使用这个程序;该程序的作用就是接收用户的操作(点击图标、输入命令),并进行简单的处理,然后再传递给内核,这样用户就能间接地使用操作系统内核了。在用户和内核之间增加一层 代理,既能简化用户的操作,又能保障内核的安全,何乐不为呢。

用户界面和命令行就是这个另外开发的程序,就是这层 代理。在 Linux 下,这个命令行程序叫做 Shell。

Shell 是一个应用程序,它连接了用户和 Linux 内核,让用户能够更加高效、安全、低成本地使用 Linux 内核,这就是 Shell 的本质。Shell 也被称为 LINUX 的命令解释器(Command Interpreter) 注意:由于 Shell 本身是个程序,所以它可以被任何用户自己开发的各种 Shell 所代替。 各种 Shell 如下图所示:

说明如下:

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,输入命令:echo $SHELL,如下图所示:

显示当前系统使用的所有 Shell,输入命令:cat /etc/shells,如下图所示:

Shell 本身并不是内核的一部分,它只是站在内核的基础上编写的一个应用程序,它和 QQ、迅雷、Firefox 等其它软件没有什么区别。然而 Shell 也有着它的特殊性,就是开机立马启动,并呈现在用户面前;用户通过 Shell 来使用 Linux,不启动 Shell 的话,用户就没办法使用 Linux。简而言之,Shell 是 Linux 系统的用户界面,提供了用户与内核进行交互操作的一种接口,它接收用户输入的命令并把它送入内核去执行。

3.3 Shell 是如何连接用户和内核的?

Shell 能够接收用户输入的命令,将用户输入的命令行拆解为 命令名参数。接着,根据命令名找到对应要执行的程序,对被执行的程序进行初始化,然后将刚才解析出来的参数传给该程序并执行,处理完毕后再将结果反馈给用户,比如输出到显示器、写入到文件等,这就是大部分读者对 Shell 的认知。

Shell 程序本身的功能是很弱的,比如文件操作、输入输出、进程管理等都得依赖内核。我们运行一个命令,大部分情况下 Shell 都会去调用内核暴露出来的接口,这就是在使用内核,只是这个过程被 Shell 隐藏了起来,它自己在背后默默进行,我们看不到而已。

接口其实就是一个一个的函数,使用内核就是调用这些函数。除了函数,你没有别的途径使用内核。比如,我们都知道在 Shell 中输入 cat log.txt 命令就可以查看 log.txt 文件中的内容,然而,log.txt 放在磁盘的哪个位置?分成了几个数据块?在哪里开始?在哪里终止?如何操作探头读取它?这些底层细节 Shell 统统不知道的,它只能去调用内核提供的 open() 和 read() 函数,告诉内核我要读取 log.txt 文件,请帮助我,然后内核就乖乖地按照 Shell 的吩咐去读取文件了,并将读取到的文件内容交给 Shell,最后再由 Shell 呈现给用户(其实呈现到显示器上还得依赖内核)。整个过程中 Shell 就是一个 中间商,它在用户和内核之间 倒卖 数据,只是用户不知道罢了。

3.4 Shell 还能连接其它程序

在 Shell 中输入的命令,有一部分是 Shell 本身自带的,这叫做内置命令;有一部分是其它的应用程序(一个程序就是一个命令),这叫做外部命令。

Shell 本身支持的命令并不多,功能也有限,但是 Shell 可以调用其他的程序,每个程序就是一个命令,这使得 Shell 命令的数量可以无限扩展,其结果就是 Shell 的功能非常强大,完全能够胜任 Linux 的日常管理工作,如文本或字符串检索、文件的查找或创建、大规模软件的自动部署、更改系统设置、监控服务器性能、发送报警邮件、抓取网页内容、压缩文件等。

更加惊讶的是,Shell 还可以让多个外部程序发生连接,在它们之间很方便地传递数据,也就是把一个程序的输出结果传递给另一个程序作为输入。

大家所说的 Shell 强大,并不是 Shell 本身功能丰富,而是它擅长使用和组织其他的程序。Shell 就是一个领导者,这正是 Shell 的魅力所在。可以将 Shell 在整个 Linux 系统中的地位描述成下图所示的样子。注意 用户其它应用程序 是通过虚线连接的,因为用户启动 Linux 后直接面对的是 Shell,通过 Shell 才能运行其它的应用程序。

3.5 Shell 也支持编程

Shell 并不是简单的堆砌命令,我们还可以在 Shell 中编程,这和使用 C++、C#、Java、Python 等常见的编程语言并没有什么两样。Shell 虽然没有 C++、Java、Python 等强大,但也支持了基本的编程元素,例如:

if...else 选择结构,case...in 开关语句,for、while、until 循环
变量、数组、字符串、注释、加减乘除、逻辑运算等概念
函数,包括用户自定义的函数和内置函数(例如 printf、export、eval 等)

站在这个角度讲,Shell 也是一种编程语言,它的编译器(解释器) 是 Shell 这个程序。我们平时所说的 Shell,有时候是指连接用户和内核的这个程序,有时候又是指 Shell 编程。Shell 主要用来开发一些实用的、自动化的小工具,而不是用来开发具有复杂业务逻辑的中大型软件,例如检测计算机的硬件参数、搭建 Web 运行环境、日志分析等,Shell 都非常合适。使用 Shell 的熟练程度反映了用户对 Linux 的掌握程度,运维工程师、网络管理员、程序员都应该学习 Shell。尤其是 Linux 运维工程师,Shell 更是必不可少的,是必须掌握的技能,它使得我们能够自动化地管理服务器集群,否则你就得一个一个地登录所有的服务器,对每一台服务器都进行相同的设置,而这些服务器可能有成百上千之多,会浪费大量的时间在重复性的工作上。

3.6 Shell 是一种脚本语言

任何代码最终都要被 翻译 成二进制的形式才能在计算机中执行。有的编程语言,如 C/C++、Pascal、Go语言、汇编等,必须在程序运行之前将所有代码都翻译成二进制形式,也就是生成可执行文件,用户拿到的是最终生成的可执行文件,看不到源码。这个过程叫做 编译(Compile),这样的编程语言叫做编译型语言,完成编译过程的软件叫做 编译器(Compiler)

而有的编程语言,如 Shell、javascript、Python、php等,需要一边执行一边翻译,不会生成任何可执行文件,用户必须拿到源码才能运行程序。程序运行后会即时翻译,翻译完一部分执行一部分,不用等到所有代码都翻译完。这个过程叫做解释,这样的编程语言叫做 解释型语言或者脚本语言(Script),完成解释过程的软件叫做 解释器

编译型语言的优点是执行速度快、对硬件要求低、保密性好,适合开发操作系统、大型应用程序、数据库等。

脚本语言的优点是使用灵活、部署容易、跨平台性好,非常适合 Web 开发以及小工具的制作。

Shell 就是一种脚本语言,我们编写完源码后不用编译,直接运行源码即可。

4. 修改主机名

主机名命令规范:

主机名不支持使用下划线,但支持横线,可使用字母,横线或数字组合
有些软件对主机名有特殊要求

临时生效,命令:hostname NAME,示例如下图所示:

持久生效,支持 CentOS7 和 Ubuntu18.04 以上版本,命令:hostnamectl set-hostname NAME,注意:该命令不会自动检测主机名是否设置正确。 也可以直接修改配置文件 /etc/hostname

有些软件对主机名有特殊要求,示例如下:

5. 命令提示符 prompt

登录 Linux 后,默认的系统命令提示符毫无没有个性,无法明显辨别生产和测试环境,而导致误操作。可以通过修改 PS1 变量实现个性的提示符格式,避免这种低级错误,默认的提示符:

简单说明:#(管理员) $(普通用户) 显示提示符格式,输入命令:echo $PS1,如下图所示:

修改提示符格式范例:

PS1="\\[\\e[1;5;41;33m\\][\\u@\\h \\W]\\\\$\\[\\e[0m\\]"
PS1="\\[\\e[1;32m\\][\\t \\[\\e[1;33m\\]\\u\\[\\e[35m\\]@\\h\\[\\e[1;31m\\] \\W\\[\\e[1;32m\\]]\\[\\e[0m\\]\\\\$"

提示符格式说明:

\\e 控制符 \\033
\\u 当前用户
\\h 主机名简称
\\H 主机名
\\w 当前工作目录
\\W 当前工作目录基名
\\t 24小时时间格式
\\T 12小时时间格式
! 命令历史数
# 开机后命令历史数

范例:在 CentOS 系统实现持久保存提示符格式,如下图所示:

6. 执行命令

6.1 Linux 命令的执行过程是怎样的?

当编辑完成 Linux 命令并回车后,系统底层到底发生了什么事情呢?简单来说,Linux 命令的执行过程分为如下 4 个步骤:
1、判断路径: 判断用户是否以绝对路径或相对路径的方式输入命令(如 /bin/ls),如果是的话直接执行。

2、检查别名: Linux 系统会检查用户输入的命令是否为 别名命令。要知道,通过 alias 命令是可以给现有命令自定义别名的,即用一个自定义的命令名称来替换原本的命令名称。

对于经常执行的较长的命令,可以将其定义成较短的别名,以方便执行,显示当前 Shell 进程所有可用的命令别名,命令:alias,如下图所示:

定义别名 NAME,其相当于执行命令 VALUE,如下所示:

alias NAME='VALUE'

示例:扫描新加的磁盘,取别名命令如下:

alias scandisk='echo - - - > /sys/class/scsi_host/host0/scan;
echo - - - >/sys/class/scsi_host/host1/scan;
echo - - - > /sys/class/scsi_host/host2/scan'

如下图所示:

撤消别名:unalias,unalias [-a] name [name …],unalias -a #取消所有别名

注意:在命令行中定义的别名,仅对当前 Shell 进程有效,如果想永久有效,要定义在配置文件中
仅对当前用户:~/.bashrc、对所有用户有效:/etc/bashrc,编辑配置给出的新配置不会立即生效,bash进程重新读取配置文件 source /path/to/config_file、. /path/to/config_file

如果别名同原命令同名,如果要执行原命令,可使用:

\\ALIASNAME
"ALIASNAME"
'ALIASNAME'
command ALIASNAME
/path/commmand   #只适用于外部命令

3、判断是内部命令还是外部命令: Linux 命令行解释器(又称为 Shell) 会判断用户输入的命令是内部命令还是外部命令。其中,内部命令指的是解释器内部的命令,会被直接执行;而用户通常输入的命令都是外部命令,这些命令交给步骤四继续处理。

内部命令由 Shell 自带,会随着系统启动,可以直接从内存中读取;而外部命令仅是在系统中有对应的可执行文件,执行时需要读取该文件。区别指定的命令是内部或外部命令:type command

示例:判断 pwd 命令与 ls 命令是外部命令还是内部命令,如下图所示:

内部命令相关:help 内部命令列表、enable 管理内部命令

enable cmd 启用内部命令
enable –n cmd 禁用内部命令
enable –n 查看所有禁用的内部命令

执行外部命令,查看外部命令路径:

which -a |--skip-alias
whereis command
which command

Hash 缓存表,系统初始 Hash 表为空,当外部命令执行时,默认会从 PATH 路径下寻找该命令,找到后会将这条命令的路径记录到 Hash 表中,当再次使用该命令时,Shell 解释器首先会查看 Hash 表,存在将执行之,如果不存在,将会去 PATH 路径下寻找,利用 Hash 缓存表可大大提高命令的调用速率,hash 命令常见用法如下:

hash 显示hash缓存
hash -l 显示hash缓存,可作为输入使用
hash -p path name 将命令全路径path起别名为name
hash -t name 打印缓存中name的路径
hash -d name 清除name缓存
hash -r 清除缓存

4、查找外部命令对应的可执行文件: 当用户执行的是外部命令时,系统会在指定的多个路径中查找该命令的可执行文件,而定义这些路径的变量,就称为 PATH 环境变量,其作用就是告诉 Shell 待执行命令的可执行文件可能存放的位置,也就是说,Shell 会在 PATH 变量包含的多个路径中逐个查找,直到找到为止(如果找不到,Shell 会提供用户 找不到此命令)。

补充1:什么是环境变量,Linux环境变量及作用。 变量是计算机系统用于保存可变值的数据类型,我们可以直接通过变量名称来提取到对应的变量值。在 Linux 系统中,环境变量是用来定义系统运行环境的一些参数,比如每个用户不同的家目录(HOME)、邮件存放位置(MAIL)等。

值得一提的是,Linux 系统中环境变量的名称一般都是大写的,这是一种约定俗成的规范。

我们可以使用 env 命令来查看到 Linux 系统中所有的环境变量,执行命令如下:

Linux 系统能够正常运行并且为用户提供服务,需要数百个环境变量来协同工作,但是,我们没有必要逐一学习每个变量,这里给大家列举了 10 个非常重要的环境变量,如下表所示:

Linux 作为一个多用户多任务的操作系统,能够为每个用户提供独立的、合适的工作运行环境,因此,一个相同的环境变量会因为用户身份的不同而具有不同的值。例如,使用下述命令来查看 HOME 变量在不同用户身份下都有哪些值:

其实,环境变量是由固定的变量名与用户或系统设置的变量值两部分组成的,我们完全可以自行创建环境变量来满足工作需求。例如,设置一个名称为 WORKDIR 的环境变量,方便用户更轻松地进入一个层次较深的目录,执行命令如下:
`
但是,这样的环境变量不具有全局性,作用范围也有限,默认情况下不能被其他用户使用。如果工作需要,可以使用 export 命令将其提升为全局环境变量,这样其他用户就可以使用它了:

补充2:Linux PATH 环境变量是什么,有什么用? 在讲解 PATH 环境变量之前,首先介绍一下 which 命令,它用于查找某个命令所在的绝对路径。例如:

通过使用 which 命令,可以查找各个外部命令(和 Shell 内置命令相对) 所在的绝对路径。学到这里,读者是否有这样一个疑问,为什么在使用 rmdir、ls 等命令时,无论当前位于哪个目录,都可以直接使用,而无需指明命令的执行文件所在的位置(绝对路径)呢?其实,这是 PATH 环境变量在起作用。首先,执行如下命令:

这里的 echo 命令用来输出 PATH 环境变量的值(这里的 $ 是 PATH 的前缀符号),PATH 环境变量的内容是由一堆目录组成的,各目录之间用冒号 : 隔开。当执行某个命令时,Linux 会依照 PATH 中包含的目录依次搜寻该命令的可执行文件,一旦找到,即正常执行;反之,则提示无法找到该命令。

如果在 PATH 包含的目录中,有多个目录都包含某命令的可执行文件,那么会执行先搜索到的可执行文件。

从执行结果中可以看到,/usr/bin/ 目录已经包含在 PATH 环境变量中,因此在使用类似 rmdir、ls 等命令时,即便直接使用其命令名,Linux 也可以找到该命令。

为了印证以上观点,下面举个反例,如果我们将 ls 命令移动到 /root 目录下,由于 PATH 环境变量中没有包含此目录,所有当直接使用 ls 命令名执行时,Linux 将无法找到此命令的可执行文件,并提示 -bash: /usr/bin/ls: No such file or directory,示例命令如下:

此时,如果仍想使用 ls 命令,有 2 种方法,一种是直接将 /root 添加到 PATH 环境变量中,例如:

注意,这种方式只是临时有效,一旦退出下次再登陆的时候,$PATH 就恢复成了默认值。

另一种方法是以绝对路径的方式使用此命令,例如:

为了不影响系统的正常使用,强烈建议大家将移动后的 ls 文件还原,命令:mv /root/ls /usr/bin/

6.2 Linux命令基本格式

6.2.1 命令提示符

登录系统后,第一眼看到的内容是:

这就是 Linux 系统的命令提示符。那么,这个提示符的含义是什么呢?

  1. []: 这是提示符的分隔符号,没有特殊含义。
  2. root: 显示的是当前的登录用户,笔者现在使用的是 root 用户登录。
  3. @: 分隔符号,没有特殊含义。
  4. centos8: 当前系统的简写主机名(完整主机名是 centos8.5-2.amo.org)。
  5. ~: 代表用户当前所在的目录,此例中用户当前所在的目录是家目录。
  6. #: 命令提示符,Linux 用这个符号标识登录的用户权限等级。如果是超级用户,提示符就是 #;如果是普通用户,提示符就是 $。
  7. 04:50:32: 当前时间

命令提示符是可以自行配置的,这里笔者进行了配置(本文 5. 命令提示符 prompt 小节有说明配置的方法)。家目录(又称主目录) 是什么? Linux 系统是纯字符界面,用户登录后,要有一个初始登录的位置,这个初始登录位置就称为用户的家:

超级用户的家目录:/root
普通用户的家目录:/home/用户名

用户在自己的家目录中拥有完整权限,所以我们也建议操作实验可以放在家目录中进行。我们切换一下用户所在目录,看看有什么效果。

仔细看,如果切换用户所在目录,那么命令提示符中的会变成用户当前所在目录的最后一个目录(不显示完整的所在目录 /usr/ local,只显示最后一个目录 local)。

6.2.2 命令的基本格式

接下来看看 Linux 命令的基本格式:

COMMAND [OPTIONS...] [ARGUMENTS...]
COMMAND [COMMAND] [COMMAND] .... 新出现的一种命令格式

命令格式中的 [] 代表可选项,也就是有些命令可以不写选项或参数,也能执行。选项的作用:有些命令之后不加选项和参数也能执行,不过只能执行最基本的功能,如:ls。Linux 的选项又分为短格式选项和长格式选项,短格式选项是英文的简写,用一个减号调用,而长格式选项是英文完整单词,一般用两个减号调用,示例如下:

一般情况下,短格式选项是长格式选项的缩写,也就是一个短格式选项会有对应的长格式选项。当然也有例外,比如 ls 命令的短格式选项 -l 就没有对应的长格式选项。所以具体的命令选项可以通过后面我们要学习的帮助命令来进行査询。总结如下:

选项:用于启用或关闭命令的某个或某些功能
短选项:UNIX 风格选项,-c 例如:-l,-h
长选项:GNU风格选项,--word 例如:--all,--human
BSD风格选项: 一个字母,例如:a,使用相对较少,例如:ps a,注意有些命令不适用 

参数的作用: 参数是命令的操作对象,一般文件、目录、用户和进程等可以作为参数被命令操作。例如:

但是为什么一开始 ls 命令可以省略参数?那是因为有默认参数。命令一般都需要加入参数,用于指定命令操作的对象是谁。如果可以省略参数,则一般都有默认参数。前一个 ls 命令后面没有指定参数,默认参数是当前所在位置,所以会显示当前目录下的文件名。

总结:命令的选项用于调整命令功能,而命令的参数是这个命令的操作对象。注意:

多个选项以及多参数和命令之间使用空白字符分隔
取消和结束命令执行:Ctrl+c,Ctrl+d
多个命令同时执行,可以用 ";" 符号分开
一个命令可以用\\分成多行

7. 输出信息 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)

示例如下:

在终端中,ANSI 定义了用于屏幕显示的 Escape 屏幕控制码,具有颜色的字符,其格式如下:

"\\033[字符背景颜色;字体颜色m字符串\\033[0m" 

设置前景色:

\\033[30m – \\033[37m #字体颜色: 30–37
30: 黑、31: 红、32: 绿、33: 黄、34: 蓝、35: 紫、36: 深绿、37: 白色

设置背景色:

\\033[40m – \\033[47m #字符背景颜色范围: 40–47
40:黑、41:红、42:绿、43:黄、44:蓝、45:紫、46:深绿、47:白色

加颜色只是以下控制码中的一种,下面是常见的一些 ANSI 控制码:

\\033[0m   关闭所有属性  
\\033[1m   设置高亮度  
\\033[4m   下划线  
\\033[5m   闪烁  
\\033[7m   反显  
\\033[8m   消隐  
\\033[nA   光标上移n行  
\\033[nB   光标下移n行  
\\033[nC   光标右移n列  
\\033[nD   光标左移n列  
\\033[x;yH 设置光标位置x行y列  
\\033[2J   清屏  
\\033[K   清除从光标到行尾的内容  
\\033[s   保存光标位置  
\\033[u   恢复光标位置  
\\033[?25l   隐藏光标  
\\033[?25h   显示光标
\\033[2J\\033[0;0H 清屏且将光标置顶

8. 命令行扩展和被括起来的集合

8.1 命令行扩展:`` 和 $()

把一个命令的输出打印给另一个命令的参数,放在 `` 中的一定是有输出信息的命令:

$(COMMAND) 或 `COMMAND`

比较 ""''`` 三者区别,示例如下:

总结:

单引号:强引用,六亲不认,变量和命令都不识别,都当成了普通的字符串 "最傻"
双引号:弱引用,不能识别命令,可以识别变量,"半傻不精"
反向单引号:里面的内容必须是能执行的命令并且有输出信息,变量和命令都识别,并且会将反向单引号的内
容当成命令进行执行后,再交给调用反向单引号的命令继续,"最聪明"

示例1:

示例2:

8.2 括号扩展:

可以实现打印重复字符串的简化形式,如下:

元素1,元素2,元素3 ⇒ 元素1..元素2

示例1:

示例2:关闭和启用的扩展功能

9. tab 键补全

tab 键可以实现命令及路径等补全,提高输入效率,避免出错

9.1 命令补全

  1. 内部命令:
  2. 外部命令:bash 根据 PATH 环境变量定义的路径,自左而右在每个路径搜寻以给定命令名命名的文
    件,第一次找到的命令即为要执行的命令
  3. 命令的子命令补全,需要安装 bash-completion yum install -y bash-completion,安装之后退出终端重新连接

注意:用户给定的字符串只有一条惟一对应的命令,直接补全,否则,再次 Tab 会给出列表, 示例如下:

9.2 路径补全

把用户给出的字符串当做路径开头,并在其指定上级目录下搜索以指定的字符串开头的文件名,如果惟一:则直接补全,否则:再次 Tab 给出列表。

9.3 双击Tab键

command 2Tab 所有子命令或文件补全
string2Tab 以string开头命令
/2Tab 显示所有根目录下一级目录,包括隐藏目录
./2Tab 当前目录下子目录,包括隐藏目录
*2Tab 当前目录下子目录,不包括隐藏目录
~2Tab 所有用户列表
$2Tab 所有变量
@2Tab /etc/hosts记录 (centos7 不支持)
=2Tab 相当于ls –A (centos7不支持)

10. 命令行历史

当执行命令后,系统默认会在内存记录执行过的命令,当用户正常退出时,会将内存的命令历史存放对应历史文件中,默认是 ~/.bash_history,登录 Shell 时,会读取命令历史文件中记录下的命令加载到内存中,登录进 Shell 后新执行的命令只会记录在内存的缓存区中;这些命令会用户正常退出时 追加 至命令历史文件中,利用命令历史,可以用它来重复执行命令,提高输入效率。命令:history

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,示例如下:

vim .bash_profile
export HISTCONTROL=ignoreboth
export HISTTIMEFORMAT="%F %T `whoami` "

11. 调用命令行历史

#重复前一个命令方法
重复前一个命令使用上方向键,并回车执行
按 !! 并回车执行
输入!-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 开头的命令,并获取它的所有参数

12. 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 光标在命令行首和光标之间移动
Alt + f 光标向右移动一个单词尾
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 键,解决方案如下:

13. 获得帮助

获取帮助的能力决定了技术的能力!多层次的帮助 whatis、command --help、man and info、
/usr/share/doc/、Red Hat documentation、Ubuntu documentation、软件项目网站、其它网站、搜索

13.1 whatis

whatis 使用数据库来显示命令的简短描述,此工具在系统刚安装后,不可立即使用,需要制作数据库后才可使用,执行下面命令生成数据库:

#CentOS 7 版本以后
mandb
#CentOS 6 版本之前
makewhatis

示例:

13.2 查看命令的帮助

13.2.1 内部命令帮助

help COMMAND、man bash,如下图所示:

13.2.2 外部命令及软件帮助

COMMAND --help 或 COMMAND -h
使用 man 手册(manual): man COMMAND
信息页:info COMMAND
程序自身的帮助文档:README、INSTALL、ChangeLog
程序官方文档
相关网站,如:技术论坛
搜索引擎

13.3 外部命令的–help 或 -h 选项

显示用法总结和参数列表,大多数命令使用,但并非所有的,示例:date --help、cal -h,格式说明:

[] 表示可选项
CAPS或 <> 表示变化的数据
... 表示一个列表
x |y| z 的意思是 x 或 y 或 z 
-abc的 意思是 -a -b –c
  表示分组

13.4 man 命令

man 提供命令帮助的文件,手册页存放在 /usr/share/man,几乎每个命令都有 man 的 页面,中文 man 需安装包:man-pages、man-pages-zh-CN

man 页面分组,不同类型的帮助称为不同的 章节,统称为 Linux 手册,man 1 man:

1: 用户命令
2: 系统调用
3: C库调用
4: 设备文件及特殊文件
5: 配置文件格式
6: 游戏
7: 杂项
8: 管理类的命令
9: Linux 内核API 

man 命令的配置文件:

#CentOS 6 之前版 man 的配置文件
/etc/man.config
#CentOS 7 之后版 man 的配置文件
/etc/man_db.conf
#ubuntu man 的配置文件
/etc/manpath.config

格式:

MANPATH /PATH/TO/SOMEWHERE   #指明man文件搜索位置

也可以指定位置下搜索 COMMAND 命令的手册页并显示:

man -M /PATH/TO/SOMEWHERE COMMAND

查看 man 手册页:

man [OPTION...] [SECTION] PAGE...
man [章节] keyword

man 帮助段落说明:

NAME 名称及简要说明
SYNOPSIS 用法格式说明
[] 可选内容
<> 必选内容
a|b 二选一
  分组
... 同一内容可出现多次
DESCRIPTION 详细说明
OPTIONS 选项说明
EXAMPLES 示例
FILES 相关文件
AUTHOR 作者
COPYRIGHT 版本信息
REPORTING BUGS bug信息
SEE ALSO 其它帮助参考

man 命令的操作方法:使用 less 命令实现

space, ^v, ^f, ^F: 向文件尾翻屏
b, ^b: 向文件首部翻屏
d, ^d: 向文件尾部翻半屏
u, ^u: 向文件首部翻半屏
RETURN, ^N, e, ^E or j or ^J: 向文件尾部翻一行
y or ^Y or ^P or k or ^K:向文件首部翻一行
q: 退出
#:跳转至第#行
1G: 回到文件首部
G:翻至文件尾部
/KEYWORD
以KEYWORD指定的字符串为关键字,从当前位置向文件尾部搜索;不区分字符大小写
 n:下一个
 N:上一个
?KEYWORD
 以KEYWORD指定的字符串为关键字,从当前位置向文件首部搜索;不区分字符大小写
 n:跟搜索命令同方向,下一个
 N:跟搜索命令反方向,上一个

常用选项:

列出所有帮助   man -a keyword 
搜索man手册   man -k keyword #列出所有匹配的页面,使用 whatis 数据库
相当于 whatis man -f keyword 
打印man帮助文件的路径 man -w [章节] keyword

命令:dnf install man-pages、man -w 1 passwd、whatis passwd、man 1ssl openssl-passwd、man 7 ascii、man 7 utf8,查看 passwd 相关命令和文件,man 帮助文件路径:

13.5 info

man 常用于命令参考 ,GNU 工具 info 适合通用文档参考。没有参数,列出所有的页面,info 页面的结构就像一个网站,每一页分为 节点,链接节点之前 *,info 命令格式:

info [ 命令 ]

导航 info 页:

方向键,PgUp,PgDn 导航
Tab键 移动到下一个链接
d 显示主题目录
Home 显示主题首部
Enter 进入选定链接
n/p/u/l 进入下/前/上一层/最后一个链接
s 文字 文本搜索
q 退出 info

13.6 命令自身提供的官方使用指南

/usr/share/doc

多数安装了的软件包的子目录,包括了这些软件的相关原理说明
常见文档:README INSTALL CHANGES
不适合其它地方的文档的位置
配置文件范例
html/PDF/PS 格式的文档
授权书详情

13.7 系统及第三方应用官方文档

通过在线文档获取帮助:
http://www.github.com
https://www.kernel.org/doc/html/latest/
http://httpd.apache.org
http://www.nginx.org
https://mariadb.com/kb/en
https://dev.mysql.com/doc/
http://tomcat.apache.org
https://jenkins.io/zh/doc/
https://kubernetes.io/docs/home/
https://docs.openstack.org/train/
http://www.python.org
http://php.net

通过发行版官方的文档光盘或网站可以获得安装指南、部署指南、虚拟化指南等
http://kbase.redhat.com
http://www.redhat.com/docs
http://access.redhat.com
https://help.ubuntu.com/lts/serverguide/index.html
http://tldp.org

红帽全球技术支持服务,rhn.redhat.com 或者本地卫星服务器/代理服务器。RHN 账户为及其注册和基于网络管理的 RHN 用户,sosreport 收集所有系统上的日志信息的工具,并自动打成压缩包,方便技术支持人员和红帽全球支持,提供分析问题依据。

dnf -y install sos
sosreport
ll /var/tmp/sosreport-centos8-2022-11-12-jhlpcoi.tar.xz

相关网站和搜索:
http://www.google.com

Openstack filetype:pdf
rhca site:redhat.com/docs

http://bing.com
https://www.baidu.com

以上是关于Linux 学习笔记 2022-11-12---------Linux基础的主要内容,如果未能解决你的问题,请参考以下文章

linux学习笔记一

Linux学习笔记

Linux学习笔记

Linux学习笔记

Linux学习笔记(第一周)

Linux学习笔记——重点推荐的Linux网络在线学习资源