鸟哥的Linux私房菜

  1. 20231223232318

南桥(Southbridge)是计算机主板上一种重要的芯片组(Chipset)组件,它负责处理与主板上的外围设备和低速设备的通信。而目前北桥已被整合进了CPU内部。

  • 外频: CPU 与外部组件之间的通信速度, 倍频: 内部加速
  • 频率速度: 外频 * 倍频
  • 前端总线速度 (Front Side Bus, FSB) = 内存频率 * 位宽
  1. 个人电脑的内存主要元件为动态随机存取内存(Dynamic Random Access Memory, DRAM. DRAM 技术有两代技术:SDRAM 与 DDR (Double Data Rate). DDR 在一次工作周期中进行多次次数据的传送,而核心频率从 DDR1 到 DDR3 变化不大.

  1. 而为了增加数据位宽, 采用多通道技术, 例如 DDR3-1600 有 2 个通道,如果每个通道有 64 位, 则总线宽度为 128 位, 传输速度为 1600 * 128 / 8 = 25600 MB/s.

  2. 除了 DRAM, 还有静态随机存取内存(Static Random Access Memory, SRAM), 速度比 DRAM 快, 但是价格也贵很多, 一般用于 CPU 的二级缓存.

  3. ROM 为只读存储器, 用于存储 BIOS 等固件, 一般不可写入, 但是也有可写入的 ROM, 例如 EEPROM, Flash 等.

  4. 显卡的插槽通常为 PCLe, 有 1x, 4x, 8x, 16x 等, 代表了通道的数量, 例如 16x 代表有 16 个通道. 一般家用 CPU 最大允许 16x. 如需扩展只能接在南桥上, 速度较慢.

  5. 20231223235310 如图所示,外圈具有更多的扇区,因此默认从外向内进行读取。扇区一般为 512Byte 或者 4kByte.

  6. Linux 历史 1960年代初期,麻省理工学院(MIT)发展了: “相容分时系统(Compatible Time-Sharing System, CTSS)”, 它可以让大型主机通过提供数个终端机(terminal)以连线进入主机,来利用主机的资源进行运算工作。

1969年,Thompson 实现了一个文件系统 Unics. 这个文件系统有两个重要的概念,分别是:

  • 所有的程序或系统设备都是文件

  • 不管建构编辑器还是附属文件,所写的程序只有一个目的,且要有效的完成目标

1973年:Unix的正式诞生,Ritchie等人以C语言写出第一个正式Unix核心

1977年, Bill Joy 开发了 Berkeley Software Distribution (BSD) Unix, 成为 Unix 的分支.

1979年,AT&T推出 System V 第七版 Unix 后,这个情况就有点改善了,支持x86架构的个人计算机系统,且将 Unix 版权收回

1983年,Richard Stallman 开始 GNU 项目, 以 GPL 授权发布软件, 以保证软件的自由性. GNU 原本像实现一个完整的 Unix 系统, 但是缺少内核. 于是先实现了一些软件如, gcc, emacs, bash 等. 后由 Linus Torvalds 开发了 Linux 内核, 参考标准的POSIX规范,以实现所有软件都能在 linux 上运行.

  1. Linux 版本
    1
    2
    3.10.0-123.el7.x86_64
    主版本.次版本.释出版本-修改版本

在 2.6.x 版本以前,托瓦兹将核心的发展趋势分为两股,并根据这两股核心的发展分别给予不同的核心编号,那就是:

  • 主、次版本为奇数:发展中版本(development) 如2.5.xx

  • 主、次版本为偶数:稳定版本(stable) 如2.6.xx

从 3.0 版开始,核心主要依据主线版本 (MainLine) 来开发,开发完毕后会往下一个主线版本进行。 例如 3.10 就是在 3.9 的架构下继续开发出来的新的主线版本。而旧的版本在新的主线版本出现之后,会有两种机制来处理,一种机制为结束开发 (End of Live, EOL),亦即该程序码已经结束,不会有继续维护的状态。 另外一种机制为保持该版本的持续维护,亦即为长期维护版本 (Longterm)

  1. 磁盘分区:

在Linux系统中,每个设备都被当成一个文件来对待, SATA接口的硬盘文件名为 /dev/sd[a-d]. 分区的最小单位为磁盘的一个柱面。 分区的作用: - 数据的安全性: 因为每个分区的数据是分开的 - 将数据集中在柱面的区段中,提高数据读写性能

  1. MBR 分区: 在第一个扇区存放两个数据:
  • 主要开机记录区(Master Boot Record, MBR):可以安装开机管理程序的地方,有446 Bytes
  • 分区表(partition table):记录整颗硬盘分区的状态,有64 Bytes. 记录区段的起始和结束的柱面号码,最多记录四个分区。

磁盘分区表的作用示意图

延伸(Extended)分区

一个扇区的分区表只能记录四个分区,那么可以通过额外的扇区来记录更多的分区信息

磁盘分区表的作用示意图
  1. P1为主要分区,而P2则为延伸分区.上图右下方那个区块有继续分区出五个分区, 这五个由延伸分区继续切出来的分区,就被称为逻辑分区(logical partition)

  2. MBR 分区表的限制:

  • 操作系统无法抓取到 2.2T 以上的磁盘容量!
  • MBR 仅有一个区块,若被破坏后,经常无法或很难救援。
  • MBR 内的存放开机管理程序的区块仅 446Bytes,无法容纳较多的程序码。
  1. GPT 磁盘分区表:

GPT 将磁盘所有区块以此 LBA(Logical Block Address), 默认为 512Bytes 来规划. GPT 分区表的结构示意图

  • LBA0(MBR 相容区块)

    与 MBR 模式相似的,这个相容区块也分为两个部份,一个就是跟之前 446 Bytes 的 bootloader. 而在原本的分区表的纪录区内,这个相容模式仅放入一个特殊标志的分区,用来表示此磁盘为 GPT 格式之意。 而不懂 GPT 分区表的磁盘管理程序, 就不会认识这颗磁盘.

  • LBA1(GPT 表头纪录)

    纪录分区表本身的位置与大小,同时纪录了备份用的 GPT 分区放置的位置, 同时放置了分区表的检验机制码。 若有错误,还可以通过取得备份的 GPT(磁盘最后的那个备份区块)来恢复 GPT 的正常运行.

  • LBA2-33(实际纪录分区信息处)

    从 LBA2 区块开始,每个 LBA 都可以纪录 4 笔分区纪录,总共可以有 4 * 32 = 128 笔分区纪录.因为每个 LBA 有 512Bytes,因此每笔纪录用到 128 Bytes 的空间,除了每笔纪录所需要的识别码与相关的纪录之外,GPT 在每笔纪录中分别提供了 64bits 来记载开始/结束的扇区号码,因此,GPT 分区表对于单一分区来说, 他的最大容量限制就会在 $2^{64} * 512 $ Bytes = $ 2{63} 1k $ Bytes = \(2^{33}\) TB

  1. BIOS则是一个写入到主板上的一个固件, 在开机时执行的第一个程序,此后此后 BIOS 读取硬盘上的第一个扇区的 MBR 位置。将 MBR 中 446 bytes 的 boot loader 载入内存。最终由 boot loader 将操作系统载入。

如果使用 GPT 分区,要求 BIOS 必须能正确识别 GPT.

  1. Bootloader 的主要任务:
  • 提供菜单:使用者可以选择不同的开机项目,例如双系统
  • 载入核心文件:直接指向可开机的程序区段来开始操作系统;
  • 转交其他loader:将开机管理功能转交给其他loader负责。
Boot Loader 工作示意图
  1. MBR的开机管理程序提供两个菜单,菜单一(M1)可以直接载入Windows的核心文件来开机; 菜单二(M2)则是将开机管理工作交给第二个分区的开机扇区(boot sector)

  2. BIOS boot 分区:

BIOS Boot分区的存在是为了解决传统BIOS在引导过程中无法直接访问大于2TB(2,048GB)的存储空间的限制。由于传统BIOS使用32位的寻址方式,最大可以寻址232个扇区,每个扇区大小为512字节,因此最多支持到2TB的硬盘(232 * 512字节 = 2TB)。

为了克服这个限制,引入了BIOS Boot分区。它被用作一个辅助分区,存储用于引导的引导加载程序(bootloader)。引导加载程序将位于大于2TB的存储设备上的操作系统的加载过程分割为两个步骤:首先从BIOS Boot分区加载引导加载程序,然后由引导加载程序继续加载操作系统。

  1. 由于 BIOS 不支持 GPT分区,UEFI 的出现取代了 BIOS.

  2. 在Linux系统中设计类似于Windows中的分区的概念时,可以使用挂载(mount)来将磁盘分区与目录树结构关联起来。

目录树与分区之间的相关性

partition 1是挂载到根目录,至于partition 2则是挂载到/home这个目录

  1. 在Linux系统中,可以通过以下步骤来设计类似的分区结构:

  2. 分区磁盘:首先,在磁盘上创建需要的分区。可以使用工具如fdisk或parted来创建和管理分区。例如,可以创建一个根分区和一个数据分区。

  3. 格式化分区:对于每个创建的分区,需要使用文件系统格式化它们。常用的文件系统包括ext4、XFS和Btrfs等。例如,可以对根分区使用ext4文件系统,对数据分区使用XFS文件系统。

  4. 挂载分区:将已格式化的分区挂载到适当的目录中。可以使用mount命令来挂载分区,指定分区路径和相应的挂载点。例如,将根分区挂载到/(根目录),将数据分区挂载到/home。

  5. 设置自动挂载:如果希望在系统启动时自动挂载分区,可以在/etc/fstab文件中添加相应的条目。这样,每次系统启动时,分区将自动挂载到指定的挂载点。

  6. TTY(Teletypewriter)是指计算机系统中的一个终端设备。 Linux 默认提供六个终端用户进行登录, 其中 1 号终端为图形用户界面模式。

  • Ctrl + Alt + F1-F6 切换 TTY
  • starx 启动图形界面
  • exit 注销
  1. Linux 文件权限
文件属性的示意图
  • 第一栏代表文件类型和权限: 一般文件(-), 目录(d), 符号链接(l), 字符设备(c), 块设备(b). 接下来的9个字符为文件所有者的权限,文件所属群组的权限,其他人的权限.
  1. 修改文件属性和权限
  • chgrp 修改文件所属群组
  • chown 修改文件所有者
  • chmod 修改文件权限 每种身份的各自三个权限累加, e.g [-rwxrwx---]
    1
    2
    3
    owner = 4 + 2 + 1 = 7 
    group = 4 + 2 + 1 = 7
    others = 0
  1. 目录与文件之权限意义
  • "r" 表示读取权限(read),表示用户能够读取文件的内容或查看目录中的文件列表。

  • "w" 表示写入权限(write),表示用户能够修改文件内容或在目录中创建、删除、重命名文件。

  • "x" 表示执行权限(execute),对于文件来说,表示用户能够执行文件(如果是可执行文件),对于目录来说,表示用户能够进入目录,即访问目录中的内容。

  • 文件具有SUID的特殊权限时,代表当使用者执行此一binary程序时,在执行过程中用户会暂时具有程序所有者的权限

  • 目录具有SGID的特殊权限时,代表用户在这个目录底下新建的档案之群组都会与该目录的组合名称相同。

  • 目录具有SBIT的特殊权限时,代表在该目录下用户建立的文件只有自己与root能够删除!

  1. Linux文件种类与扩展名
  • 正规文件(regular file ): 第一个字符为 [ - ],依照文件的内容,又大略可以分为:

    • 纯文本文件(ASCII):称为纯文本文件是因为内容为我们人类可以直接读到的数据,例如数字、字母等等。 几乎只要我们可以用来做为设置的文件都属于这一种文件类型。 举例来说,你可以下达“ cat ~/.bashrc ”就可以看到该文件的内容。 (cat 是将一个文件内容读出来的指令)
    • Binary
    • data. 通过 last 指令读出来
  • 目录

  • 链接文件(link):soft link. 类似Windows系统下面的捷径

  • 设备与设备文件(device): 与系统周边及储存等相关的一些文件, 通常都集中在/dev这个目录之下, 通常又分为两种:

    • 区块(block)设备文件 :储存数据, 以提供系统随机存取的周边设备,例如硬盘与软盘等! /dev/sda

    • 字符设备(Character Device)是一种设备驱动程序,用于与字符流进行交互。 字符设备与块设备(Block Device)相对应,块设备以固定大小的数据块(通常是512字节或更大)进行访问,而字符设备则以字符为单位进行访问。一些常见的字符设备包括终端设备(如终端终端/tty)、串行端口设备(如COM端口)、键盘、鼠标等。

  1. Linux目录配置的依据--FHS Filesystem Hierarchy Standard (FHS)标准 的目的: 让用户可以了解到已安装软件通常放置于那个目录下, 也就是说,FHS的重点在于规范每个特定的目录下应该要放置什么样子的资料而已。

而将目录定义成为四种交互作用的形态

20231228150215
  • 可分享的:多个计算机之间可以共享访问可以分享给其他系统挂载使用的目录,所以包括执行文件与用户的邮件等资料, 是能够分享给网络上其他主机挂载用的目录;

  • 不可分享的:自己机器上面运作的装置档案或者是与程序有关的socket档案等, 由于仅与自身机器有关,所以当然就不适合分享给其他主机了。

  • 不变的:有些数据是不会经常变动的,跟随着distribution而不变动。 例如函式库、文档说明文件、系统管理员所管理的主机服务配置文件等等;

  • 可变动的:经常改变的资料,例如登录文件、一般用户可自行收受的新闻群组等。

  1. 根目录(/) 的意义和内容 常见目录
  • /bin: 放置系统执行文件,例如 ls, cp, mv 等等
  • /boot: 放置开机会使用到的文件,例如开机管理程序与核心文件等等
  • /dev: 放置装置文件,例如键盘、鼠标与各种装置
  • /etc: 放置系统主要的配置文件,例如用户密码文件、各种服务的启动文件等等
  • /home: 每个用户的家目录,也就是用户可以在这个目录下面放置自己的文件
  • /lib: 放置系统调用的函式库与核心所需要的函式库
  • /media: 放置可移除的装置,例如软盘、光盘等等
  • /mnt: 放置暂时挂载的目录,例如光盘、NFS等等
  • /opt: 放置第三方软件,例如 Oracle 软件就可以放置在这个目录下面
  • /sbin: 开机过程中所需要的,里面包括了开机、修复、还原系统所需要的指令,例如 fdisk, fsck 等等
  • /tmp: 这是让一般用户或者是正在执行的程序暂时放置档案的地方。
  • /usr:第二层 FHS 设定
  • /var: 第二层FHS设定,主要为放置变动性的资料
  1. /usr 目录

/usr里面放置的资料属于可分享的与不可变动的(shareable, static). usr是Unix Software Resource的缩写。 FHS建议所有软件开发者,应该将他们的数据合理的分别放置到这个目录下的次目录,而不要自行建立该软件自己独立的目录。

因为是所有系统默认的软件(distribution发布者提供的软件)都会放置到/usr底下,因此这个目录有点类似Windows 系统的'C: (当中的一部份) + C:files'这两个目录的综合体,系统刚安装完毕时,这个目录会占用最多的硬盘容量。 /usr的次目录建议有底下这些:

  • /usr/bin: 所有一般用户能够使用的指令都放在这里. 另外,FHS 要求在此目录下不应该有子目录
  1. whereis : 再一些特定的目录中查找文件文件名,因此速度比 find 快.

    1
    2
    3
    4
    5
    6
    7
    whereis [-bmsu] 文件和目录名
    选项参数:
    -l :可以列出 whereis 會去查詢的幾個主要目錄而已
    -b :只找 binary 格式的檔案
    -m :只找在說明檔 manual 路徑下的檔案
    -s :只找 source 來源檔案
    -u :搜尋不在上述三個項目當中的其他特殊檔案

  2. locate/updatedb

    1
    2
    3
    4
    5
    6
    7
    locate [-ir] keyword
    選項與參數:
    -i :忽略大小寫的差異;
    -c :不輸出檔名,僅計算找到的檔案數量
    -l :僅輸出幾行的意思,例如輸出五行則是 -l 5
    -S :輸出 locate 所使用的資料庫檔案的相關資訊,包括該資料庫紀錄的檔案/目錄數量等
    -r :後面可接正規表示法的顯示方式

locate 使用 /var/lib/mlocate/ 下建立的数据库进行查询,所以不用直接去硬盘中检索,速度极快。 使用 updatedb 对数据库进行手动更新

  1. find 利用文件更详细的属性进行检索,例如更改时间,文件的拥有者,特殊权限(SGID,SUID,SBIT.

  2. Linux 的 EXT2 文件系统(inode) ext2档案系统示意图

EXT2文件系统的组成:最前面是一个Boot Sector,然后是N多个Block Group。

每个Block Group主要由inodetable/datablock/superblock等部分组成:

①superblock记录Filesystem的信息和inode、block的大小和数量等,一般在第一个Block Group里,后面的Block Group大部分都没有,有的话也只是第一个Block Group的备份;

②filesystem description主要记录block group的起始与结束的block号码,以及group每个区段分别介于哪一个block号码之间;

③block bitmap记录每个block号码是否使用中;

④inode bitmap记录每个inode号码是否使用中;

⑤inode table则是记录每个 inode(文件) 的权限、属性、容量等以及它真正内容所在的block号码;

⑥data block则是纯粹的数据记录。

Block Group的基本单位是block,block size一般是1K、2K或4K。

每个文件只有一个inode,而每个inode可能指向多个数据相同的文件,每个inode大小一般128字节或256字节。

  1. 详细的ext2文件系统信息可以用 tune2fs -l /dev/sda1 或 dumpe2fs /dev/sda1 命令查看。

  2. ls -li 查询文件对应的 inode number

  3. 文件系统的 inconsistent: 当文件写入文件系统时,系统发生中断,对 metadata 的内容未更新。早期 ext2 系统再开机后进行比对,耗时长。

  4. ext3/ex4 相比 ext2 增加了日志功能。Journaling filesystem: 规划出一个区块记录修改文件的日志。记录准备写入的信息->实际写入->日志标记完成. 只需检查日志记录区块

  5. 异步处理(asynchronously),将文件加载进内存中。

  6. Linux 通过 VFS (virtual filesystem switch) 管理不同的文件系统

  7. XFS 文件系统的数据分布:

  • Data section: 包括inode/data block/superblock。 inode 和 block 都是系统需要时动态分配,因此xfs格式化快。
  • log section: 记录文件变化的日志,可用于修复文件,可指定外部磁盘作为 Log section
  • realtime section: 建立文件时,暂存文档,当分配完毕后再写入 data section
  1. xfs_info 查看 xfs 详细信息

  2. df: 列出文件系统整体磁盘使用量。 du:评估文件系统的磁盘使用量(常用在推估目录所占容量),搜寻所有文件,速度慢

  3. Hard Link: 硬链接不能跨越Filesystem,不能链接目录。建立硬链接会改变inode的链接数,通过硬链接建立的档案与原档案的inode号是一致的,不会占用新的inode和block。

  4. Symblolic Link: 软链接可以跨越 Filesystem,也能链接目录。它会建立新档案,以符号链接的形式指向原档案,会占用新的inode和block。文件内容为被连接的文件名。

  5. 目录的链接数 包括目录本身、当前目录.和父目录..,每建立一个文件夹就多一个父目录..;文件的链接数指的是 该文件inode号的链接数,即是硬链接个数。

  6. lsblk 列出系统上的所有磁盘列表. blkid 列出设备的 UUID 等参数.parted 列出磁盘的分割表类型与分割信息

  7. MBR 分割表使用 fdisk 分区 GPT 分割表使用 gdisk 分区

  8. mkfs 构建文件系统。

  9. xfs_repair 可以检查/修复文件系统,

  10. 挂载前需要确定:

  • 单一文件系统不应该被重复挂载在不同的挂载点(目录)中
  • 单一目录不应该重复挂载多个文件系统;
  • 要作为挂载点的目录为空。
  1. 找出设备的 UUID,再挂载到目录中。

  2. 重新挂载: mount -o remount 软连接: mount --bind 卸载设备:umount

  3. xfs_admin 修改 XFS 文件系统的人UUID 与 Label name. tune2fs 修改 ext4 的 label name 与 UUID

  4. 根目录必须先于其他挂载点被挂载

  5. 修改 /etc/fstab(filesystem table) 启动时自动挂载

  6. -o loop 选项使用循环设备(loop device)技术将文件作为块设备挂载。它可以将文件当作硬盘分区来访问

  7. 打包(Packaging)是将一个或多个文件或目录组合在一起,并打包为一个单独的文件或存档,成为 tarfile, 常见扩展名是 .tar 压缩(Compression)是指通过使用各种算法和技术,减小文件或数据的大小, 称为 tarball, tarball 的文件扩展名可能是.tar.gz.tgz.tar.bz2 等. 二者通常结合,先压缩,后打包。

  8. zcat 命令来查看 gzip 或者 compress 压缩的文件内容

  9. gzip -d 是用于解压缩 gzip 格式压缩文件的命令,原始的非压缩文件会被创建或覆盖到当前目录中

  10. gzip -c 命令压缩文件后,原始文件保持不变,只会生成压缩文件. 原理为将压缩文件输出到标准输出,再重定向到文件中。例如

    1
    2
    gzip -c file.txt > file.txt.gz   # 将 file.txt 压缩为 gzip 格式并保存为 file.txt.gz

  11. 压缩率 xz > bzip2 > gzip, 压缩速度 gzip > bzip2 > xz

  12. tar 的使用:

  • 压缩: tar -czv -f file.tar.gz file1 file2
  • 查询: tar -tzv -f file.tar.gz
  • 解压: tar -xzv -f file.tar.gz -C 指定解压目录
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    选项与参数:
    -c :创建打包文件,可搭配 -v 来察看过程中被打包的文件名(filename)
    -t :察看打包文件的内容含有哪些文件名,重点在察看“文件名”就是了;
    -x :解打包或解压缩的功能,可以搭配 -C (大写) 在特定目录解开
    特别留意的是, -c, -t, -x 不可同时出现在一串命令行中。
    -z :通过 gzip 的支持进行压缩/解压缩:此时文件名最好为 *.tar.gz
    -j :通过 bzip2 的支持进行压缩/解压缩:此时文件名最好为 *.tar.bz2
    -J :通过 xz 的支持进行压缩/解压缩:此时文件名最好为 *.tar.xz
    特别留意, -z, -j, -J 不可以同时出现在一串命令行中
    -v :在压缩/解压缩的过程中,将正在处理的文件名显示出来!
  1. 将要备份的数据创建为镜像文件,并将镜像文件烧录到光盘或 DVD 中,可以按照以下步骤进行操作:

  2. 创建镜像文件(ISO):使用 mkisofs 命令来创建一个 ISO 格式的镜像文件。mkisofs 是一个用于生成 ISO 9660 文件系统镜像的工具。例如,假设要创建一个名为 backup.iso 的镜像文件,可以运行以下命令:

1
mkisofs -o backup.iso /path/to/backup/files

这将将 /path/to/backup/files 目录下的文件和目录创建为一个 ISO 文件,并将其保存为 backup.iso。

烧录镜像文件到光盘或 DVD:使用 cdrecord 命令将镜像文件写入光盘或 DVD 中。cdrecord 是一个用于写入光盘的命令行工具。例如,假设光驱设备为 /dev/cdrom,可以运行以下命令:

1
cdrecord dev=/dev/cdrom backup.iso
  1. dd 可备份完整的 partition 或 disk ,因为 dd 可读取磁盘的 sector 表面数据 cpio 为相当优秀的备份指令,不过必须要搭配类似 find 指令来读入欲备份的文件名数据,方可进行 备份动作。

  2. cat -A 用特殊字符代表非打印字符

  3. DOS 使用的换行符是回车(CR)和换行(LF),而 UNIX 使用的换行符是换行(LF)。 使用 dos2unixunix2dos 命令可以在 UNIX 和 DOS 之间转换文本文件。

  4. iconv 进行文件编码转换

  5. '/etc/shells' 查看系统中可用的 shell.

  6. type 是一个用于显示给定命令的类型和位置的 shell 内建命令, 可以告诉你某个命令是内建命令、外部命令还是别名,并显示该命令在系统中的位置

  • 变量与变量内容以一个等号“=”来链接,如下所示:

    myname=VBird

  • 等号两边不能直接接空白字符,如下所示为错误:

    “myname = VBird”或“myname=VBird Tsai”

  • 变量名称只能是英文字母与数字,但是开头字符不能是数字,如下为错误: “2myname=VBird”

  • 变量内容若有空白字符可使用双引号“"”或单引号“'”将变量内容结合起来,但

    • 双引号内的特殊字符如 $ 等,可以保有原本的特性,如下所示:

      “var="lang is $LANG"”则“echo $var”可得“lang is zh_TW.UTF-8”

    • 单引号内的特殊字符则仅为一般字符 (纯文本),如下所示:

      “var='lang is $LANG'”则“echo $var”可得“lang is $LANG

  • 可用跳脱字符“  ”将特殊符号(如 [Enter], $, , 空白字符, '等)变成一般字符,如:

    “myname=VBird Tsai”

  • 在一串指令的执行中,还需要借由其他额外的指令所提供的信息时,可以使用反单引号“ 指令”或 “$(指令)”

    例如想要 取得核心版本的设置: “version=$(uname -r)”再“echo $version”可得“3.10.0-229.el7.x86_64”

  • 若该变量为扩增变量内容时,则可用 "$变量名称" 或 ${变量} 累加内容,如下所示:

    “PATH="$PATH":/home/bin”或“PATH=${PATH}:/home/bin”

  • 若该变量需要在其他子程序执行,则需要以 export 来使变量变成环境变量: “export PATH”

  • 取消变量的方法为使用 unset :“unset 变量名称”例如取消 myname 的设置:

    “unset myname”

  1. env 查看环境变量, set 查看所有变量

  2. 重要的变量:

  • PS1:(提示字符的设置)
  • $: 本shell 的 PID
  • ?: 关于上个执行命令的返回值
  • OSTYPE, HOSTTYPE, MACHTYPE:(主机硬件与核心的等级)
  1. 环境变量会被子进程继承, 通过 export 将自定变量转为环境变量。

  2. 变量的删除和替换: 20240109105406

  3. 命令别名设置: alias, unalias

  • login shell: 以登录方式进入系统的 shell, 读取 /etc/profile, ~/.bash_profile 或 ~/.bash_login 或 ~/.profile
login shell 的配置文件读取流程

实线的的方向是主线流程,虚线的方向则是被调用的配置文件。

修改 ~/.bashrc 后 通过 source ~/.bashrc 使配置文件生效

  • non-login shell: bash 配置文件仅会读取 ~/.bashrc
  1. stty -a 列出终端输入按键的意义
  • intr: 中断键,通常是 Ctrl+C
  • quit: 退出键,通常是 Ctrl+
  • erase: 擦除键,通常是 Backspace 键
  • kill: 杀死键,通常是 Ctrl+U
  • start: 在某个程序停止后,重新启动他的 output
  • stop: 停止目前屏幕的输出
  1. 通配符
  • * : 代表任意多个任意字符
  • ? : 代表“一定有一个”任意字符
  • [] : 同样代表“一定有一个在括号内”的字符(非任意字符)。例如 [abcd] 代表“一定有一个字 符, 可能是 a, b, c, d 这四个任何一个”
  • -: 若有减号在中括号内时,代表“在编码顺序内的所有字符”。例如 [0-9] 代表 0 到 9 之间的所 有数字,因为数字的语系编码是连续的!
  • [^] : 若中括号内的第一个字符为指数符号 (^) ,那表示“反向选择”,例如 [^abc] 代表 一定有 一个字符,只要是非 a, b, c 的其他字符就接受的意思。
  1. bash 下特殊符号: 20240109114257

  2. 指令执行过程的数据传输情况指令执行过程的数据传输情况

  • 标准输入  (stdin) :代码为 0 ,使用 < 或 <<
  • 标准输出  (stdout):代码为 1 ,使用 > 或 >>
  • 标准错误输出(stderr):代码为 2 ,使用 2> 或 2>>
  1. /dev/null 可以吃掉任何导向这个设备的信息

  2. 将正确与错误数据通通写入同一个文件

    1
    2
    3
    [dmtsai@study ~]$ find /home -name .bashrc > list 2> list <==错误 此时两股数据
    可能会交叉写入该文件内,
    [dmtsai@study ~]$ find /home -name .bashrc > list 2>&1 <==正确

  3. cmd ; cmd (不考虑指令相关性的连续指令下达)

  4. 20240109115916
  • 管线命令仅会处理 standard output,对于 standard error output 会予以忽略. 除非使用 2>&1 进行重定向
  • 管线命令必须要能够接受来自前一个指令的数据成为 standard input 继续处理才行
  1. 撷取命令: cut, grep. ,撷取讯息通常是以行为单位

  2. 排序命令: sort, wc, uniq

  3. tee 会同时将数据流分送到文件去与屏幕 tee 的工作流程示意图

  4. 字符转换命令: tr, col, join, paste, expand

  5. 参数代换: xargs. 很多指令其实并不支持管线命令,因此我们可以通过 xargs 来提供该指令引用 standard input 之用