第八章、Linux 磁盘与文件系统管理
1. 文件系统特性
2. 文件系统的运作方式
常常会听到所谓的『碎片整理』吧? 需要碎片整理的原因就是档案写入的 block 太过于离散了,此时档案读取的效能将会变的很差所致。 这个时候可以透过碎片整理将同一个档案所属的 blocks 汇整在一起,这样数据的读取会比较容易啊! 想当然尔,FAT 的文件系统需要三不五时的碎片整理一下,那么 Ext2 是否需要磁盘重整呢?
由于Ext2 是索引式文件系统,基本上不太需要常常进行碎片整理的。但是如果文件系统使用太久, 常常删除/编辑/新增档案时,那么还是可能会造成档案数据太过于离散的问题,此时或许会需要进行重整一下的. 不过,老实说,鸟哥倒是没有在 Linux 操作系统上面进行过 Ext2/Ext3 文件系统的碎片整理。
3. Linux 的 EXT2 文件系统(inode):
(1) data block (资料区块)
data block 是用来放置档案内容数据地方,在 xt2 文件系统中所支持的 block 大小有 1K, 2K 及 4K 三种而已。在格式化时 block 的大小就固定了,且每个 block 都有编号,以方便 inode 的记录啦。 不过要注意的是,由于 block 大小的差异,会寻致该文件系统能够支持的最大磁盘容量与最大单一档案容量并不相同。 因为 block 大小而产生的 Ext2 文件系统限制如下:(注2)
(2) inode table (inode表格)
基本上,inode 记录的档案数据至少有底下这些:(注4)
inode 的数量与大小也是在格式化时就已经固定了,除此之外 inode 还有些什么特色呢?
这样子 inode 能够指定多少个 block 呢?我们以较小的 1K block 来说明好了,可以指定的情况如下:
由于是直接指向,所以总共可记录 12 笔记录,因此总额大小为如上所示;
每笔 block 号码的记录会花去 4bytes,因此 1K 的大小能够记录 256 笔记录,因此一个间接可以记录的档案大小如上;
第一层 block 会指定 256 个第二层,每个第二层可以指定 256 个号码,因此总额大小如上;
第一层 block 会指定 256 个第二层,每个第二层可以指定 256 个第三层,每个第三层可以指定256 个号码,因此总额大小如上;
总额:将直接、间接、双间接、三间接加总,得到 12 + 256 + 256*256 + 256*256*256 (K) = 16GB
此时我们知道当文件系统将 block 格式化为 1K 大小时,能够容纳的最大档案为 16GB,比较一下文件系统限制表的结果可发现是一致的!但这个方法不能用在 2K 及 4K block 大小的计算中, 因为大于2K 的 block 将会受到 Ext2 文件系统本身的限制,所以计算的结果会不太符合之故。
(3) Superblock (超级区块)
Superblock 是记录整个 filesystem 相关信息的地方, 没有 Superblock ,就没有这个 filesystem 了。他记录的信息主要有:
Superblock 是非常重要的,因为我们这个文件系统的基本信息都写在这里,因此,如果 superblock死掉了, 你的文件系统可能就需要花费很多时间去挽救啦!一般来说,superblock 的大小为1024bytes。相关的 superblock 讯息我们等一下会以 dumpe2fs 指令来呼叫出来观察喔!
此外,每个 blockgroup 都可能含有 superblock 喔!但是我们也说一个文件系统应该仅有一个superblock 而已,那是怎么回事啊? 事实上除了第一个block group 内会含有 superblock 之外,后续的 block group 不一定含有 superblock , 而若含有 superblock 则该 superblock 主要是做为第一个 blockgroup 内 superblock 的备份,这样可以进行 superblock 的救援呢!
(4) Filesystem Description (文件系统描述说明)
这个区段可以描述每个 block group 的开始与结束的 block 号码,以及说明每个区段 (superblock, bitmap, inodemap, data block) 分别介于 哪一个 block 号码之间。这部份也能够用 dumpe2fs 来观察的。
(5) block bitmap (区块对照表)
如果你想要新增档案时总会用到 block 吧!那你要使用那个 block 来记录呢?当然是选择『空的block 』来记录新档案的数据啰。 那你怎么知道那个 block 是空的?这就得要透过 block bitmap 的辅助了。从 block bitmap 当中可以知道哪些 block 是空的,因此我们的系统就能够很快速的找到可使用的空间来处置档案啰。
同样的,如果你删除某些档案时,那么那些档案原本占用的 block 号码就得要释放出来, 此时在block bitmpap 当中相对应到该 block 号码的标志就得要修改成为『未使用中』啰!这就是 bitmap的功能。
(6) inode bitmap (inode 对照表)
这个其实与 block bitmap 是类似的功能,只是 block bitmap 记录的是使用与未使用的 block 号码, 至于 inode bitmap 则是记录使用与未使用的 inode 号码啰!
4. 与目录树的关系
由前一小节的介绍我们知道在 Linux 系统下,每个档案(不管是一般档案还是目录档案)都会占用一个inode , 且可依据档案内容的大小来分配多个 block 给该档案使用。而由第六章的权限说明中我们知道目录的内容在记录文件名, 一般档案才是实际记录数据内容的地方。那么目录与档案在 Ext2 文件系统当中是如何记录数据的呢? 基本上可以这样说:
(1) 目录
当我们在 Linux 下的 ext2 文件系统建立一个目录时, ext2 会分配一个 inode 于至少一块 block 给该目录。其中,inode 记录该目录的相关权限与属性,并可记录分配到的那块 block 号码; 而 block 则是记录在这个目录下的文件名与该文件名占用的 inode 号码数据。也就是说目录所占用的 block 内容在记录如下的信息:
(2) 档案:
当我们在 Linux 下的 ext2 建立一个一般档案时, ext2 会分配一个 inode 与相对于该档案大小的block 数量给该档案。例如:假设我的一个 block 为 4 Kbytes ,而我要建立一个 100 KBytes 的档案,那么 linux 将分配一个 inode 与 25 个 block 来储存该档案! 但同时请注意,由于 inode 仅有 12个直接指向,因此还要多一个 block 来作为区块号码的记录喔!
5. 目录树读取:
inode 本身并不记录文件名,文件名的记录是在目录的 block 当中。 因此在第六章档案与目录的权限说明中, 我们才会提到『新增/删除/更名文件名与目录的 w 权限有关』的特色!那么因为文件名是记录在目录的 block 当中, 因此当我们要读取某个档案时,就务必会经过目录的 inode 与 block ,然后才能够找到那个待读取档案的 inode 号码, 最终才会读到正确的档案的 block 内的数据。
由于 目录树是由根目录开始读起,因此系统透过挂载的信息可以找到挂载点的 inode 号码(通常一个filesystem 的最顶层 inode 号码会由 2 号开始喔!),此时就能够得到根目录的 inode 内容,并依据该inode 读取根目录的 block 内的文件名数据,再一层一层的往下读到正确的档名。
举例来说,如果我想要读取 /etc/passwd 这个档案时,系统是如何读取的呢?
如上表所示,该档案的读取流程为(假设读取者身份为 vbird 这个一般身份使用者):
(1). / 的 inode:
透过挂载点的信息找到 /dev/hdc2 的 inode 号码为 2 的根目录 inode,且 inode 规范的权限让我们可以读取该 block 的内容(有 r与 x) ;
(2). / 的 block:
经过上个步骤取得 block 的号码,并找到该内容有 etc/ 目录的 inode 号码 (1912545);
(3). etc/ 的 inode:
读取 1912545 号 inode 得知 vbird 具有 r 与 x 的权限,因此可以读取 etc/ 的 block 内容;
(4). etc/ 的 block:
经过上个步骤取得 block 号码,并找到该内容有 passwd 档案的 inode 号码 (1914888);
(5). passwd 的 inode:
读取 1914888 号 inode 得知 vbird 具有 r 的权限,因此可以读取 passwd 的 block 内容;
(6). passwd 的 block:
最后将该 block 内容的数据读出来。
6. filesystem 大小与磁盘读取效能:
另外,关于 文件系统的使用效率上,当你的一个文件系统规划的很大时,例如 100GB 这么大时, 由于硬盘上面的数据总是来来去去的,所以,整个文件系统上面的档案通常无法连续写在一起(block 号码不会连续的意思), 而是填入式的将数据填入没有被使用的 block 当中。如果档案写入的 block 真的分的很散, 此时就会有所谓的档案数据离散的问题发生了。
如前所述,虽然我们的 ext2 在 inode 处已经将该档案所记录的 block 号码都记上了, 所以资料可以一次性读取,但是如果档案真的太过离散,确实还是会发生读取效率低落的问题。 因为磁盘读取头还是得要在整个文件系统中来来去去的频繁读取! 果真如此,那么可以将整个 filesystme 内的数据全部复制出来,将该 filesystem 重新格式化, 再将数据给他复制回去即可解决这个问题。
此外,如果 filesystem 真的太大了,那么当一个档案分别记录在这个文件系统的最前面与最后面的 block 号码中, 此时会造成硬盘的机械手臂移动幅度过大,也会造成数据读取效能的低落。而且读取头再搜寻整个 filesystem 时, 也会花费比较多的时间去搜寻!因此, partition 的规划并不是越大越好, 而是真的要针对您的主机用途来进行规划才行!
7. EXT2/EXT3 档案的存取与日志式文件系统的功能
上一小节谈到的仅是读取而已,那么如果是新建一个档案或目录时,我们的 Ext2 是如何处理的呢? 这个时候就得要 block bitmap 及 inode bitmap 的帮忙了!假设我们想要新增一个档案,此时文件系统的行为是:
(1). 先确定用户对于 欲新增档案的目录是否具有 w 与 x 的权限,若有的话才能新增;
(2). 根据 inode bitmap 找到没有使用的 inode 号码,并将新档案的权限/属性写入;
(3). 根据 block bitmap 找到没有使用中的 block 号码,并将实际的数据写入 block 中,且更新inode 的 block 指向数据;
(4). 将刚刚写入的 inode 与 block 数据同步更新 inode bitmap 与 block bitmap,并更新superblock 的内容。
一般来说,我们将 inode table 与 data block 称为数据存放区域,至于 其他例如 superblock、 block bitmap 与 inode bitmap 等区段就被称为 metadata (中介资料) 。因为 superblock, inode bitmap 及 block bitmap 的数据是经常变动的,每次新增、移除、编辑时都可能会影响到这三个部分的数据,因此才被称为中介数据的啦。
8. 日志式文件系统 (Journaling filesystem)
为了避免上述提到的文件系统不一致的情况发生,因此我们的前辈们想到一个方式, 如果在我们的filesystem 当中规划出一个区块,该区块专门在记录写入或修订档案时的步骤, 那不就可以简化一致性检查的步骤了?也就是说:
(1). 预备:当系统要写入一个档案时,会先在日志记录区块中记录某个档案准备要写入的信息;
(2). 实际写入:开始写入档案的权限不数据;开始更新 metadata 的数据;
(3). 结束:完成数据与 metadata 的更新后,在日志记录区块当中完成该档案的记录。
在这样的程序当中,万一数据的记录过程当中发生了问题,那么我们的系统只要去检查日志记录区块, 就可以知道那个档案发生了问题,针对该问题来做一致性的检查即可,而不必针对整块 filesystem 去检查, 这样就可以达到快速修复 filesystem 的能力了!这就是日志式档案最基础的功能.
9. Linux 文件系统的运作:
我们现在知道了目录树与文件系统的关系了,但是我们也知道, 所有的数据都得要加载到内存后 CPU 才能够对该数据进行处理。想一想,如果你常常编辑一个好大的档案, 在编辑的过程中又频繁的要系统来写入到磁盘中,由于 磁盘写入的速度要比内存慢很多, 因此你会常常耗在等待硬盘的写入/读取上。
为了解决这个效率的问题,因此我们的 Linux 使用的方式是透过一个称为异步处理 (asynchronously)的方式。所谓的异步处理是这样的:
当系统加载一个档案到内存后,如果该档案没有被更动过,则在内存区段的档案数据会被设定为干净(clean)的。 但如果内存中的档案数据被更改过了(例如你用 nano 去编辑过这个档案),此时该内存中的数据会被设定为脏的 (Dirty)。此时所有的动作都还在内存中执行,并没有写入到磁盘中! 系统会不定时的将内存中设定为『Dirty』的数据写回磁盘,以保持磁盘与内存数据的一致性。 也可以利用 sync指令来手动强迫写入磁盘。
我们知道内存的速度要比硬盘快的多,因此如果能够将常用的档案放置到内存当中,这不就会增加系统性能吗? 没错!是有这样的想法!因此我们 Linux 系统上面文件系统与内存有非常大的关系喔:
10. 挂载点的意义 (mount point):
每个 filesystem 都有独立的 inode / block / superblock 等信息,这个文件系统要能够链接到目录树才能被我们使用。 将文件系统与目录树结合的动作我们称为『挂载』。 关于 挂载的一些特性我们在第三章稍微提过, 重点是:挂载点一定是目录,该目录为进入该文件系统的入口。 因此并不是你有任何文件系统都能使用,必项要『挂载』到目录树的某个目录后,才能够使用该文件系统的。
举例来说,如果你是依据鸟哥的方法安装你的 CentOS 5.x 的话, 那么应该会有三个挂载点才是,分别是 /, /boot, /home 三个 (鸟哥的系统上对应的装置文件名为 /dev/hdc2, /dev/hdc1, /dev/hdc3)。
那如果观察这三个目录的 inode 号码时,我们可以发现如下的情况:
看到了吧!由于 filesystem 最顶层的目录之 inode 一般为 2 号,因此可以发现 /, /boot, /home 为三个不同的 filesystem (因为每一行的文件属性并不相同,且三个目录的挂载点也均不相同之故。)
我们在第七章一开始的路径中曾经提到根目录下的 . 与 .. 是相同的东西, 因为权限是一模一样嘛!如果使用文件系统的观点来看,同一个 filesystem 的某个 inode 只会对应到一个档案内容而已(因为一个档案占用一个 inode 之故), 因此我们可以透过判断 inode 号码来确认不同文件名是否为相同的档案喔!
所以可以这样看:
上面的信息中由于挂载点均为 / ,因此三个档案 (/, /., /..) 均在同一个 filesystem 内,而这三个档案的 inode 号码均为 2 号,因此这三个档名都指向同一个 inode 号码,当然这三个档案的内容也就完全一模一样了! 也就是说,根目录的上层 (/..) 就是他自己!
11. 其他 Linux 支持的文件系统与 VFS
虽然 Linux 的标准文件系统是 ext2 ,且还有增加了日志功能的 ext3 ,事实上,Linux 还有支持很多文件系统格式的, 尤其是最近这几年推出了好几种速度很快的日志式文件系统,包括 SGI 的 XFS 文件系统, 可以适用更小型档案的 Reiserfs 文件系统,以及 Windows 的 FAT 文件系统等等, 都能够被 Linux 所支持喔!常见的支持文件系统有:
第9章 档案与文件系统的压缩与打包
第11章 认识与学习Bash
1. bash 的环境配置文件
你是否会觉得奇怪,怎么我们什么动作都没有进行,但是一进入 bash 就取得一堆有用的变量了? 这是因为系统有一些环境配置文件案的存在,让 bash 在启动时直接读取这些配置文件,以规划好 bash 的操作环境啦! 而这些配置文件又可以分为全体系统的配置文件以及用户个人偏好配置文件。要注意的是, 我们前几个小节谈到的命令删名啦、自定义的变数啦,在你注销 bash 后就会失效,所以你想要保留你的设定, 就得要将这些设定写入配置文件才行。
login shell:取得 bash 时需要完整的登入流程的,就称为 login shell。举例来说,你要由 tty1~ tty6 登入,需要输入用户的账号与密码,此时取得的 bash 就称为『 login shell 』啰;
non-login shell:取得 bash 接口的方法不需要重复登入的举动,举例来说,(1)你以 X window登入 Linux 后, 再以 X 的图形化接口启动终端机,此时那个终端接口并没有需要再次的输入账号不密码,那个 bash 的环境就称为 non-login shell了。(2)你在原本的 bash 环境下再次下达bash 这个指令,同样的也没有输入账号密码, 那第二个 bash (子程序) 也是 non-login shell 。
为什么要介绍 login, non-login shell 呢?这是因为这两个取得 bash 的情况中,读取的配置文件数据并不一样所致。 由于我们需要登入系统,所以先谈谈 login shell 会读取哪些配置文件?一般来说,login shell 其实只会读取这两个配置文件:
/etc/profile (login shell 才会读)
这个配置文件可以利用使用者的标识符 (UID) 来决定很多重要的变量数据, 这也是每个使用者登入取得 bash 时一定会读取的配置文件!这个档案设定的变量主要有:
/etc/profile 可不止会做这些事而已,他还会去呼叫外部的设定数据喔!在 CentOS 5.x 默认的情况下,底下这些数据会依序的被呼叫进来:
(1) /etc/inputrc
其实这个档案并没有被执行啦!/etc/profile 会主动的判断使用者有没有自定义输入的按键功能,如果没有的话, /etc/profile 就会决定设定『INPUTRC=/etc/inputrc』这个变量!此一档案内容为 bash 的热键、[tab]要不要有声音等等的数据!
(2)/etc/profile.d/*.sh
其实这是个目录内的众多档案!只要在 /etc/profile.d/ 这个目录内且扩展名为 .sh ,另外,使用者能够具有 r 的权限, 那么该档案就会被 /etc/profile 呼叫进来。在 CentOS 5.x 中,这个目录底下的档案规范了 bash 操作接口的颜色、 语系、ll 与 ls 指令的命令删名、vi 的命令删名、which 的命令删名等等。如果你需要帮所有使用者设定一些共享的命令删名时, 可以在这个目录底下自行建立扩展名为 .sh 的档案,并将所需要的数据写入即可喔!
(3)/etc/sysconfig/i18n
这个档案是由 /etc/profile.d/lang.sh 呼叫进来的!这也是我们决定 bash 预设使用何种语系的重要配置文件! 档案里最重要的就是 LANG 这个变量的设定!
~/.bash_profile (login shell 才会读)
bash 在读完了整体环境设定的 /etc/profile 并藉此呼叫其他配置文件后,接下来则是会读取使用者的个人配置文件。 在 login shell 的 bash 环境中,所读取的个人偏好配置文件其实主要有三个,依序分删是:
1. ~/.bash_profile
2. ~/.bash_login
3. ~/.profile
其实 bash 的 login shell 设定只会读取上面三个档案的其中一个, 而读取的顺序则是依照上面的顺序。也就是说,如果 ~/.bash_profile 存在,那么其他两个档案不论有无存在,都不会被读取。 如果 ~/.bash_profile 不存在才会去读取 ~/.bash_login,而前两者都不存在才会读取 ~/.profile 的意思。
会有这么多的档案,其实是因应其他 shell 转换过来的使用者的习惯而已。 先让我们来看一下 root 的/root/.bash_profile 的内容是怎样呢?
这个档案内有设定 PATH 这个变量喔!而且还使用了 export 将 PATH 变成环境变量呢! 由于 PATH 在 /etc/profile 当中已经设定过,所以在这里就以累加的方式增加用户家目录下的 ~/bin/ 为额外的执行文件放置目录。这也就是说,你可以将自己建立的执行档放置到你自己家目录下的 ~/bin/ 目录! 那就可以直接执行该执行档而与需要使用绝对/相对路径来执行该档案。
这个档案的内容比较有趣的地方在于 if ... then ... 那一段!该段的内容指的是『判断家目录下的 ~/.bashrc 存在否,若存在则读入 ~/.bashrc 的设定』。 bash 配置文件的读入方式比较有趣,主要是透过一个指令『 source 』来读取的! 也就是说 ~/.bash_profile 其实会再呼叫 ~/.bashrc 的设定内容喔!最后,我们来看看整个 login shell 的读取流程:
实线的的方向是主线流程,虚线的方向则是被呼叫的配置文件!从上面我们也可以清楚的知道,在 CentOS 的 login shell 环境下,最终被读取的配置文件是『 ~/.bashrc 』这个档案!所以,你当然可以将自己的偏好设定写入该档案即可。
~/.bashrc (non-login shell 会读)
谈完了 login shell 后,那么 non-login shell 这种非登入情况取得 bash 操作接口的环境配置文件又是什么? 当你取得 non-login shell 时,该 bash 配置文件仅会读取 ~/.bashrc 而已啦!那么预设的 ~/.bashrc 内容是如何?
特别注意一下,由于 root 的身份与一般使用者不同,鸟哥是以 root 的身份取得上述的数据, 如果是一般使用者的 ~/.bashrc 会有些许不同。看一下,你会发现在 root 的 ~/.bashrc 中其实已经规范了较为保险的命令别名了。 此外,咱们的 CentOS 5.x 还会主动的呼叫 /etc/bashrc 这个档案喔!为什么需要呼叫 /etc/bashrc 呢? 因为 /etc/bashrc 帮我们的 bash 定义出底下的数据:
依据与同的 UID 规范出 umask 的值;
依据与同的 UID 规范出提示字符 (就是 PS1 变量);
呼叫 /etc/profile.d/*.sh 的设定
你要注意的是,这个 /etc/bashrc 是 CentOS 特有的 (其实是 Red Hat 系统特有的),其他与同的 distributions 可能会放置在不同的档名就是了。由于这个 ~/.bashrc 会呼叫 /etc/bashrc 及/etc/profile.d/*.sh , 所以,万一你没有 ~/.bashrc (可能自己与小心将他删除了),那么你会发现你的bash 提示字符可能会变成这个样子:
-bash-3.2$
这是正常的,因为你并没有呼叫 /etc/bashrc 来规范 PS1 变量啦!而且这样的情况也与会影响你的 bash 使用。 如果你想要将命令提示字符捉回来,那么可以复制 /etc/skel/.bashrc 到你的家目录,再修订一下你所想要的内容, 并使用 source 去呼叫 ~/.bashrc ,那你的命令提示字符就会回来啦!
2. 其他相关配置文件
事实上还有一些配置文件可能会影响到你的 bash 操作的,底下就来谈一谈:
/etc/man.config
这个档案乍看之下好像跟 bash 没相关性,但是对于系统管理员来说, 却也是很重要的一个档案!这的档案的内容『规范了使用 man 的时候, man page 的路径到哪里去寻找!』所以说的简单一点,这个档案规定了下达 man 的时候,该去哪里查看数据的路径设定!
事实上,这个档案内最重要的其实是 MANPATH 这个变量设定啦! 我们搜寻 man page 时,会依据 MANPATH 的路径去分别搜寻!另外,要注意的是, 这个档案在各大与同版本 Linux distributions 中,档名都不太相同,例如 CentOS 用的是 /etc/man.config ,而 SuSE 用的则是 /etc/manpath.config , 可以利用 [tab] 按键来进行文件名的补齐啦!
~/.bash_history
还记得我们在历史命令提到过这个档案吧?预设的情况下, 我们的历史命令就记录在这里啊!而这个档案能够记录几笔数据,则与 HISTFILESIZE 这个变数有关啊。每次登入 bash 后,bash 会先读取这个档案,将所有的历史指令读入内存, 因此,当我们登入 bash 后就可以查知上次使用过哪些指令啰。
~/.bash_logout
这个档案则记录了『当我注销 bash 后,系统再帮我做完什么动作后才离开』的意思。 你可以去读取一下这个档案的内容,预设的情况下,注销时, bash 只是帮我们清掉屏幕的讯息而已。 不过,你也可以将一些备份或者是其他你认为重要的工作写在这个档案中 (例如清空暂存盘), 那么当你离开 Linux 的时候,就可以解决一些烦人的事情!
3. 终端机的环境设定: stty, set
我们在第五章首次登入 Linux 时就提过,可以在 tty1 ~ tty6 这六个文字接口的终端机 (terminal) 环境中登入,登入的时候我们可以取得一些字符设定的功能喔! 举例来说,我们可以利用退格键(backspace,就是那个←符号的按键) 来删除命令行上的字符, 也可以使用 [ctrl]+c 来强制终止一个指令的运行,当输入错误时,就会有声音跑出来警告。这是怎么办到的呢? 很简单啊!因为登入终端机的时候,会自动的取得一些终端机的输入环境的设定啊!
事实上,目前我们使用的 Linux distributions 都帮我们作了最棒的使用者环境了, 所以大家可以不用担心操作环境的问题。不过,在某些 Unix like 的机器中,还是可能需要动用一些手脚, 才能够让我们的输入比较快乐~举例来说,利用 [backspace] 删除,要比利用 [Del] 按键来的顺手吧! 但是某些 Unix 偏偏是以 [del] 来进行字符的删除啊!
那么如何查阅目前的一些按键内容呢?可以利用 stty (setting tty 终端机的意思) 呢! stty 也可以帮助设定终端机的输入按键代表意义喔!
4. 通配符与特殊符号
在 bash 的操作环境中还有一个非常有用的功能,那就是通配符 (wildcard) ! 我们利用 bash 处理数据就更方便了!底下我们列出一些常用的通配符:
5. /dev/null 垃圾桶黑洞装置与特殊写法
想象一下,如果我知道错误讯息会发生,所以要将错误讯息忽略掉而与显示或储存呢? 这个时候黑洞装置 /dev/null 就很重要了!这个 /dev/null 可以吃掉任何导向这个装置的信息喔!将上述的范例修订一下:
再想象一下,如果我要将正确与错误数据通通写入同一个档案去呢?这个时候就得要使用特殊的写法了! 我们同样用底下的案例来说明:
上述表格第一行错误的原因是,由于两股数据同时写入一个档案,又没有使用特殊的语法, 此时两股数据可能会交叉写入该档案内,造成次序的错乱。所以虽然最终 list 档案还是会产生,但是里面的数据排列就会怪怪的,而不是原本屏幕上的输出排序。 至于写入同一个档案的特殊语法如上表所示,你可以使用 2>&1 也可以使用 &> ! 一般来说,鸟哥比较习惯使用 2>&1 的语法啦!
6. 命令执行的判断依据: ; , &&, ||
在某些情况下,很多指令我想要一次输入去执行,而与想要分次执行时,该如何是好?基本上你有两个选择, 一个是透过第十三章要介绍的 shell script 撰写脚本去执行,一种则是透过底下的介绍来一次输入多重指令喔!
$? (指令回传值) 与 && 或 ||
如同上面谈到的,两个指令之间有相依性,而这个相依性主要判断的地方就在于前一个指令执行的结果是否正确。
注意喔,两个 & 之间是没有空格的!那个 | 则是 [Shift]+[\] 的按键结果。
7. 撷取命令: cut, grep
cut 主要的用途在于将『同一行里面的数据进行分解!』最常使用在分析一些数据或文字数据的时候!这是因为有时候我们会以某些字符当作分割的参数,然后来将数据加以切割,以取得我们所需要的数据。 鸟哥也很常使用这个功能呢!尤其是在分析 log 档案的时候!与过,cut 在处理多空格相连的数据时,可能会比较吃力一点。
8. 排序命令: sort, wc, uniq
9. 字符转换命令: tr, col, join, paste, expand
10. 关于减号 - 的用途
管线命令在 bash 的连续的处理程序中是相当重要的!另外,在 log file 的分析当中也是相当重要的一环, 所以请特别留意!另外,在管线命令当中,常常会使用到前一个指令的 stdout 作为这次的stdin , 某些指令需要用到文件名 (例如 tar) 来进行处理时,该 stdin 与 stdout 可以利用减号 "-" 来替代, 举例来说:
第十二章、正规表示法与文件格式化处理