手把手学嵌入式——Linux Shell手册-程序员宅基地

技术标签: linux  Linux学习  

文章目录

Linux Shell学习

一、初始Linux Shell

1.1 Linux内核探究

​ Linux的基本框架

在这里插入图片描述

​ Linux内核主要负责以下四种功能:

  • 系统内存管理

    ​ 不仅管理服务器上的可用物理内存,还可以创建和管理虚拟内存(即实际并不存在的内存)。

    内核通过硬盘上的存储空间来实现虚拟内存,这块区域称为交换空间(swap space),即内核不断地在交换空间和物理内存之间反复交换虚拟内存的内容

在这里插入图片描述

​ 内存划分为块,称为页面,内核会维护一个内存页面表,指明哪些页面位于物理内存内,哪些页面被换到了磁盘上。内核会记录哪些内存页面正在使用中,并自动把一段时间未访问的内存页面复制到交换空间区域(称为换出,swapping out)。当程序要访问一个已被换出的内存页面时,内核必须从物理内存换出另外一个内存页面给它让出空间,然后从交换空间换入请求的内存页面,这个过程称为内存的换入.只要Linux系统在运行,为运行中的程序换出内存页面的过程就不会停歇。

  • 软件程序管理

    ​ 将运行中的程序称为进程(可以在前台运行,也就是输出到屏幕,也可以在后台运行,也就是隐藏在系统后运行),内核控制系统上的所有进程。

    ​ 内核创建了第一个进程(称为init进程)来启动系统上所有其他进程。当内核启动时,它会将init进程加载到虚拟内存中。内核在启动任何其他进程时,都会在虚拟内存中给新进程分配一块专有区域来存储该进程用到的数据和代码

    一些Linux内核发行版使用表来管理开机启动的进程,一般该文件为/etc/inittab另外一些系统(比如现在流行的Ubuntu Linux发行版)则采用/etc/init.d目录,将开机时启动或停止某个应用的脚本放在这个目录下。这些脚本通过/etc/rcX.d目录下的入口(entry:其实是/etc/init.d的启动脚本符号链接)启动,这里的X代表运行级(run level)

    ​ Linux操作系统采用的是init运行级,运行级别决定了init进程运行/etc/inittab文件或/etc/rcX.d目录中定义的某些特定类型的进程。

    ​ LInux下一共有7个运行级别:

    • 运行级0,系统停机状态;

    • 运行级为1时,只启动基本的系统进程以及一个控制台终端进程。我们称之为单用户模式。通常用来在系统有问题时进行紧急的文件系统维护,而通常这个人为系统管理员

    • 运行级2,多用户状态

    • 标准的启动运行级是3。大多数应用软件,比如网络支持程序,都会启动。但是此时仍然是基于控制台的系统。

    • 运行级4,系统未使用

    • 运行级5会启动图形化的X Window系统,允许用户通过图形化桌面窗口登录系统。

    • 运行级6,系统正常关闭并重启。

  • 硬件设备管理

    任何Linux系统需要与之通信的设备,都需要在内核代码中加入其驱动程序代码。

    在Linux内核中有两种方法用于插入设备驱动代码:

    • 编译进内核的设备驱动代码
    • 可插入内核的设备驱动模块。允许将驱动代码插入到运行中的内核而无需重新编译内核。同时,当设备不再使用时也可将内核模块从内核中移走。

    Linux系统将硬件设备当成特殊的文件,称为设备文件,共分为三种:

    • 字符型设备文件:处理数据时每次只能处理一个字符的设备。大多数类型的调制解调器和
      终端都是作为字符型设备文件创建的。
    • 块设备文件:处理数据时每次能处理大块数据的设备,比如硬盘。
    • 网络设备文件:采用数据包发送和接收数据的设备.包括各种网卡和一个特殊的回环设备。这个回环设备允许Linux系统使用常见的网络编程协议同自身通信。

    Linux为系统上的每个设备都创建一种称为节点的特殊文件,与设备的所有通信都通过设备节点完成。设备节点包括主设备号和次设备号,似的设备被划分到同样的主设备号下。次设备号用于标识主设备组下的某个特定设备。

  • 文件系统管理

​ Linux内核支持通过不同类型的文件系统从硬盘中读写数据。包括ext、ntfs、vfat等等。Linux内核采用虚拟文件系统(Virtual File System,VFS)作为和每个文件系统交互的接口。当每个文件系统都被挂载和使用时,VFS将信息都缓存在内存中。

1.2 GNU工具

​ 除了由内核控制硬件设备外,操作系统还需要工具来执行一些标准功能,比如控制文件和程序。

​ GNU coreutils软件包由三部分构成:

  • 用以处理文件的工具
  • 用以操作文本的工具
  • 用以管理进程的工具

​ shell:GNU/Linux shell是一种特殊的交互式工具,用户提供了启动程序、管理文件系统中的文件以及运行在Linux系统上的进程的途径。shell的核心是命令行提示符,允许你输入文本命令,然后解释命令,并在内核中执行。

​ shell包含了一组内部命令,成诸如复制文件、移动文件、重命名文件、显示和终止系统中正运行的程序等操作;允许你在命令行提示符中输入程序的名称,它会将程序名传递给内核以启动它。

​ 可以将多个shell命令放入文件中作为程序执行。这些文件被称作shell脚本。所有Linux发行版默认的shell都是bash shell,除此之外还有ash、kom、tcsh、zsh等等。大多数Linux发行版包含多个shell,但它们通常会采用其中一个作为默认shell。

二、走进Shell

2.1 进入命令行

​ 在图形化桌面出现之前,与Unix系统进行交互的唯一方式就是借助由shell所提供的文本命令行界面(command line interface,CLI),只能接受文本输入,也只能显示最基本的文本和图形界面。

​ 在大多数Linux发行版中,可以使用ctrl+ALT组合建,然后按F1~F7进入要使用的虚拟控制台,F1为虚拟控制台1,F2为虚拟控制台2等等,注意的是ubuntu按CTRL+ALT+F1进入到图形化界面

​ 虚拟控制台示例界面:
在这里插入图片描述

​ 注:

  1. 文本中的tty2代表的是我们通过按下ctrl+alt+F2进入的第二个虚拟控制台。不是所有的Linux发行版都会在登录界面上显示虚拟控制台的tty号。tty代表的是用于发送消息的机器。

  2. 在login:提示符后输入用户ID,然后再在Password:提示符后输入密码(不会显示密码),就可以进入控制台终端了。

  3. 你可以自由地通过组合按键在多个CLI终端之间进行切换,拥有多个活动会话

  4. 设置终端背景以及前景颜色

    setterm -inversescreen on # 开启终端颜色设置
    setterm -background white # 设置背景颜色为白色
    setterm -foreground black # 设置前景的颜色 
    setterm -inversescreen off # 关闭终端颜色设置
    setterm -reset # 将终端外观恢复成默认设置并清屏
    setterm -store # 将终端当前的前景色和背景色设置成 -reset选项的值
    注意:目前共有black、red、green、yellow、blue、magenta、cyan和white这些颜色可选择
    
2.2 使用图形化界面下的仿真器

​ GNOME Terminal是GNOME桌面环境的默认终端仿真器,同时ubuntu的Unity也使用该仿真器。

名稱 快捷鍵 描述
New Tab Ctrl+Shift+N 在现有的Terminal窗口的新标签中启动一个新的shell会话
New Window Ctrl+Shift+M 在新的Konsole Terminal窗口中启动一个新的shell会话
Close Tab Ctrl+Shift+W 关闭当前标签中的会话
Quit Ctrl+Shift+Q 退出Konsole Terminal仿真应用

三、基本的shell命令

3.1 啓動shell

​ /etc/passwd文件包含了所有系统用户账户列表以及每个用户的基本配置信息。其中一個示例如下:

root:x:0:0:root:/root:/bin/bash
每个条目有七个字段L字段之间使用冒号隔开
第一个字段显示的是用户
第七个字段显示的是shell程序

​ 我们采用虚拟控制台终端登录,CLI提示符会自动出现,你可以输入shell命令。但如果是通过图形化桌面环境登录Linux系统,你就需要启动一个图形化终端仿真器来访问shell CLI提示符。

3.2 shell 提示符

​ 默认bash shell提示符是美元符号($),表明shell在等待用户输入。不同的Linux发行版采用不同格式的提示符。在Ubuntu Linux系统上,shell提示符看起来是这样的:

panzhongsheng@panzhongsheng-Lenovo-Legion-R7000-2020:~$
注:1. 显示了当前用户ID名panzhongsheng。另外还包括系统名panzhongsheng-Lenovo-Legion-R7000-2020
2. 当输入完shell命令后按下回车键即可执行
3.3 bash 手册

​ man命令用来访问存储在Linux系统上的手册页面.比如要查看bash的命令使用可以使用man bash来查看帮助文档。

​ 当使用man命令查看命令手册页的时候,这些手册页是由分页程序(pager)来显示的。分页程序是一种实用工具,能够逐页显示文本。可以通过点击空格键进行翻页,或是使用回车键逐行查看。还可以使用箭头键向前向后滚动手册页的内容(假设你用的终端仿真软件包支持箭头键功能)读完了手册页,可以点击q键退出。

​ 查找含有多个手册页的命令,输入man section# topic。如对hostname进行查找,对手册页中的第1部分而言,就是输入man 1 hostname。

​ 手册页不是唯一的参考资料。还有另一种叫作info页面的信息。可以输入info info来了解info页面的相关内容。另外,大多数命令都可以接受-help或–help选项。例如你可以输入hostname -help来查看帮助。关于帮助的更多信息,可以输入help help。

3.4 浏览文件系统

​ 当登录系统并获得shell命令提示符后,你通常位于自己的主目录中。

3.4.1 Linux 文件系统

​ Linux和windows不同在于其在路径名中不使用驱动器盘符,而将文件存储在单个目录结构中,这个目录被称为虚拟目录(virtual directory)

​ Linux虚拟目录结构只包含一个称为根(root)目录的基础目录。根目录下的目录和文件会按照访问它们的目录路径一一列出,并且使用的是正斜线来划分目录,反斜线在Linux中表示的是转义字符

​ 在Linux中,你会看到下面这种路径:

/home/panzhongsheng/Documents/test.doc # 表明文件test.doc位于Documents目录,Documents又位于panzhongsheng目录中,rpanzhongsheng则在home目录中

​ 在Linux PC上安装的第一块硬盘称为根驱动器。根驱动器包含了虚拟目录的核心,其他目录都是从那里开始构建的。Linux会在根驱动器上创建一些特别的目录,我们称之为挂载点(mount point)。挂载点是虚拟目录中用于分配额外存储设备的目录,会让文件和目录出现在这些挂载点目录中,然而实际上它们却存储在另外一个驱动器中。

​ 通常系统文件会存储在根驱动器中,而用户文件则存储在另一驱动器中,如下图所示:

在这里插入图片描述

​ 一块硬盘和虚拟目录的根目录(由正斜线/表示)关联起来。剩下的硬盘就可以挂载到虚拟目录结构中的任何地方。在这个例子中,第二块硬盘被挂载到了/home位置,用户目录都位于这个位置。

​ linux的文件目录结构:

/			虚拟目录的根目录。通常不会在这里存储文件
/bin		二进制目录,存放许多用户级的GNU工具
/boot		启动目录,存放启动文件
/dev		设备目录,Linux在这里创建设备节点
/etc		系统配置文件目录
/home		主目录,Linux在这里创建用户目录
/lib		库目录,存放系统和应用程序的库文件
/media		媒体目录,可移动媒体设备的常用挂载点
/mnt		挂载目录,另一个可移动媒体设备的常用挂载点
/opt		可选目录,常用于存放第三方软件包和数据文件
/proc		进程目录,存放现有硬件及当前进程的相关信息
/rootroot	用户的主目录
/sbin		系统二进制目录,存放许多GNU管理员级工具
/run		运行目录,存放系统运作时的运行时数据
/srv		服务目录,存放本地服务的相关文件
/sys		系统目录,存放系统硬件信息的相关文件
/tmp		临时目录,可以在该目录中创建和删除临时工作文件
/usr		用户二进制目录,大量用户级的GNU工具和数据文件都存储在这里
/var		可变目录,用以存放经常变化的文件,比如日志文件
注:常见的目录名均基于文件系统层级标准(filesystem hierarchy standard,FHS)。

​ 在登录系统并获得一个shell CLI提示符后,会话将从主目录开始。主目录是分配给用户账户的一个特有目录。用户账户在创建之后,系统通常会为其分配一个特有的目录。

​ 可以使用图形界面在虚拟目录中跳转。要想在CLI提示符下切换虚拟目录,需要使用cd命令。

3.4.2 遍历目录

​ 在Linux文件系统上,可以使用切换目录命令cd将shell会话切换到另一个目录,命令的基本格式如下:

cd destination # 接受单个参数destination,用以指定想切换到的目录名。如果没有为cd命令指定目标路径,它将切换到用户主目录。destination参数可以用两种方式表示:一种是使用绝对文件路径,另一种是使用相对文件路径。

​ destination路径说明:

  • 绝对路径:可在虚拟目录中采用绝对文件路径引用目录名,从根目录开始。如要切换到/usr/bin目录下则需要使用:cd /usr/bin。我们可以使用绝对文件路径切换到Linux虚拟目录结构中的任何一级

  • 相对路径:允许用户指定一个基于当前位置的目标文件路径,从当前用户所在的目录开始的。如

    panzhongsheng@panzhongsheng-Lenovo-Legion-R7000-2020:~$ pwd # 查看用户当前目录
    /home/panzhongsheng
    panzhongsheng@panzhongsheng-Lenovo-Legion-R7000-2020:~$ cd Documents/ # 使用相对路径
    

    有两个特殊字符可用于相对文件路径中:单点符(.),表示当前目录、双点符(…),表示当前目录的父目录

3.5 文件和目录列表

​ 想知道系统中有哪些文件,可以使用列表命令(ls)。

3.5.1 基本列表功能

​ ls命令最基本的形式会显示当前目录下的文件和目录(不带参数的ls不会显示隐藏文件以及目录)

在这里插入图片描述

​ 注意:输出的列表是按字母排序的(按列排序而不是按行排序)

​ ls命令还可以用不同的颜色来区分不同类型的文件。LS_COLORS环境变量控制着这个功能。如果没安装彩色终端仿真器,可用带-F参数的ls命令轻松区分文件和目录。使用-F参数可以在目录后加入正斜线(/),在可执行文件后加入*
在这里插入图片描述

​ Linux经常采用隐藏文件(文件名以点号开始的文件)来保存配置信息。要把隐藏文件和普通文件及目录一起显示出来,就得用到-a参数。
在这里插入图片描述

​ -R参数是ls命令可用的另一个参数,叫作递归选项。它列出了当前目录下包含的子目录中的文件。如果目录很多,这个输出就会很长。

在这里插入图片描述

3.5.2 显示长列表

​ 在基本的输出列表中,ls命令并未输出太多每个文件的相关信息。要显示附加信息,另一个常用的参数是-l(会产生长列表格式的输出,包含了目录中每个文件的更多相关信息)

在这里插入图片描述

​ 注:输出的第一行显示了在目录中包含的总块数。在此之后,每一行都包含了关于文件(或目录)的下述信息:

  • 文件类型,比如目录(d)、文件(-)、字符型文件(c)或块设备(b)
  • 文件的权限
  • 文件的硬链接总数;
  • 文件属主的用户名;
  • 文件属组的组名;
  • 文件的大小(以字节为单位)
  • 文件的上次修改时间;
  • 文件名或目录名。

​ 比较常用的ls组合命令为,ls -alF

3.5.3 过滤输出列表

​ ls过滤器就是一个进行简单文本匹配的字符串,当用户指定特定文件的名称作为过滤器时,ls命令只会显示该文件的信息。ls命令能够识别标准通配符,并在过滤器中用它们进行模式匹配(文件扩展匹配(file globbing)):

  • 问号(?)代表一个字符;

  • 星号(*)代表零个或多个字符。

  • [a-i]代表匹配a-i中的一个字符

  • [!i] 代表匹配非i的一个字符

panzhongsheng@panzhongsheng-Lenovo-Legion-R7000-2020:~$ ls -l a.tx?
-rw-rw-r-- 1 panzhongsheng panzhongsheng 0 Jul 30 12:59 a.txt
panzhongsheng@panzhongsheng-Lenovo-Legion-R7000-2020:~$ ls -l a*
-rw-rw-r-- 1 panzhongsheng panzhongsheng 0 Jul 30 12:59 a.txt
panzhongsheng@panzhongsheng-Lenovo-Legion-R7000-2020:~$ ls -l [a-i].txt
-rw-rw-r-- 1 panzhongsheng panzhongsheng 0 Jul 30 12:59 a.txt
panzhongsheng@panzhongsheng-Lenovo-Legion-R7000-2020:~$ ls -l [!i].txt
-rw-rw-r-- 1 panzhongsheng panzhongsheng 0 Jul 30 12:59 a.txt
3.6 处理文件
3.6.1 创建文件

​ 用touch命令轻松创建空文件。

$ touch test_one
$ ls -l test_one # touch命令创建了你指定的新文件,并将你的用户名作为文件的属主。文件的大小是零,因为touch命令只创建了一个空文件。
-rw-rw-r-- 1 christine christine 0 May 21 14:17 test_one
$ touch test_one # touch命令还可用来改变文件的修改时间。这个操作并不需要改变文件的内容。
$ ls -l test_one
-rw-rw-r-- 1 christine christine 0 May 21 14:35 test_one
$ touch -a test_one # 如果只想改变访问时间,可用-a参数。
$ ls -l --time=atime test_one # 如果只使用ls –l命令,并不会显示访问时间。要想查看文件的访问时间,需要加入另外一个参数:--time=atime
-rw-rw-r-- 1 christine christine 0 May 21 14:55 test_one
3.6.2 复制文件

​ cp命令可以在文件系统中将文件和目录从一个位置复制到另一个位置

cp source destination # 源对象和目标对象
panzhongsheng@panzhongsheng-Lenovo-Legion-R7000-2020:~$ cp test_one test_two
panzhongsheng@panzhongsheng-Lenovo-Legion-R7000-2020:~$ cp test_one test_two -i # 如果目标文件已经存在,cp命令可能并不会提醒这一点。最好是加上-i选项,强制shell询问是否需要覆盖已有文件。如果不回答y,文件复制将不会继续
cp: overwrite 'test_two'? n
panzhongsheng@panzhongsheng-Lenovo-Legion-R7000-2020:~$ cp test_one Documents/ # 将文件复制到现有目录中,可以采用相对路径或者绝对路径
$ cp -R Scripts/ Mod_Scripts # 在执行cp –R命令之前,目录Mod_Scripts并不存在。它是随着cp –R命令被创建的,整个Scripts目录中的内容都被复制到其中。所有的文件都有对应的新日期。
$ ls -Fd *Scripts # -d选项只列出目录本身的信息,不列出其中的内容
Mod_Scripts/ Scripts/
$ cp *script Mod_Scripts/ # 也可以在cp命令中使用通配符。
3.6.3 制表键自动补全

​ 制表键自动补全允许你在输入文件名或目录名时按一下制表键,让shell帮忙将内容补充完整。

3.6.4 链接文件

​ 拟的副本就称为链接。链接是目录中指向文件真实位置的占位符。 在Linux中有两种不同类型的文件链接:

  • 符号链接:是一个实实在在的文件,它指向存放在虚拟目录结构中某个地方的另一个文件。这两个通过符号链接在一起的文件,彼此的内容并不相同。要为一个文件创建符号链接,原始文件必须事先存在。使用ln命令以及-s选项来创建符号链接。

    $ ls -l data_file
    -rw-rw-r-- 1 christine christine 1092 May 21 17:27 data_file
    $ ln -s data_file sl_data_file # 符号链接的名字sl_data_file位于ln命令中的第二个参数位置上,符号文件名后的->符号表明该文件是链接到文件data_file上的一个符号链接。
    $ ls -l *data_file # 符号链接sl_data_file只有9个字节,而data_file有1092个字节。这是因为sl_data_file仅仅只是指向data_file而已。
    -rw-rw-r-- 1 christine christine 1092 May 21 17:27 data_file
    lrwxrwxrwx 1 christine christine
    9 May 21 17:29 sl_data_file -> data_file
    $ ls -i *data_file # 证明链接文件是独立文件的方法是查看inode编号,文件或目录的inode编号是一个用于标识的唯一数字,这个数字由内核分配给文件系统中的每一个对象。要查看文件或目录的inode编号,可以给ls命令加入-i参数。
    296890 data_file 296891 sl_data_file
    
  • 硬链接:会创建独立的虚拟文件,其中包含了原始文件的信息及位置,它们从根本上而言是同一个文件。引用硬链接文件等同于引用了源文件。要创建硬链接,原始文件也必须事先存在,使用ln命令时不再需要加入额外的参数了。

    $ ls -l code_file
    -rw-rw-r-- 1 christine christine 189 May 21 17:56 code_file
    $ ln code_file hl_code_file
    $ ls -li *code_file # 带有硬链接的文件共享inode编号。这是因为它们终归是同一个文件
    296892 -rw-rw-r-- 2 christine christine 189 May 21 17:56
    code_file
    296892 -rw-rw-r-- 2 christine christine 189 May 21 17:56
    hl_code_file
    

    注意:只能对处于同一存储媒体的文件创建硬链接。要想在不同存储媒体的文件之间创建链接,只能使用符号链接。

  • 硬链接

3.6.5 重命名文件

​ 在Linux中,重命名文件称为移动(moving)。mv命令可以将文件和目录移动到另一个位置 或重新命名。

panzhongsheng@panzhongsheng-Lenovo-Legion-R7000-2020:~$ mv test_two test_tow_bak # 移动文件会将文件名更改,但inode编号和时间戳保持不变。这是因为mv只影响文件名
panzhongsheng@panzhongsheng-Lenovo-Legion-R7000-2020:~$ mv test_tow_bak ./Documents/ # 使用mv来移动文件的位置。
panzhongsheng@panzhongsheng-Lenovo-Legion-R7000-2020:~$ mv test_one ./Documents/ -i
mv: overwrite './Documents/test_one'? n # 和cp命令类似,也可以在mv命令中使用-i参数。这样在命令试图覆盖已有的文件时,你就会得到提示
3.6.6 删除文件

​ 在Linux中,删除(deleting)叫作移除(removing),其命令为rm。

$ rm -i test # bash shell中没有回收站或垃圾箱,文件一旦删除,就无法再找回,使用-i来询问是否删除
$ rm tes? # 也可以使用通配符删除成组的文件。
$ rm test -f # 如果要删除很多文件且不受提示符的打扰,可以用-f参数强制删除

3.7 处理目录
3.7.1 创建目录

​ 在Linux中创建目录很简单,用mkdir命令

$ mkdir new_dir # 系统创建了一个名为new_dir的新目录
$ ls -ld new_dir # 新目录长列表是以d开头的
drwxrwxr-x 2 panzhongsheng panzhongsheng 4096 May 22 09:48 new_dir
$ mkdir -p new_dir/Sub_Dir/Under_Dir # 要想同时创建多个目录和子目录,需要加入-p参数
3.7.2 删除目录

​ 删除目录的基本命令是rmdir

$ rmdir new_dir # 默认情况下,rmdir命令只删除空目录
rmdir: failed to remove 'new_dir': Directory not empty
$ rm -r new_dir # 使用-r选项使得命令可以向下进入目录,删除其中的文件,然后再删除目录本身。
$ rm -rf Small_Dir # 一口气删除目录及其所有内容,rm -rf命令既没有警告信息,也没有声音提示。
3.8 查看文件内容
3.8.1 查看文件类型

​ file命令是一个随手可得的便捷工具。它能够探测文件的内部,并决定文件是什么类型

$ file my_file # file命令不仅能确定文件中包含的文本信息,还能确定该文本文件的字符编码,ASCII。
my_file: ASCII text
$ file New_Dir # 使用file命令作为另一种区分目录的方法
New_Dir: directory
$ file sl_data_file # 告诉你它链接到了哪个文件上
sl_data_file: symbolic link to 'data_file'
$ file my_script # file命令对脚本文件的返回结果
my_script: Bourne-Again shell script, ASCII text executable
$ file /bin/ls  # file命令能够确定该程序编译时所面向的平台以及需要何种类型的库
/bin/ls: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), 
dynamically linked (uses shared libs), for GNU/Linux 2.6.24,
3.8.2 查看整个文件
  1. cat命令

    cat命令是显示文本文件中所有数据的得力工具

$ cat test1 
hello 
This is a test file. 
That we'll use to test the cat command.
$ cat -n test1  # -n参数会给所有的行加上行号
 1 hello 
 2 
 3 This is a test file. 
 4 
 5 
 6 That we'll use to test the cat command.
$ cat -b test1  # 。如果只想给有文本的行加上行号,可以用-b参数。
 1 hello 
 2 This is a test file. 
 3 That we'll use to test the cat command.
$ cat -T test1 # 如果不想让制表符出现,可以用-T参数。-T参数会用^I字符组合去替换文中的所有制表符。
hello
This is a test file.
That we'll use to^Itest the cat command.
  1. more命令

​ cat命令的主要缺陷是:一旦运行,你就无法控制后面的操作。more命令会显示文本文件的内容,但会在显示每页数据之后停下来。more命令是分页工具。通过按空格键或回车键以逐行向前的方式浏览文本文件。浏览完之后,按q键退出。

  1. less命令

​ 提供了一些极为实用的特性,能够实现在文本文件中前后翻动,而且还有一些高级搜索功能。less命令能够识别上下键以及上下翻页键(假设你的终端配置正确)

​ 注意:推荐使用less命令查看文本文件

3.8.3 查看部分文件

​ 1. tail命令

$ tail log_file # tail命令会显示文件最后几行的内容(文件的“尾部”)。默认情况下,它会显示文件的末尾10行。
line11
Hello again - line 12
line13
line14
line15
Sweet - line16
line17
line18
line19
Last line - line20
$ tail -n 2 log_file # 通过加入 -n 2使tail命令只显示文件的最后两行:
line19
Last line - line20
$ tail -f log_file -# f 参数是 tail 命令的一个突出特性。它允许你在其他进程使用该文件时查看文件的内容。tail命令会保持活动状态,并不断显示添加到文件中的内容。
  1. head命令
$ head log_file # 。默认情况下,它会显示文件前10行的文本
line1
line2
line3
line4
line5
Hello World - line 6
line7
line8
line9
line10
$ head -5 log_file # 类似于tail命令,它也支持-n参数
line1
line2
line3
line4
line5

注意:文件的开头通常不会改变,因此head命令并像tail命令那样支持-f参数特性。

四、更多bash shell命令

4.1 监测程序
4.1.1 探查进程

​ 当程序运行在系统上时,我们称之为进程(process)。想监测这些进程,需要熟悉ps命令的用法。

$ ps # 默认情况下,ps命令只会显示运行在当前控制台下的属于当前用户的进程。显示了程序的进程ID(Process ID,PID)、它们运行在哪个终端(TTY)、以及进程已用的CPU时间。
    PID TTY          TIME CMD
  31509 pts/0    00:00:00 bash
  36030 pts/0    00:00:00 ps
$ ps -ef # -e参数指定显示所有运行在系统上的进程;-f 参数则扩展了输出,这些扩展的列包含了有用的信息。
UID(启动这些进程的用户) PID(进程的进程ID)    PPID(父进程的进程号)  C(进程生命周期中的CPU利用率) STIME(进程启动时的系统时间) TTY(进程启动时的终端设备)          TIME(运行进程需要的累计CPU时间) CMD(启动的程序名称)
root           1       0  0 Jul29 ?        00:00:04 /sbin/init splash
root           2       0  0 Jul29 ?        00:00:00 [kthreadd]
root           3       2  0 Jul29 ?        00:00:00 [rcu_gp]
root           4       2  0 Jul29 ?        00:00:00 [rcu_par_gp]
root           5       2  0 Jul29 ?        00:00:00 [netns]
root           7       2  0 Jul29 ?        00:00:00 [kworker/0:0H-events_highpri
root          10       2  0 Jul29 ?        00:00:00 [mm_percpu_wq]
$ ps -l
F(内核分配给进程的系统标记) S(进程的状态(O代表正在运行;S代表在休眠;R代表可运行,正等待运行;Z代表僵化,进程已结束但父进程已不存在;T代表停止)   UID     PID    PPID  C PRI(进程的优先级,越大的数字代表越低的优先级)  NI(谦让度值用来参与决定优先级) ADDR(进程的内存地址) SZ(假如进程被换出,所需交换空间的大致大小) WCHAN(进程休眠的内核函数的地址)  TTY          TIME CMD
0 S  1000   31509   22373  0  80   0 -  5061 do_wai pts/0    00:00:00 bash
4 R  1000   36117   31509  0  80   0 -  5347 -      pts/0    00:00:00 ps
4.1.2 实时监测进程

​ top命令跟ps命令相似,能够显示进程信息,但它是实时显示的

$ top
# 输出的第一部分显示的是系统的概况:第一行显示了当前时间、系统的运行时间、登录的用户数以及系统的平均负载。平均负载有3个值:最近1分钟的、最近5分钟的和最近15分钟的平均负载。值越大说明系统的负载越高。由于进程短期的突发性活动,出现最近1分钟的高负载值也很常见,但如果近15分钟内的平均负载都很高,就说明系统可能有问题。通常,如果系统的负载值超过了2,就说明系统比较繁忙了
# 第二行显示了进程概要信息—— top命令的输出中将进程叫作任务(task):有多少进程处在运行、休眠、停止或是僵化状态(僵化状态是指进程完成了,但父进程没有响应)
# 下一行显示了CPU的概要信息。 top根据进程的属主(用户还是系统)和进程的状态(运行、空闲还是等待)将CPU利用率分成几类输出。
# 紧跟其后的两行说明了系统内存的状态。第一行说的是系统的物理内存:总共有多少内存,当前用了多少,还有多少空闲。后一行说的是同样的信息,不过是针对系统交换空间(如果分配了的话)的状态而言的。
# 最后一部分显示了当前运行中的进程的详细列表
注意:默认情况下,top命令在启动时会按照%CPU值对进程排序。可以在top运行时使用多种交互
命令重新排序。。键入f允许你选择对输出进行排序的字段,键入d允许你修改轮询间隔。键入q可以退出top。
top - 14:14:09 up 17:46,  3 users,  load average: 0.47, 0.45, 0.44
Tasks: 386 total,   1 running, 385 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.4 us,  0.3 sy,  0.0 ni, 99.3 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
MiB Mem :  31464.0 total,  21977.2 free,   4491.0 used,   4995.8 buff/cache
MiB Swap:   3906.0 total,   3906.0 free,      0.0 used.  26261.2 avail Mem 
    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND  
   2174 panzhon+  20   0 6792888 516056 171668 S   9.3   1.6  22:41.90 gnome-s+ 
  22373 panzhon+  20   0  679976  83004  59088 S   3.0   0.3   0:32.73 gnome-t+ 
   2406 panzhon+  20   0  328596  20628   7152 S   0.7   0.1   4:55.04 ibus-da+ 
     14 root      20   0       0      0      0 I   0.3   0.0   0:21.89 rcu_sch+
4.1.3 结束进程

​ 在Linux中,进程之间通过信号来通信。进程的信号就是预定义好的一个消息,进程能识别它并决定忽略还是作出反应.

1	HUP		挂起
2	INT		中断
3	QUIT	结束运行
9	KILL	无条件终止
11	SEGV	段错误
15	TERM	尽可能终止
17	STOP	无条件停止运行,但不终止
18	TSTP	停止或暂停,但继续在后台运行
19	CONT	在STOP或TSTP之后恢复执行

在Linux上有两个命令可以向运行中的进程发出进程信号。

​ 1. kill命令

​ 通过进程ID(PID)给进程发信号。默认情况下, kill命令会向命令行中列出的全部PID发送一个TERM信号,要发送进程信号,你必须是进程的属主或登录为root用户。如果要强制终止, -s参数支持指定其他信号(用信号名或信号值)。

$ kill 3940
$ kill -s HUP 3940 # 3940为进程号

注意:要检查 kill 命令是否有效,可再运行 ps或top 命令,看看问题进程是否已停止。

​ 2. killall命令

​ killall命令非常强大,它支持通过进程名而不是PID来结束进程。也支持通配符,这在系统因负载过大而变得很慢时很有用。

$ killall http* # 结束了所有以http开头的进程,比如Apache Web服务器的httpd服务。

注意:以root用户身份登录系统时,使用killall命令要特别小心,因为很容易就会误用通配符而结束了重要的系统进程。这可能会破坏文件系统。

4.2 监测磁盘空间
4.2.1 挂载存储媒体

​ Linux文件系统将所有的磁盘都并入一个虚拟目录下。在使用新的存储媒体之前,需要把它放到虚拟目录下。这项工作称为挂载(mounting)。大多数Linux发行版都能自动挂载特定类型的可移动存储媒体,可移动存储媒体指的是可从PC上轻易移除的媒体,比如CD-ROM、软盘和U盘。

​ 1. mount命令

​ Linux上用来挂载媒体的命令叫作mount

$ mount #默认情况下, mount命令会输出当前系统上挂载的设备列表。 
# mount命令提供如下四部分信息:
1. 媒体的设备文件名
2. 媒体挂载到虚拟目录的挂载点
3. 文件系统类型
4. 已挂载媒体的访问状态

sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime)
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
udev on /dev type devtmpfs (rw,nosuid,relatime,size=16074880k,nr_inodes=4018720,mode=755,inode64)

$ mount -t vfat /dev/sdb1 /media/disk # vfat指定了磁盘被格式化的文件系统类型。 vfat:Windows长文件系统;ntfs:Windows NT、XP、Vista以及Windows 7中广泛使用的高级文件系统;iso9660:标准CD-ROM文件系统。大多数U盘和软盘会被格式化成vfat文件系统。而数据CD则必须使用iso9660文件系统类型。后面两个参数定义了该存储设备的设备文件的位置以及挂载点在虚拟目录中的位置。该命令的含义为将:/dev/sdb1设备文件挂在到/media/disk中

​ 媒体设备挂载到了虚拟目录后,root用户就有了对该设备的所有访问权限,而其他用户的访问则会被限制。你可以通过目录权限指定用户对设备的访问权限。

​ 2. umount命令

​ 从Linux系统上移除一个可移动设备时,不能直接从系统上移除,而应该先卸载。

umount [directory | device ]
$ umount /home/rich.mnt # umount命令支持通过设备文件或者是挂载点来指定要卸载的设备。。如果有任何程序正在使用设备上的文件,系统就不会允许你卸载它

注意:

  1. Linux上不能直接弹出已挂载的CD。如果你在从光驱中移除CD时遇到麻烦,通常是因为该CD还挂载在虚拟目录里。先卸载它,然后再去尝试弹出。
  2. 命令行提示符仍然在挂载设备的文件系统目录中,所以 umount 命令无法卸载该镜像文件。一旦命令提示符移出该镜像文件的文件系统, umount 命令就能卸载该镜像文件。
4.2.2 使用 df 命令

​ df命令可以让你很方便地查看所有已挂载磁盘的使用情况。

panzhongsheng@panzhongsheng-Lenovo-Legion-R7000-2020:~$ df
Filesystem     1K-blocks     Used Available Use% Mounted on
tmpfs            3221912     2348   3219564   1% /run
/dev/nvme1n1p3  29352956 17350080  10486488  63% /
tmpfs           16109556   134548  15975008   1% /dev/shm
tmpfs               5120        4      5116   1% /run/lock
/dev/nvme1n1p4    965872   165076    734392  19% /boot
/dev/nvme1n1p6  93979148 17851436  71307696  21% /home
/dev/nvme0n1p1    262144    36548    225596  14% /boot/efi
tmpfs            3221908     2448   3219460   1% /run/user/1000
panzhongsheng@panzhongsheng-Lenovo-Legion-R7000-2020:~$ df -h # 它会把输出中的磁盘空间按照用户易读的形式显示,通常用M来替代兆字节,用G替代吉字节
Filesystem      Size  Used Avail Use% Mounted on
tmpfs           3.1G  2.3M  3.1G   1% /run
/dev/nvme1n1p3   28G   17G   11G  63% /
tmpfs            16G  126M   16G   1% /dev/shm
tmpfs           5.0M  4.0K  5.0M   1% /run/lock
/dev/nvme1n1p4  944M  162M  718M  19% /boot
/dev/nvme1n1p6   90G   18G   69G  21% /home
/dev/nvme0n1p1  256M   36M  221M  14% /boot/efi
tmpfs           3.1G  2.4M  3.1G   1% /run/user/1000

df命令会显示每个有数据的已挂载文件系统。命令输出如下:

  • 设备的设备文件位置;
  • 能容纳多少个1024字节大小的块;
  • 已用了多少个1024字节大小的块;
  • 还有多少个1024字节大小的块可用;
  • 已用空间所占的比例;
  • 设备挂载到了哪个挂载点上。

注意:如果在卸载设备时,系统提示设备繁忙,无法卸载设备,通常是有进程还在访问该设备或使用该设备上的文件。这时可用lsof命令获得使用它的进程信息,然后在应用中停止使用该设备或停止该进程。lsof命令的用法很简单:lsof /path/to/device/node,或者lsof /path/to/mount/point。

4.2.3 使用 du 命令

​ du命令可以显示某个特定目录(默认情况下是当前目录)的磁盘使用情况。可用来快速判断系统上某个目录下是不是有超大文件。

$ du -h  # 每行输出左边的数值是每个文件或目录占用的磁盘块数,这个列表是从目录层级的最底部开始,然后按文件、子目录、目录逐级向上
372K	./QQ/Plugin/Com.Tencent.MMOG/Bin
440K	./QQ/Plugin/Com.Tencent.MMOG
396K	./QQ/Plugin/Com.Tencent.Today/Bin
548K	./QQ/Plugin/Com.Tencent.Today
100K	./QQ/Plugin/Com.Tencent.Graffito/Bin
108K	./QQ/Plugin/Com.Tencent.Graffito
76K	./QQ/Plugin/Com.Tencent.QQLive/Bin
92K	./QQ/Plugin/Com.Tencent.QQLive
196K	./QQ/Plugin/Com.Tencent.SNSApp/Bin
.....
$ du -c # -c:显示所有已列出文件总的大小。
$ du -h # -h:按用户易读的格式输出大小,即用K替代千字节,用M替代兆字节,用G替代吉字
$ du -s # -s:显示每个输出参数的总计。
$ du -s -h
18G	.
4.3 处理数据文件
4.3.1 排序数据

​ 处理大量的数据要使用的是sort命令来进行排序,按照会话指定的默认语言的排序规则对文本文件中的数据行排序。

$ cat file1 
one
two
three
four
five
$ sort file1
five
four
one
three
two
$ cat file2 
1
2
100
45
3
10
145
75
$ sort file2 # 默认情况下,sort命令会把数字当做字符来执行标准的字符排序
1
10
100
145
2
3
45
75
$ sort -n file2 # 可用-n参数,它会告诉sort命令把数字识别成数字而不是字符,并且按值排序
1
2
3
10
45
75
100
145

注意:另一个常用的参数是-M,按月排序。如果用-M参数, sort命令就能识别三字符的月份名,并相应地排序。-k和 -t参数在对按字段分隔的数据进行排序时非常有用,例如/etc/passwd文件。可以用-t参数来指定字段分隔符,然后用-k参数来指定排序的字段。

e.g.

$ du -sh * | sort -nr # -r参数将结果按降序输出,管道命令(|)将du命令的输出重定向到sort命令
4.3.2 搜索数据

​ 用grep命令来帮助查找,grep命令会在输入或指定的文件中查找包含匹配指定模式的字符的行。grep的输出就是包含了匹配模式的行。

如果要进行反向搜索(输出不匹配该模式的行) ,可加-v参数。

$ grep -v t file1
one
four
five
如果要显示匹配模式的行所在的行号,可加-n参数。
$ grep -n t file1
2:two
3:three
如果只要知道有多少行含有匹配的模式,可用-c参数。
$ grep -c t file1
2
如果要指定多个匹配模式,可用-e参数来指定每个模式。
$ grep -e t -e f file1
two
three
four
five
以下是在grep搜索中使用正则表达式的简单例子。
$ grep [tf] file1
two
three
four
five
4.3.3 压缩数据

​ Linux压缩工具

bzip2		.bz2	采用Burrows-Wheeler块排序文本压缩算法和霍夫曼编码
compress 	.Z		最初的Unix文件压缩工具,已经快没人用了
gzip		.gz		GNU压缩工具,用Lempel-Ziv编码
zip			.zip		Windows上PKZIP工具的Unix实现

​ gzip是Linux上最流行的压缩工具。 gzip:用来压缩文件、gzcat:用来查看压缩过的文本文件的内容、gunzip:用来解压文件。

$ gzip myprog # 压缩你在命令行指定的文件,
$ ls -l my*
-rwxrwxr-x 1 rich rich 2197 2007-09-13 11:29 myprog.gz
$gzip my* # 可以在命令行指定多个文件名甚至用通配符来一次性批量压缩文件,gzip命令会压缩该目录中匹配通配符的每个文件。
$ ls -l my*
-rw-rw-r-- 1 panzhongsheng panzhongsheng 28 Jul 30 19:04 mypro.c.gz
-rw-rw-r-- 1 panzhongsheng panzhongsheng 30 Jul 30 19:04 mypro.exp.gz
-rw-rw-r-- 1 panzhongsheng panzhongsheng 28 Jul 30 19:04 mypro.h.gz
4.3.4 归档数据

​ Unix和Linux上最广泛使用的归档工具是tar命令。tar命令最开始是用来将文件写到磁带设备上归档的,然而它也能把输出写到文件里,这种用法在Linux上已经普遍用来归档数据了。

tar function [options] object1 object2 ...
-C dir	切换到指定目录
-f file	输出结果到文件或设备file
-j	将输出重定向给bzip2命令来压缩内容
-p	保留所有文件权限
-v	在处理文件时显示文件
-z	将输出重定向给gzip命令来压缩内容
-t	--list	列出已有tar归档文件的内容

来创建一个归档文件:
$ tar -cvf test.tar test/ test2/ # 归档:创建了名为test.tar的归档文件,含有test和test2目录内容
$ tar -xvf test.tar # 解档:通过这一命令从tar文件test.tar中提取内容。如果tar文件是从一个目录结构创建的,那整个目录结构都会在当前目录下重新创建。

五、 理解shell

5.1 shell类型

​ bash shell程序位于/bin目录内,/bin/bash (bash shell)是一个可执行程序,而系统的shell为/bin/sh,是一个dash shell

​ 启动dash shell:

$ /bin/dash 
$ # 除启动了dash shell程序之外,看起来似乎什么都没有发生。提示符$是dash shell的CLI提示符。
$ exit # 输入exit来退出dash shell。exit命令不仅能退出子shell,还能用来登出当前的虚拟控制台终端或终端仿真器软件。只需要在父shell中输入exit,就能够从容退出CLI了。
exit
5.2 shell 的父子关系

​ 用于登录某个虚拟控制器终端或在GUI中运行终端仿真器时所启动的默认的交互shell,是一个父shell,等待命令输入。

​ 在CLI提示符后输入/bin/bash命令或其他等效的bash命令时,会创建一个新的shell程序。这个shell程序被称为子shell(child shell)。子shell也拥有CLI提示符,同样会等待命令输入。我们可以通过ps -ef来查看当前的进程情况

$ ps -f # ps -f命令也能够表现子shell的嵌套关系,因为它能够通过PPID列显示出谁是谁的父进程。
UID          PID    PPID  C STIME TTY          TIME CMD
panzhon+   38981   38062  0 19:08 pts/1    00:00:00 bash
panzhon+   39326   38981  0 19:16 pts/1    00:00:00 /bin/sh
panzhon+   39341   39326  0 19:17 pts/1    00:00:00 ps -f
$ ps --forest # 以树的形式展现
    PID TTY          TIME CMD
  38981 pts/1    00:00:00 bash
  39326 pts/1    00:00:00  \_ sh
  39391 pts/1    00:00:00      \_ ps

​ 在生成子shell进程时,只有部分父进程的环境被复制到子shell环境中。子shell(child shell,也叫subshell)可以从父shell中创建,也可以从另一个子shell中创建。

5.2.1 进程列表

​ 你可以在一行中指定要依次运行的一系列命令。这可以通过命令列表来实现,只需要在命令之间加入分号(;)即可。

$ pwd;ls # 所有的命令依次执行,在父shell里面执行
/home/panzhongsheng/test_linux
a.txt  file1  new_dir  test1  test2  test.tar
$ (pwd;ls) # 进程列表:,生成了一个子shell来执行对应的命令。另一种表示方式为{ command; },但是不会生成子shell来执行命令
/home/panzhongsheng/test_linux
a.txt  file1  new_dir  test1  test2  test.tar
$ (pwd;ls;echo $BASH_SUBSHELL) # echo $BASH_SUBSHELL。如果该命令返回0 ,就表明没有子shell。如果返回1或者其他更大的数字,就表明存在子shell。
/home/panzhongsheng/test_linux
a.txt  file1  new_dir  test1  test2  test.tar
1
$ (pwd;(echo $BASH_SUBSHELL)) # 可以在命令列表中嵌套括号来创建子shell的子shell。
/home/panzhongsheng/test_linux
2

​ 注:采用子shell的成本不菲,会明显拖慢处理速度。在交互式的CLI shell会话中,子shell同样存在问题。它并非真正的多进程处理,因为终端控制着子shell的I/O。

5.2.2 别出心裁的子 shell 用法

​ 在交互式shell中,一个高效的子shell用法就是使用后台模式

  1. 探索后台模式

​ 在后台模式中运行命令可以在处理命令的同时让出CLI,以供他用。经典命令就是sleep。

$ sleep 10 # 将会话暂停10秒钟,然后返回shell CLI提示符
$ sleep 10& # 把sleep命令置入后台模式
[1] 39652 # 第一条信息是显示在方括号中的后台作业(background job)号(1)。第二条是后台作业的进程ID(2396) 
$ ps -f # 
UID          PID    PPID  C STIME TTY          TIME CMD
panzhon+   38981   38062  0 19:08 pts/1    00:00:00 bash
panzhon+   39652   38981  0 19:26 pts/1    00:00:00 sleep 20
panzhon+   39653   38981  0 19:26 pts/1    00:00:00 ps -f
$ jobs -l # jobs命令来显示后台作业信息,可以显示出当前运行在后台模式中的所有用户的进程(作业)。-l选项还能够显示出命令的PID。
[1]+ 39652 Running sleep 10 &
# 一旦后台作业完成,就会显示出结束状态。
[1]+ Done sleep 10 &

​ 2. 协程

​ 协程可以同时做两件事。它在后台生成一个子shell,并在这个子shell中执行命令。要进行协程处理,得使用coproc命令,还有要在子shell中执行的命令。

$ coproc sleep 10 # 除了会创建子shell之外,协程基本上就是将命令置入后台模式
[1] 39798
$ coproc My_Job { sleep 10; }  # My_Job是coproc 命令给进程起的名字,若没有其名字则为COPROC。必须确保在第一个花括号({)和命令名之间有一个空格。还必须保证命令以分号(;)结尾。另外,分号和闭花括号( })之间也得有一个空格。
$ coproc ( sleep 10; sleep 2 ) # 进程列表使用协程
5.3 理解 shell 的内建命令
5.3.1 外部命令

​ 外部命令一般位于/bin、/usr/bin、/sbin、/usr/sbin中。如ps就是一个外部命令,可以通过which和type命令找到它

$ which ps
/bin/ps
$ type -a ps
ps is /usr/bin/ps
ps is /bin/ps

​ 当外部命令执行时,会创建出一个子进程。这种操作被称为衍生(forking).外部命令ps很方便显示出它的父进程以及自己所对应的衍生子进程。

$ ps -f # ps会创建一个外部子进程,这里的子进程pid为38981
UID          PID    PPID  C STIME TTY          TIME CMD
panzhon+   38981   38062  0 19:08 pts/1    00:00:00 bash
panzhon+   40494   38981  0 19:37 pts/1    00:00:00 ps -f 

作为外部命令,ps命令执行时会创建出一个子进程,外部命令执行时的衍生过程如下:

在这里插入图片描述

​ 当进程必须执行衍生操作时,它需要花费时间和精力来设置新子进程的环境。所以说,外部命令多少还是有代价的。

5.3.2 内建命令

​ 内建命令和外部命令的区别在于前者不需要使用子进程来执行。它们已经和shell编译成了一体,作为shell工具的组成部分存在。不需要借助外部程序文件来运行。

​ cd和exit命令都内建于bash shell。可以利用type命令来了解某个命令是否是内建的。

$ type cd # 既不需要通过衍生出子进程来执行,也不需要打开程序文件.内建命令的执行速度要更快,效率也更高。
cd is a shell builtin
$ type exit
exit is a shell builtin
$ type -a pwd # 命令type -a显示出了每个命令的两种实现。注意,which命令只显示出了外部命令文件。
pwd is a shell builtin
pwd is /bin/pwd
  1. 使用history命令

    bash shell会跟踪你用过的命令。你可以唤回这些命令并重新使用。

$  !! # 当输入!!时,bash首先会显示出从shell的历史记录中唤回的命令。然后执行该命令。命令历史记录被保存在隐藏文件.bash_history中,它位于用户的主目录中.bash命令的历史记录是先存放在内存中,当shell退出时才被写入到历史文件中。
echo $HISTSIZE
1000
$ history -a s# 可以在退出shell会话之前强制将命令历史记录写入.bash_history文件。要实现强制写入,需要使用history命令的-a选项。
  1. 命令别名

​ alias命令,允许你为常用的命令(及其参数)创建另一个名称,从而将输入量减少到最低。

$ alias -p # 查看当前可用的别名
alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')"'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l='ls -CF'
alias la='ls -A'
alias ll='ls -alF'
alias ls='ls --color=auto'
$ alias li='ls -li' # 使用alias命令创建属于自己的别名,别名只是在自己的进程中可以使用在子进程和父进程都不能使用
$ li
total 36
529581 drwxr-xr-x. 2 Christine Christine 4096 May 19 18:17 Desktop
529585 drwxr-xr-x. 2 Christine Christine 4096 Apr 25 16:59 Documents

六、使用LInux环境变量

6.1 什么是环境变量

​ bash shell用一个叫作环境变量(environment variable)的特性来存储有关shell会话和工作环境的信息。

​ 在bash shell中,环境变量分为两类: 全局变量、局部变量

6.1.1 全局环境变量

​ 全局环境变量对于shell会话和所有生成的子shell都是可见的.局部变量则只对创建它们的shell可见。要查看全局变量,可以使用env或printenv命令。

$ printenv
SHELL=/bin/bash
ROS_VERSION=2
....
$ printenv HOME # 显示个别环境变量的值
/home/Christine
$ echo $HOME # 引用某个环境变量的时候,必须在变量前面加上一个美元符($)。
/home/Christine
$ ls $HOME # 在echo命令中,在变量名前加上$可不仅仅是要显示变量当前的值。它能够让变量作为命令行参数。
$ my_variable="I am Global now"
$ export my_variable # 局部环境变量,然后再把它导出到全局环境中,这样子shell也可以使用,修改子shell中全局环境变量并不会影响到父shell中该变量的值。子shell无法使用export命令改变父shell中全局环境变量的值
6.1.2 局部环境变量

​ 局部环境变量只能在定义它们的进程中可见

$ set #set命令会显示为某个特定进程设置的所有环境变量,包括局部变量、全局变量以及用户定义变量
$ echo $my_variable
$ my_variable=Hello # 变量名、等号和值之间没有空格,这一点非常重要。如果在赋值表达式中加上了空格,bash shell就会把值当成一个单独的命令
$ echo $my_variable
Hello
$ my_variable="Hello World"  # 若要定义字符串则必须加引号
$ unset my_variable # 能删除已经存在的环境变量,在子shell中删除全局变量后,你无法将效果反映到父shell中
6.2 设置PATH环境变量

​ 当你在shell命令行界面中输入一个外部命令时,shell必须搜索系统来找到对应的程序。PATH环境变量定义了用于进行命令和程序查找的目录。

$ echo $PATH # PATH中的目录使用冒号分隔.
/opt/ros/humble/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/snap/bin
$ myprog # 如果命令或者程序的位置没有包括在PATH变量中,那么如果不使用绝对路径的话, shell是没法找到的。如果shell找不到指定的命令或程序,它会产生一个错误信息
myprog: command not found
$ PATH=$PATH:/home/Panzhongsheng/Scripts # 添加PATH环境便利的路径
$ myprog # 将目录加到PATH环境变量之后,你现在就可以在虚拟目录结构中的任何位置执行程序。对PATH变量的修改只能持续到退出或重启系统,这种效果并不能一直持续
The factorial of 5 is 120.
$ export PATH # 如果希望子shell也能找到你的程序的位置,一定要记得把修改后的PATH环境变量导出。
6.3 环境变量持久化

​ 在你登入Linux系统启动一个bash shell时,默认情况下bash会在几个文件中查找命令。这些文件叫作启动文件或环境文件。

6.3.1 登录 shell

​ 当你登录Linux系统时,bash shell会作为登录shell启动。登录shell会从5个不同的启动文件里读取命令:

  • /etc/profile:系统上默认的bash shell的主启动文件。系统上的每个用户登录时都会执行这个启动文件。

    Ubuntu发行版的/etc/profile文件中,涉及了一个叫作/etc/bash.bashrc的文件。这个文件包含了系统环境变量。/etc/profile文件都用到了同一个特性: for 语句。它用来迭代/etc/profile.d目录下的所有文件,当用户登录时,shell会执行这些文件.

  • $HOME/.bash_profile

  • $HOME/.bashrc

  • $HOME/.bash_login

  • $HOME/.profile

注意:它们位于用户的HOME目录下,所以每个用户都可以编辑这些文件并添加自己的环境变
量,这些环境变量会在每次启动bash shell会话时生效。以上四个HOME目录下的环境变量文件不一定都有。

​ shell会按照按照下列顺序,运行第一个被找到的文件,余下的则被忽略:

  • $HOME/.bash_profile:先去检查HOME目录中是不是还有一个叫.bashrc的启动文件。如果有的话,会先执行启动文件里面的命令。

  • $HOME/.bash_login

  • $HOME/.profile

6.3.2 交互式 shell 进程

​ 如果你的bash shell不是登录系统时启动的(比如是在命令行提示符下敲入bash时启动),那么你启动的shell叫作交互式shell。它就不会访问/etc/profile文件,只会检查用户HOME目录中的.bashrc文件。

​ .bashrc文件有两个作用:一是查看/etc目录下通用的bashrc文件,二是为用户提供一个定制自己的命令别名和私有脚本函数的地方。

6.3.3 非交互式 shell

​ 没有命令行提示符.bash shell提供了BASH_ENV 环境变量。当shell启动一个非交互式shell进程时,它会检查这个环境变量来查看要执行的启动文件。如果有指定的文件,shell会执行该文件里的命令,这通常包括shell脚本变量设置。

6.3.4 环境变量持久化

​ 在/etc/profile.d目录中创建一个以.sh结尾的文件。把所有新的或修改过的全局环境变量设置放在这个文件中。

​ 在大多数发行版中,存储个人用户永久性bash shell变量的地方是 H O M E / . b a s h r c 文件。但如果设置了 B A S H E N V 变量 , 那么记住 , 除非它指向的是 HOME/.bashrc文件。但如果设置了 BASH_ENV 变量,那么记住,除非它指向的是 HOME/.bashrc文件。但如果设置了BASHENV变量,那么记住,除非它指向的是HOME/.bashrc,否则你应该将非交互式shell的用户变量放在别的地方。

注意:不要将全局环境变量设置在/etc/profile中,因为跟着发行版的升级会导致/etc/profile的文件内容发生改变。会将之前设置好的环境变量破环

6.4 数组变量

​ 环境变量有一个很酷的特性就是,它们可作为数组使用。要给某个环境变量设置多个值,可以把值放在括号里,值与值之间用空格分隔。

$ mytest=(one two three four five)
$ echo $mytest # 只有数组的第一个值显示出来了
one
$ echo ${mytest[2]} # 索引值要用方括号括起来
three
$ echo ${my_test[*]} # 显示整个数组,使用*通配符
one two three
$ my_test[2]=modify_three # 改变数组元素的值
$ echo ${my_test[2]}
modify_three
### unset命令删除数组中的某个值
$ unset mytest[2]
$
$ echo ${mytest[*]} # 显示整个数组时,看起来像是索引里面已经没这个索引了。
one two four five
$
$ echo ${mytest[2]} # 专门显示索引值为2的位置上的值时,就能看到这个位置是空的。
$ echo ${mytest[3]} 
four
$ unset mytest # unset命令后跟上数组名来删除整个数组。
$
$ echo ${mytest[*]}
$

​ 注意:由于shell的数组可移植性不是太好,所以一般不使用一数组变量进行操作

七、理解Linux文件权限

7.1 Linux的安全性

​ 每个能进入Linux系统的用户都会被分配唯一的用户账户。用户对系统中各种对象的访问权限取决于他们登录系统时用的账户,用户权限通过UID(用户唯一的标识符)来跟踪。我们登陆系统是通过输入用户名和密码进行登陆的,所以这里面就有一个用户名和UID、用户名和密码对应的关系。

7.1.1 /etc/passwd 文件

​ Linux系统使用/etc/passwd文件来将用户的登录名匹配到对应的UID值,包含了用户的相关信息。

$ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash # root用户账户是Linux系统的管理员,固定分配给它的UID是0。
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin # 这些账户叫作系统账户(并不是真的用户),是系统上运行的各种服务进程访问资源用的特殊账户。所有运行在后台的服务都需要用一个系统用户账户登录到Linux系统上。
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
文本分析:
 登录用户名:
 用户密码:密码字段都被设置成了x,即设置为加密的形式,绝大多数Linux系统都将用户密码保存在另一个单独的文件中(叫作shadow文件,位置在/etc/shadow)只有特定的程序(比如登录程序)才能访问这个文件。
 用户账户的UID(数字形式)
 用户账户的组ID(GID)(数字形式)
 用户账户的文本描述(称为备注字段)
 用户HOME目录的位置
 用户的默认shell

​ 注意:

  1. 一般这些后台服务是使用自己的账户登录的,防止系统被攻击,同时LInux为系统账户预留了500以下的UID的值。

    1. 不要自己区修改/etc/passwd文件,这样做极其危险,可能会导致用户无法正常登录系统。通过Linux用户管理工具更加安全
7.1.2 /etc/shadow 文件

​ 只有root用户才能访问/etc/shadow文件。/etc/shadow文件为系统上的每个用户账户都保存了一条记录

$ sudo cat /etc/shadow
[sudo] password for panzhongsheng: 
root:!:19183:0:99999:7:::
daemon:*:19101:0:99999:7:::

在/etc/shadow文件的每条记录中都有9个字段:
 与/etc/passwd文件中的登录名字段对应的登录名
 加密后的密码
 自上次修改密码后过去的天数密码(自1970年1月1日开始计算)
 多少天后才能更改密码
 多少天后必须更改密码
 密码过期前提前多少天提醒用户更改密码
 密码过期后多少天禁用用户账户
 用户账户被禁用的日期(用自1970年1月1日到当天的天数表示)
 预留字段给将来使用
7.1.3 添加新用户

​ 向Linux系统添加新用户的主要工具是 useradd。可以一次性创建新用户账户及设置用户HOME目录结构。

$ /usr/sbin/useradd -D # 查看所用Linux系统添加新用户时的默认值
GROUP=100 # 新用户会被添加到GID为100的公共组;
HOME=/home # 新用户的HOME目录将会位于/home/loginname;
INACTIVE=-1 # 新用户账户密码在过期后不会被禁用;
EXPIRE= # 新用户账户未被设置过期日期
SHELL=/bin/sh # 新用户账户将sh shell作为默认shell;
SKEL=/etc/skel #  系统会将/etc/skel目录下的内容复制到用户的HOME目录下,里面是bash shell环境的标准启动文件。系统会自动将这些默认文件复制到你创建的每个用户的HOME目录。
CREATE_MAIL_SPOOL=no # 系统不会为该用户账户在mail目录下创建一个用于接收邮件的文件

$ useradd -m test
$ ls -al /home/test # 默认情况下, useradd命令不会创建HOME目录,但是-m命令行选项会使其创建HOME目录。
$ useradd -D -s /bin/tsch # 可以在-D选项后跟上一个指定的值来修改系统默认的新用户设置
$ useradd -D
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/tsch # useradd命令会将tsch shell作为所有新建用户的默认登录shell。
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes
7.1.4 删除用户

​ 默认情况下, userdel命令会只删除/etc/passwd文件中的用户信息,而不会删除系统中属于该账户的任何文件。如果加上-r参数, userdel会删除用户的HOME目录以及邮件目录。然而,系统上仍可能存有已删除用户的其他文件。

# /usr/sbin/userdel -r test
# ls -al /home/test
ls: cannot access /home/test: No such file or directory
7.1.5 修改用户

Linux提供了一些不同的工具来修改已有用户账户的信息。

usermod		修改用户账户的字段,还可以指定主要组以及附加组的所属关系 # 它能用来修改/etc/passwd文件中的大部分字段,只需用与想修改的字段对应的命令行参数就可以了。-L选项尤其实用。它可以将账户锁定,使用户无法登录,同时无需删除账户和用户的数据。要让账户恢复正常,只要用-U选项就行了。
passwd		修改已有用户的密码 # 改变用户密码的一个简便方法就是用passwd命令如果只用 passwd命令,它会改你自己的密码。系统上的任何用户都能改自己的密码,但只有root用户才有权限改别人的密码。-e选项能强制用户下次登录时修改密码。你可以先给用户设置一个简单的密码,之后再强制在下次登录时改成他们能记住的更复杂的密码。
chpasswd	从文件中读取登录名密码对,并更新密码 # 能从标准输入自动读取登录名和密码对(由冒号分割)列表,给密码加密,然后为用户账户设置.可以用重定向命令来将含有 userid:passwd对的文件重定向给该命令。
chage		修改密码的过期日期
chfn		修改用户账户的备注信息
chsh		修改用户账户的默认登录shell #  chsh -s /bin/csh test
7.2 使用 Linux 组

​ 组权限允许多个用户对系统中的对象(比如文件、目录或设备等)共享一组共用的权限。每个组都有唯一的GID——跟UID类似,在系统上这是个唯一的数值。除了GID,每个组还有唯一的组名。

7.2.1 /etc/group 文件

​ 组信息保存在/etc/group文件,包含系统上用到的每个组的信息

$ cat /etc/group
root:x:0:
daemon:x:1:
bin:x:2:
sys:x:3:
adm:x:4:syslog,panzhongsheng
....
。/etc/group文件有4个字段:
 组名
 组密码
 GID
 属于该组的用户列表

​ 注:

  1. 和UID一样,GID在分配时也采用了特定的格式。系统账户用的组通常会分配低于500的GID
    值,而用户组的GID则会从500开始分配。

  2. 千万不能通过直接修改/etc/group文件来添加用户到一个组,要用 usermod命令

7.2.2 创建新组

​ groupadd命令可在系统上创建新组。

$ /usr/sbin/groupadd shared # 在创建新组时,默认没有用户被分配到该组。groupadd命令没有提供将用户添加到组中的选项,但可以用usermod命令来弥补这一点。
$ tail /etc/group
....
test:x:504:
shared:x:505:
$ /usr/sbin/usermod -G shared rich
$ /usr/sbin/usermod -G shared test # 。usermod命令的-G 选项会把这个新组添加到该用户账户的组列表里。
$ tail /etc/group 
....
test:x:504:
shared:x:505:rich, test # shared组现在有两个成员:test和 rich 

注意:

  1. 如果更改了已登录系统账户所属的用户组,该用户必须登出系统后再登录,组关系的更
    改才能生效。

  2. 如果加了-g选项,指定的组名会替换掉该账户的默认组。-G选项则将该组添加到用户的属组的列表里,不会影响默认组。

7.2.3 修改组

​ groupmod命令可以修改已有组的GID(加-g选项)或组名(加-n选项)

$ /usr/sbin/groupmod -n sharing shared
$ tail /etc/group # 修改组名时,GID和组成员不会变,只有组名改变。于所有的安全权限都是基于GID的,你可以随意改变组名而不会影响文件的安全性。
...
test:x:504:
sharing:x:505:test,rich
7.3 理解文件权限
7.3.1 使用文件权限符
$ ls –l
$ ls -l
total 60
drwxr-xr-x 2 panzhongsheng panzhongsheng 4096 Jul 28 19:14 Desktop
drwxr-xr-x 3 panzhongsheng panzhongsheng 4096 Jul 30 13:26 Documents
drwxr-xr-x 9 panzhongsheng panzhongsheng 4096 Jul 28 13:31 Downloads
drwxr-xr-x 2 panzhongsheng panzhongsheng 4096 Jul 11 04:27 Music
-rw-rw-r-- 1 panzhongsheng panzhongsheng 4096 Jul 11 04:28 myprog.c
输出结果的第一个字段就是描述文件和目录权限的编码。这个字段的第一个字符代表了对象的类型:
 -代表文件
 d代表目录
 l代表链接
 c代表字符型设备
 b代表块设备
 n代表网络设备
之后有3组三字符的编码。每一组定义了3种访问权限:
 r代表对象是可读的
 w代表对象是可写的
 x代表对象是可执行的
若没有某种权限,在该权限位会出现单破折线。这3组权限分别对应对象的3个安全级别:
 对象的属主
 对象的属组
 系统其他用户

Linux中通过umask来确定文件以及目录的默认权限的。

八、管理文件系统

8.1 ext系统简介

​ Linux操作系统中引入的最早的文件系统叫作扩展文件系统 (extended filesystem,简记为ext),为linux提供了一个类Unix文件系统,使用虚拟目录来操作硬件设备,在物理设备上按照定长的块进行存储。

​ ext文件系统采用名为索引节点的系统来存放虚拟目录中所存储文件的信息。索引节点系统在每个物理设备中创建一个单独的表(称为索引节点表)来存储这些文件的信息。每一个在物理设备上的文件都在该物理设备的索引节点表上有一个条目,包括文件名、文件大小、文件属主、文件属组、文件访问权限、指向存有文件数据的每个硬盘块的指针。

​ Linux通过唯一的数值(称作索引节点号)来引用索引节点表中的每个索引节点,这个值是创建文件时由文件系统分配的。文件系统通过索引节点号而不是文件全名及路径来标识文件。

​ ext4文件系统,已是大多数流行的Linux发行版采用的默认文件系统,比如Ubuntu。支持数据压缩和加密。

​ 支持一个称作区段(extent)的特性,区段在存储设备上按块分配空间,但在索引节点表中只保存起始块的位置。由于无需列出所有用来存储文件中数据的数据块,它可以在索引节点表中节省一些空间。

​ 引入了块预分配技术(block preallocation)。如果你想在存储设备上给一个你知道要变大的文件预留空间,ext4文件系统可以为文件分配所有需要用到的块,而不仅仅是那些现在已经用到的块。ext4文件系统用 0填满预留的数据块,不会将它们分配给其他文件。

8.2 操作文件系统
8.2.1 创建分区

​ 一开始必须要使用分区(硬盘或者部分硬盘)来容纳文件系统,fdisk可以用来管理分区。

$ sudo fdisk /dev/sdb # 必须使用sudo权限,而且要指定分区

​ 分区可以按主分区(primary partition)或扩展分区(extended partition)创建,主分区可以被文件系统直接格式化,而扩展分区只能容纳其他主分区。可创建多个扩展分区,然后在扩展分区内创建主分区进行扩展

8.2.2 创建文件系统

​ 要想知道某个文件系统工具是否可用,可以使用type命令。

$ type mkfs.ext4
mkfs.ext4 is /usr/sbin/mkfs.ext4
$ sudo mkfs.ext4 /dev/sdb1 # 创建文件系统,采用的是ext4文件系统类型

​ 为分区创建了文件系统之后,下一步是将它挂载到虚拟目录下的某个挂载点,这样就可以将文件存储在新的文件系统上了

$ ls /mnt
$
$ sudo mkdir /mnt/my_partition # 在虚拟目录中创建了挂载点, 
$ sudo mount -t ext4 /dev/sdb1 /mnt/my_partition # 挂载文件系统

注:这种挂载文件系统的方法只能临时挂载文件系统。当重启Linux系统时,文件系统并不会
自动挂载。要强制Linux在启动时自动挂载新的文件系统,可以将其添加到/etc/fstab文件。

8.2.3 文件系统的检查与修复

​ 碰上突然断电或者某个不规矩的程序在访问文件时锁定了系统,也会出现错误,这个时候就需要使用命令行工具修复文件系统

​ fsck命令能够检查和修复大部分类型的Linux文件系统,如ext4、XFS等

fsck options filesystem # 文件系统可以通过设备名、在虚拟目录中的挂载点以及分配给文件系统的唯一UUID值来引用,fsck命令使用/etc/fstab文件来自动决定正常挂载到系统上的存储设备的文件系统,

注:只能在未挂载的文件系统上运行fsck 命令。对大多数文件系统来说,你只需卸载文件系统来进行检查,检查完成之后重新挂载就好了。而根文件系统则需要通过使用Linux LIveCD来启动系统然后在根文件上运行fsck命令。

8.3 逻辑卷管理

​ 通过Linux逻辑卷管理器(LVM:(logical volume manager)软件包将另外一个硬盘上的分区加入已有文件系统,动态地添加存储空间。这样我们就无需重建文件系统,可以轻松管理磁盘空间

8.3.1 逻辑卷管理布局

​ 在逻辑卷管理的世界里,硬盘称作物理卷(physical volume,PV),每个物理卷都会映射到硬盘上特定的物理分区。多个物理卷集中在一起可以形成一个卷组(volume group,VG)。

​ 逻辑卷将一个卷组视作一个物理硬盘,但事实上卷组可能是由分布在多个物理硬盘上的多个物理分区组成的。Linux将逻辑卷设做一个物理分区。
在这里插入图片描述

8.3.1 LVM
  • 快照:允许在逻辑卷下线的时候复制到另外一个设备中,LVM2可允许参加可读写快照

  • 条带化:可跨多个物理硬盘创建逻辑卷,Linux可以将一个文件的多个数据块同时写入多个硬盘,而无需等待单个硬盘移动读写磁头到多个不同位置。

  • 镜像:镜像是一个实时更新的逻辑卷的完整副本,创建镜像逻辑卷时,LVM会将原始逻辑卷同步到镜像副本中。一旦原始同步完成,LVM会为文件系统的每次写操作执行两次写入——一次写入到主逻辑卷,一次写入到镜像副本。

8.3.2 使用 Linux LVM
  1. 定义物理卷

​ 将硬盘上的物理分区转换成Linux LVM使用的物理卷区段

$ sudo fdisk /dev/sdb1
[...]
Command (m for help): t
Selected partition 1
Hex code (type L to list codes): 8e # 分区类型8e表示这个分区将会被用作Linux LVM系统的一部分
Changed system type of partition 1 to 8e (Linux LVM)
Command (m for help): p
Disk /dev/sdb: 5368 MB, 5368709120 bytes
255 heads, 63 sectors/track, 652 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0xa8661341
Device/dev/sdb1
Boot
Start
1
End
262
Blocks
 Id
 System
2104483+
 8e
 Linux LVM
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
# 用分区来创建实际的物理卷。这可以通过pvcreate命令来完成, pvcreate定义了用于物理卷的物理分区
$ sudo pvcreate /dev/sdb1
dev_is_mpath: failed to get device for 8:17
Physical volume "/dev/sdb1" successfully created
$ sudo pvdisplay /dev/sdb1 # pvdisplay命令显示出/dev/sdb1现在已经被标记为物理卷
"/dev/sdb1" is a new physical volume of "2.01 GiB"
--- NEW Physical volume ---
PV Name /dev/sdb1
VG Name PV Size 2.01 GiB Allocatable
  1. 创建卷组

​ 从物理卷中创建一个或多个卷组。要从命令行创建卷组,需要使用vgcreate命令

$ sudo vgcreate Vol1 /dev/sdb1
Volume group "Vol1" successfully created
$ sudo vgdisplay Vol1 # 查看新建的卷组
--- Volume group ---
VG Name Vol1
  1. 创建逻辑卷

​ Linux系统使用逻辑卷来模拟物理分区,并在其中保存文件系统,允许你定义逻辑卷中的文件系统,然后将文件系统挂载到虚拟目录上

$ sudo lvcreate -l 100%FREE -n lvtest Vol1
Logical volume "lvtest" created
$ sudo lvdisplay Vol1 # 查看创建的逻辑卷的详细情况。卷组名(Vol1)用来标识创建新逻辑卷时要使用的卷组。
--- Logical volume ---
LV Path	/dev/Vol1/lvtest
  1. 创建文件系统
$ sudo mkfs.ext4 /dev/Vol1/lvtest # 在创建了新的文件系统之后,可以用标准Linux mount命令将这个卷挂载到虚拟目录中,就跟它是物理分区一样.。唯一的不同是你需要用特殊的路径来标识逻辑卷
mke2fs 1.41.12 (17-May-2010)
Filesystem label=
...
# 路径中使用了卷组名和逻辑卷名
$ sudo mount /dev/Vol1/lvtest /mnt/my_partition
$ mount
/dev/mapper/vg_server01-lv_root on / type ext4 (rw)
[...]
  1. 修改LVM
    Linux LVM的好处在于能够动态修改文件系统,通过使用这些命令行程序,就能完全控制你的Linux LVM环境。
vgchange	激活和禁用卷组
vgremove	删除卷组
vgextend	将物理卷加到卷组中
vgreduce	从卷组中删除物理卷
lvextend	增加逻辑卷的大小
lvreduce	减小逻辑卷的大小

九、Linux的软件管理

9.1 包管理基础

​ 各种主流Linux发行版都采用了某种形式的包管理系统(PMS:package management system)来控制软件和库的安装。软件包安装在服务器上,Linux系统可以使用PMS工具通过互联网访问,这些服务器称为仓库。可以用PMS工具来搜索新的软件包,或者是更新系统上已安装软件包。

​ 软件包通常会依赖其他的包,所以安装包之前,依赖的包一定要安装好。关于PMS并没有统一的,基于Debian的发行版(如Ubuntu和Linux Mint)使用的是 dpkg命令, dpkg会直接和Linux系统上的PMS交互,用来安装、管理和删除软件包。

​ 基于Debain的工具:

  • apt-get:
  • apt-cache
  • aptitude(最为常用):使用aptitude 命令有助于避免常见的软件安装问题,如软件依赖关系缺失、系统环境不稳定及其他一些不必要的麻烦。
$ aptitude
# 执行后进入界面,可以按下左右按键进入相应的选项和退出选项
$ aptitude show mysql-client # 显示包的详细信息
Package: mysql-client
State: not installed
Version: 5.5.38-0ubuntu0.14.04.1 
...

注:aptitude show命令显示上面例子中的软件包还没有安装到系统上。它输出的软件包相关的详细信息来自于软件仓库。

$ dpkg -L vim-common # 	查看软件包的所有文件
/.
/etc
/etc/vim
/etc/vim/vimrc
[....]
$ dpkg --search /usr/bin/xxd # 查找某个特定文件属于哪个软件包
vim-common: /usr/bin/xxd
$ aptitude search wine # 用aptitude来查找wine软件包
p   carla-bridge-wine32:i386        - carla win32 bridge (wine DLL)             
p   carla-bridge-wine64             - carla win64 bridge (wine DLL)   
[....]
$ sudo aptitude install wine # 用aptitude从软件仓库中安装软件包
The following NEW packages will be installed:
cabextr
[....]
$sudo aptitude safe-upgrade # 用软件仓库中的新版本妥善地更新系统上所有的软件包,safe-upgrade选项会将所有已安装的包更新到软件仓库中的最新版本,更有利于系统稳定。
$ sudo aptitude purge wine # 卸载wine软件包
[sudo] password for user:
The following packages will be REMOVED:
cabextract{u} esound-clients{u} esound-common{u} gnome-exe-thumbnailer
[....]
  • Ubuntu系统中sources.list文件解析

    deb (or deb-src) address distribution_name package_type_list
    
    • deb或 deb-src的值表明了软件包的类型, deb值说明这是一个已编译程序源,而deb-src值则说明这是一个源代码的源。

    • address条目是软件仓库的Web地址

    • distribution_name条目是这个特定软件仓库的发行版版本的名称

    • package_type_list条目可能并不止一个词,它还表明仓库里面有什么类型的包,如main、restricted、universe和partner等

十、使用VIM编辑器

10.1 检查vim软件包

​ 如果vim程序被设置了链接,它可能会被链接到一个功能较弱的编辑器。所以最好还是检查一下链接文件。

$ alias vi
alias vi='vim'

$ which vim
/usr/bin/vim

$ ls -l /usr/bin/vim
lrwxrwxrwx 1 root root 21 Jul 10 20:32 /usr/bin/vim -> /etc/alternatives/vim
$ ls -l /etc/alternatives/vim
lrwxrwxrwx 1 root root 18 Jul 10 20:32 /etc/alternatives/vim -> /usr/bin/vim.basic
$ ls -l /usr/bin/vim.basic 
-rwxr-xr-x 1 root root 3779440 Apr 19 03:26 /usr/bin/vim.basic
因此,当输入vi命令时,执行的是程序/usr/bin/vim.basic:具有vim编辑器的基本功能
# 使用readlink可以直接查看到最终链接的目标
$ readlink -f /usr/bin/vi
/usr/bin/vim.basic
10.2 vim 基础
$ vim myprog.c # 如在启动vim时未指定文件名,或者这个文件不存在,vim会开辟一段新的缓冲区域来编辑.如果你在命令行下指定了一个已有文件的名字,vim会将文件的整个内容都读到一块缓冲区域来准备编辑

vim编辑器有两种操作模式:

  • 普通模式:当你刚打开要编辑的文件时(或新建一个文件时),vim编辑器会进入普通模式。
  • 插入模式:vim会将你在当前光标位置输入的每个键都插入到缓冲区。按下i键就可以进入插入模式。要退出插入模式回到普通模式,按下键盘上的退出键(ESC键,也就是Escape键)
10.3 编辑数据
x	删除当前光标所在位置的字符
dd	删除当前光标所在行
dw	删除当前光标所在位置的单词
d$	删除当前光标所在位置至行尾的内容
J	删除当前光标所在行行尾的换行符(拼接行)
u	撤销前一编辑命令
a	在当前光标后追加数据
A	在当前光标所在行行尾追加数据
r char	用char替换当前光标所在位置的单个字符
R text	用text覆盖当前光标所在位置的数据,直到按下ESC键
10.4 复制和粘贴

​ vim中复制命令是y(代表yank)可以在 y后面使用和d命令相同的第二字符,在复制文本后,把光标移动到你想放置文本的地方,输入p命令。复制的文本就会出现在该位置。

10.5 查找和替换

​ 要输入一个查找字符串,就按下斜线(/)键。光标会跑到消息行,然后vim会显示出斜线。在输入你要查找的文本后,按下回车键。要继续查找同一个单词,按下斜线键,然后按回车键。或者使用n键,表示下一个(next)。

​ 替换命令允许你快速用另一个单词来替换文本中的某个单词,替换命令的格式是:

:s/old/new/ # vim编辑器会跳到old第一次出现的地方,并用new来替换
 :s/old/new/g:一行命令替换所有old。
 :n,ms/old/new/g:替换行号n和m之间所有old 
 :%s/old/new/g:替换整个文件中的所有old
 :%s/old/new/gc:替换整个文件中的所有old,但在每次出现时提示
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/pzslongyutianxia/article/details/126276685

智能推荐

分布式光纤传感器的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告_预计2026年中国分布式传感器市场规模有多大-程序员宅基地

文章浏览阅读3.2k次。本文研究全球与中国市场分布式光纤传感器的发展现状及未来发展趋势,分别从生产和消费的角度分析分布式光纤传感器的主要生产地区、主要消费地区以及主要的生产商。重点分析全球与中国市场的主要厂商产品特点、产品规格、不同规格产品的价格、产量、产值及全球和中国市场主要生产商的市场份额。主要生产商包括:FISO TechnologiesBrugg KabelSensor HighwayOmnisensAFL GlobalQinetiQ GroupLockheed MartinOSENSA Innovati_预计2026年中国分布式传感器市场规模有多大

07_08 常用组合逻辑电路结构——为IC设计的延时估计铺垫_基4布斯算法代码-程序员宅基地

文章浏览阅读1.1k次,点赞2次,收藏12次。常用组合逻辑电路结构——为IC设计的延时估计铺垫学习目的:估计模块间的delay,确保写的代码的timing 综合能给到多少HZ,以满足需求!_基4布斯算法代码

OpenAI Manager助手(基于SpringBoot和Vue)_chatgpt网页版-程序员宅基地

文章浏览阅读3.3k次,点赞3次,收藏5次。OpenAI Manager助手(基于SpringBoot和Vue)_chatgpt网页版

关于美国计算机奥赛USACO,你想知道的都在这_usaco可以多次提交吗-程序员宅基地

文章浏览阅读2.2k次。USACO自1992年举办,到目前为止已经举办了27届,目的是为了帮助美国信息学国家队选拔IOI的队员,目前逐渐发展为全球热门的线上赛事,成为美国大学申请条件下,含金量相当高的官方竞赛。USACO的比赛成绩可以助力计算机专业留学,越来越多的学生进入了康奈尔,麻省理工,普林斯顿,哈佛和耶鲁等大学,这些同学的共同点是他们都参加了美国计算机科学竞赛(USACO),并且取得过非常好的成绩。适合参赛人群USACO适合国内在读学生有意向申请美国大学的或者想锻炼自己编程能力的同学,高三学生也可以参加12月的第_usaco可以多次提交吗

MySQL存储过程和自定义函数_mysql自定义函数和存储过程-程序员宅基地

文章浏览阅读394次。1.1 存储程序1.2 创建存储过程1.3 创建自定义函数1.3.1 示例1.4 自定义函数和存储过程的区别1.5 变量的使用1.6 定义条件和处理程序1.6.1 定义条件1.6.1.1 示例1.6.2 定义处理程序1.6.2.1 示例1.7 光标的使用1.7.1 声明光标1.7.2 打开光标1.7.3 使用光标1.7.4 关闭光标1.8 流程控制的使用1.8.1 IF语句1.8.2 CASE语句1.8.3 LOOP语句1.8.4 LEAVE语句1.8.5 ITERATE语句1.8.6 REPEAT语句。_mysql自定义函数和存储过程

半导体基础知识与PN结_本征半导体电流为0-程序员宅基地

文章浏览阅读188次。半导体二极管——集成电路最小组成单元。_本征半导体电流为0

随便推点

【Unity3d Shader】水面和岩浆效果_unity 岩浆shader-程序员宅基地

文章浏览阅读2.8k次,点赞3次,收藏18次。游戏水面特效实现方式太多。咱们这边介绍的是一最简单的UV动画(无顶点位移),整个mesh由4个顶点构成。实现了水面效果(左图),不动代码稍微修改下参数和贴图可以实现岩浆效果(右图)。有要思路是1,uv按时间去做正弦波移动2,在1的基础上加个凹凸图混合uv3,在1、2的基础上加个水流方向4,加上对雾效的支持,如没必要请自行删除雾效代码(把包含fog的几行代码删除)S..._unity 岩浆shader

广义线性模型——Logistic回归模型(1)_广义线性回归模型-程序员宅基地

文章浏览阅读5k次。广义线性模型是线性模型的扩展,它通过连接函数建立响应变量的数学期望值与线性组合的预测变量之间的关系。广义线性模型拟合的形式为:其中g(μY)是条件均值的函数(称为连接函数)。另外,你可放松Y为正态分布的假设,改为Y 服从指数分布族中的一种分布即可。设定好连接函数和概率分布后,便可以通过最大似然估计的多次迭代推导出各参数值。在大部分情况下,线性模型就可以通过一系列连续型或类别型预测变量来预测正态分布的响应变量的工作。但是,有时候我们要进行非正态因变量的分析,例如:(1)类别型.._广义线性回归模型

HTML+CSS大作业 环境网页设计与实现(垃圾分类) web前端开发技术 web课程设计 网页规划与设计_垃圾分类网页设计目标怎么写-程序员宅基地

文章浏览阅读69次。环境保护、 保护地球、 校园环保、垃圾分类、绿色家园、等网站的设计与制作。 总结了一些学生网页制作的经验:一般的网页需要融入以下知识点:div+css布局、浮动、定位、高级css、表格、表单及验证、js轮播图、音频 视频 Flash的应用、ul li、下拉导航栏、鼠标划过效果等知识点,网页的风格主题也很全面:如爱好、风景、校园、美食、动漫、游戏、咖啡、音乐、家乡、电影、名人、商城以及个人主页等主题,学生、新手可参考下方页面的布局和设计和HTML源码(有用点赞△) 一套A+的网_垃圾分类网页设计目标怎么写

C# .Net 发布后,把dll全部放在一个文件夹中,让软件目录更整洁_.net dll 全局目录-程序员宅基地

文章浏览阅读614次,点赞7次,收藏11次。之前找到一个修改 exe 中 DLL地址 的方法, 不太好使,虽然能正确启动, 但无法改变 exe 的工作目录,这就影响了.Net 中很多获取 exe 执行目录来拼接的地址 ( 相对路径 ),比如 wwwroot 和 代码中相对目录还有一些复制到目录的普通文件 等等,它们的地址都会指向原来 exe 的目录, 而不是自定义的 “lib” 目录,根本原因就是没有修改 exe 的工作目录这次来搞一个启动程序,把 .net 的所有东西都放在一个文件夹,在文件夹同级的目录制作一个 exe._.net dll 全局目录

BRIEF特征点描述算法_breif description calculation 特征点-程序员宅基地

文章浏览阅读1.5k次。本文为转载,原博客地址:http://blog.csdn.net/hujingshuang/article/details/46910259简介 BRIEF是2010年的一篇名为《BRIEF:Binary Robust Independent Elementary Features》的文章中提出,BRIEF是对已检测到的特征点进行描述,它是一种二进制编码的描述子,摈弃了利用区域灰度..._breif description calculation 特征点

房屋租赁管理系统的设计和实现,SpringBoot计算机毕业设计论文_基于spring boot的房屋租赁系统论文-程序员宅基地

文章浏览阅读4.1k次,点赞21次,收藏79次。本文是《基于SpringBoot的房屋租赁管理系统》的配套原创说明文档,可以给应届毕业生提供格式撰写参考,也可以给开发类似系统的朋友们提供功能业务设计思路。_基于spring boot的房屋租赁系统论文