第3章 探索Linux系统

我们现在已经知道了如何在文件系统中导航,是时候继续Linux系统之旅了,我们要再学习几个今后能派上用场的命令。

  • ls:列出目录内容。
  • file:确定文件类型。
  • less:查看文件内容。

3.1 使用ls命令之乐

有充分的理由相信,ls命令可能是用得最多的命令。有了它,就能够查看目录内容、确定各种重要文件和目录属性。我们已经看到,只需输入ls命令,就可以得到当前工作目录包含的文件和子目录:

[me@linuxbox ~]$ ls
Desktop Documents Music Pictures Public Templates Videos

除了当前工作目录,我们还可以指定要显示内容的目录:

me@linuxbox ~]$ ls /usr
bin games include lib local sbin share src

我们甚至可以指定多个目录。在下面的例子中,我们同时列出了用户主目录(由字符~代表)和/usr目录的内容:

[me@linuxbox ~]$ ls ~ /usr
/home/me:
Desktop Documents Music Pictures Public Templates Videos
/usr:
bin games include lib local sbin share src

我们还可以修改输出结果的格式,显示更多细节:

[me@linuxbox ~]$ ls -l
total 56
drwxrwxr-x 2 me me 4096 2017-10-26 17:20 Desktop
drwxrwxr-x 2 me me 4096 2017-10-26 17:20 Documents
drwxrwxr-x 2 me me 4096 2017-10-26 17:20 Music
drwxrwxr-x 2 me me 4096 2017-10-26 17:20 Pictures
drwxrwxr-x 2 me me 4096 2017-10-26 17:20 Public
drwxrwxr-x 2 me me 4096 2017-10-26 17:20 Templates
drwxrwxr-x 2 me me 4096 2017-10-26 17:20 Videos

通过给ls命令添加-l选项,我们将输出结果的格式改成了长格式。

3.1.1 选项与参数

上面的例子向我们演示了大多数命令是如何工作的,这一点非常重要。命令之后通常会跟随一个或多个能够修改命令行为的选项,接着是一个或多个参数,用于表明命令操作的对象。因此,大多数命令看起来类似于下面这样:

command -options arguments

大部分命令使用的选项是在单个字符前加上连字符,例如-l。但是,很多命令(包括GNU项目里的命令)也支持长选项,这种选项是在单词前加两个连字符。而且,不少命令还允许将多个短选项串在一起使用。在下面的例子中,ls命令包含了两个选项——l选项用于产生长格式的输出结果,t选项用于依照文件修改时间对输出结果排序:

[me@linuxbox ~]$ ls -lt

我们还可以加上长选项--reverse,以降序排列输出结果:

[me@linuxbox ~]$ ls -lt --reverse

注意

在Linux中,命令选项和文件名一样,区分大小写。

ls命令包含大量选项,表3-1列出了常用的ls命令选项。

表3-1 常用的ls命令选项

55143-00-033-1

3.1.2 进一步了解长格式

我们之前已经看到,-l选项使ls命令以长格式显示输出结果,这种输出结果包含了大量的有用信息。下面是Ubuntu系统中的Example目录的输出结果:

-rw-r--r-- 1 root root 3576296 2017-04-03 11:05 Experience ubuntu.ogg
-rw-r--r-- 1 root root 1186219 2017-04-03 11:05 kubuntu-leaflet.png
-rw-r--r-- 1 root root   47584 2017-04-03 11:05 logo-Edubuntu.png
-rw-r--r-- 1 root root   44355 2017-04-03 11:05 logo-Kubuntu.png
-rw-r--r-- 1 root root   34391 2017-04-03 11:05 logo-Ubuntu.png
-rw-r--r-- 1 root root   32059 2017-04-03 11:05 oo-cd-cover.odf
-rw-r--r-- 1 root root  159744 2017-04-03 11:05 oo-derivatives.doc
-rw-r--r-- 1 root root   27837 2017-04-03 11:05 oo-maxwell.odt
-rw-r--r-- 1 root root   98816 2017-04-03 11:05 oo-trig.xls
-rw-r--r-- 1 root root  453764 2017-04-03 11:05 oo-welcome.odt
-rw-r--r-- 1 root root  358374 2017-04-03 11:05 ubuntu Sax.ogg

表3-2列出了其中一个文件的不同字段及其含义。

表3-2 其中一个文件的不同字段及其含义

55143-00-034-1

3.2 使用file命令确定文件类型

在探索系统的过程中,知道文件包含什么内容是非常有用的。我们可以使用file命令来确定文件类型。前文提到,Linux系统并不要求文件名必须反映文件的内容。当我们看到picture.jpg时,通常会觉得该文件是一张JPEG压缩图像,但是在Linux中未必如此。我们可以像下面这样调用file命令:

file filename

file命令会输出文件内容的简要描述。例如:

[me@linuxbox ~]$ file picture.jpg
picture.jpg: JPEG image data, JFIF standard 1.01

文件类型有很多。事实上,在类UNIX系统中(如Linux),存在一个普遍观念:万物皆文件(everything is a file)。随着本书内容的深入,我们会发现这句话是多么正确。

尽管对于系统中的不少文件我们并不陌生,例如MP3文件和JPEG文件,但还有很多其他类型的文件并不是那么一目了然,有少数甚至颇为陌生。

3.3 使用less命令查看文本文件

使用less命令可以查看文本文件。纵观Linux系统,有大量文件包含的是人类可读的文本。less命令提供了一种查看这类文件的便捷方法。

我们为什么要查看文本文件?因为很多包含系统设置的文件(称为“配置文件”)采用的都是文本格式,能够阅读这种文件可以让我们了解系统是如何工作的。除此之外,系统使用的某些程序(称为“脚本”)也是文本格式的。在后文中,我们会学习如何编辑文本文件,从而修改系统设置,并编写自己的脚本,不过目前我们只关心如何查看文本文件的内容。

less命令用法如下:

less filename

什么是“文本”

计算机描述信息的方式有很多种。所有方式都涉及在信息与描述信息的数字之间确定某种关系。毕竟,计算机只能理解数字,所有的数据都要转换为数字来表示。

有些表示方法非常复杂(例如,压缩后的视频文件),而有些表示方法则相当简单。其中,ASCII文本出现得最早,也最简单。ASCII(发音是“as-key”)是美国信息交换标准码(American Standard Code for Information Interchange)的缩写。这种简单的编码方案最早用于电传打字机,以完成键盘字符与数字之间的映射。

文本是字符与数字之间简单的一对一映射,它非常紧凑。50个文本字符可以转换为50字节的数字。要明白,文本只是字符与数字之间的简单映射,这一点非常重要。它不同于Microsoft Word或OpenOffice.org Write所创建的字处理程序文档。与简单的ASCII文本文件相比,这些文件包含了很多用于描述文档结构和格式的非文本元素。而普通的ASCII文本文件仅包含字符本身和少数基本的控制代码,例如,制表符、回车符及换行符。

纵观Linux系统,很多文件都是以文本格式存储的,其中也有很多处理文本文件的工具。甚至连Windows系统也认识到了这种格式的重要性。众所周知的记事本程序(notepad.exe)就是一款用于处理纯ASCII文本文件的编辑器。

less命令允许我们前后翻看文本文件。例如,要想查看定义了系统中所有用户的文件,可以输入下列命令:

[me@linuxbox ~]$ less /etc/passwd

运行less命令之后,就能够查看文件内容了。如果文件内容多于一页,则可以前后翻看。按Q键可退出less命令。

表3-3列出了less命令常用的命令。

表3-3 less命令

55143-00-036-1

少即是多

less程序旨在改进并替换早期UNIX中的more程序。less这个名字表明了“少即是多”(less is more)——这是现代主义建筑师和设计师的座右铭[1]

less程序属于分页程序(pager),这类程序允许用户逐页地轻松浏览长文档。而more程序只允许向前翻页,less程序可以前后翻页,另外还具有很多其他特性。

3.4 按图索骥

在Linux系统中,文件系统的布局与其他类UNIX系统大同小异。其设计实际上在Linux文件系统层次结构标准(Linux filesystem hierarchy standard)中已经指定了。并非所有Linux发行版都严格遵循该标准,不过大部分与之非常接近。

牢记复制与粘贴的技巧

如果你使用鼠标,双击可以复制文件名,单击中键可以将其粘贴到命令中。

接着,我们就来“逛一逛”文件系统,看一看Linux系统得以正常执行的基础。这给了我们一次练习导航技巧的机会。在此过程中,我们会发现很多值得注意的文件都是易读的纯文本文件。请依次尝试下列操作。

  • 使用cd命令进入指定目录。
  • 使用ls –l命令列出该目录的内容。
  • 如果你发现感兴趣的文件,使用file命令确定该文件的内容类型。
  • 如果它看上去像是文本文件,尝试使用less命令浏览文件内容。
  • 如果不小心查看了非文本文件,终端窗口中会充斥着混乱的字符,可以输入reset命令来恢复正常。

在浏览文件系统的时候,放心大胆地查看文件,不用怕。普通用户就算想弄出点儿乱子,也基本上没有可能。超级用户的工作就是阻止这种事情发生!如果一个命令无法正常工作,就试一试另一个命令。多花时间四处浏览一下。整个系统任由我们探索。记住,在Linux系统中,没有什么秘密可言!

表3-4留出了一些我们可以一探究竟的目录。在不同的Linux发行版中,这些目录可能会略有不同。

表3-4 Linux系统中的目录

55143-00-037-1

3.5 符号链接

在浏览文件系统的过程中,我们在目录(例如/lib)内容列表中可能会看到类似于下面的条目:

lrwxrwxrwx 1 root root   11 2018-08-11 07:34 libc.so.6 -> libc-2.6.so

有没有注意到该条目的第一个字母是l,而且看起来像是有两个文件名?这种特殊的文件叫作符号链接(也称为软链接)。在大多数类UNIX系统中,一个文件可以被多个名称引用。虽然这种做法的意义可能并不明显,但它的确是一种实用的特性。

想象这样一个场景:某个程序需要使用包含在文件foo中的共享资源,但该文件的版本变化频繁。最好能在文件名中加入版本号,这样超级用户或其他相关用户就知道安装的是文件foo的哪个版本。但有一个问题,如果我们改变了共享资源的名称,就必须跟踪所有用到该共享资源的程序,并对其做出改动,以便能够找到新的共享资源。

这就是该符号链接发挥作用的时候了。假设我们安装了2.6版本的文件foo,其文件名为foo-2.6,然后创建一个指向foo-2.6的符号链接foo。这意味着当程序打开文件foo的时候,实际上打开的是文件foo-2.6。这样就皆大欢喜了。依赖文件foo的程序能够找到它,我们也能看到实际安装的版本。当要升级到文件foo-2.7时,只需将该文件加入系统,删除符号链接foo,再创建一个指向新版本的符号链接即可。这不仅解决了版本升级的问题,还可以将两种版本都保存在计算机里。如果文件foo-2.7存在Bug,则需要还原到旧版。还是老样子,删除指向新版本的符号链接,创建指向旧版本的符号链接。

本节开始列出的目录(来自Fedora系统的/lib目录)中显示了一个指向共享库文件libc-2.6.so的符号链接libc.so.6。也就是说,查找文件libc.so.6的程序实际上访问的是文件libc-2.6.so。第4章我们将学习如何创建符号链接。

3.6 硬链接

既然谈到了链接这个话题,我们需要提一下,还有另一种叫作硬链接的链接类型。它同样允许文件拥有多个名称,但是实现方式不同。第4章我们将进一步讨论符号链接与硬链接之间的区别。

3.7 总结

至此,我们对Linux已经有了不少的了解。我们看到了各种文件和目录及其内容,应该能够从中意识到Linux的开放程度。在Linux中,很多重要的文件都是可读的纯文本格式。与很多专有系统不同,我们可以毫无阻碍地检查和学习Linux的一切。


[1]原话是由著名的现代主义建筑大师路德维希·密斯·凡德罗(Ludwig Mies van der Rohe)于1928年提出的。——译者注