第 13 章 基础知识

目录

Shell

命令

Linux 程序、进程

路径

软件

配置方式

隐藏文件

文件类型

权限

执行命令的权限

用户

执行命令的身份

群组

Shell

可能您早已能够熟练的使用 GUI(图形用户界面),例如您可以使用鼠标双击一个图标,来打开或者执行它。

我们来看这个过程: 您使用鼠标定位桌面上的一个程序图标,按下左键两次。系统读取鼠标指针的位置,并且判断该位置下图标的涵义,根据预设的双击动作,运行程序或者打开文件。

这一套 GUI 系统,便是一种 Shell,它的作用是实现人机交互。如果我们不能够控制电脑,那么电脑还不如电视机好玩,不是么?电视机也可以选择频道(电视机的遥控器,也是一种人机交互的界面,不过相对于电脑,确实是相当简单了)

易于上手、界面直观是 GUI 的优点,但是 GUI 并不意味着简单!或许您有类似经历: 桌面上有几十个程序的启动图标,也知道它们的名字,但是翻出一个来,并不是一件轻松的事情。

我的 Windows 系统中,桌面上摆满了各种图标,每当启动一个程序的时候,我都很是困扰。后来尝试了 音速启动 这类程序启动管理器,效果却不遂人意。[18]

在 Linux 下,所有的程序都可以通过命令运行。虽然 Linux 也有 GUI,但是它并不比 Windows 的 GUI 更优秀!上面只是简单的介绍了 CLI(命令行界面)相对 GUI 的优越之处,使用 CLI 还有更多的好处,您会慢慢体会到的。

当然了,在您的印象中,CLI 一定非常的不友善,缺少亲和力,冷漠而拒人于千里之外……您和 CLI 之间甚至有代沟的存在


[18] 在我的不懈努力下,这个难道最终得到了解决: 将快捷方式名称简化,放到特定目录下,使用 Win+R 组合键呼出 运行 对话框,键入快捷方式的名称来运行该程序。比如 反恐精英 的快捷方式为 cs ,我把它放在 Windows 目录下; 运行 cs 命令,就可以去维护世界和平了。

这么多快捷方式,统统放到 Windows 目录下,非常混乱。因此,我在 D盘 建立了一个名为 path 的目录,并把它的路径加入到环境变量的 path 项中,快捷方式放在 D:\path 目录中。即便重装系统,只要在环境变量中重新加入此路径,原来的程序大多可以直接以命令来运行……我的许多朋友强烈要求我帮他们设定这种启动方式,因为这确实很方便:)

命令

坦白的说,冷不丁见到那么老长的一串命令,谁都会毛骨悚然。

也许您使用过 DOS,留下这种印象:命令先放一边,光是正确的输入目录、文件名都够瞧的。而且 DOS 不区分大小写,要是像 Linux 一样区分大小写,那多恐怖啊!!!

其实 Linux 命令行具有补全功能,非常实用。假设有这样一个命令:

command path/file

如果只有一个以 c 起始的命令,键入 c ,再按一次 tab 键,系统将自动补全该命令余下的部分。 只要 c tab 两次按键,就可以完成 command 的输入。

现在我们来了解命令的语法结构,这一部分相当重要,您可得看仔细。

我们知道,任何语言都有特定的语法结构,以我们的中文为例:

我们郑重地推荐您Linux!

这个句子的语法尽管简单,却是大部分的命令行采用的句型。让我们看一下,这个句子里都有些什么:

1 主语,Linux 命令的执行者当然是用户,所以主语一概省略。

3 一个动词,作为谓语而存在。Linux 命令中,这一部分是必须的。这一部分也是不同命令之间最根本的区别方式,所以它通常作为命令名,写在最前面。键入 date 命令,您可以查看当前的时间日期。

2 状语,用来修饰谓语。与之相对应,Linux 命令可以使用选项来精细调节程序的行为。为了与命令的操作对象相区别,选项前通常要加 - 或者 -- 符号。原则上,在命令名之后,选项的位置可以随意,但是为了养成一个良好的习惯,我们建议您在命令名后直接跟选项。

4 这两个部分都是宾语,它们是命令的操作对象。大部分的命令只有一个操作对象,也有一些命令是双宾语结构的,具有一个直接宾语和一个间接宾语。比如 拷贝 这个命令 cp (copy)[19]

分隔符. 我们的汉语是象形文字,没有分隔符。但是所有的拼音文字中都用空格作为分隔符,来分隔单词。Linux 命令中同样使用空格作分隔符。

上面的那句话,翻译成 Linux 的命令,应该是这个样子的:

推荐  --郑重的 您 Linux

1 (按照传统,“-”后跟选项缩写,“--”后跟选项全称。不过也有例外)

哈,Linux 的命令也蛮简单吧?


[19] cp a b 表示把文件 a 拷贝为文件 b

cp a /home表示把当前目录下的 a 文件,拷贝到 /home 目录下。(命令的不同部分使用空格分隔,连续的空格视为一个空格)

Linux 程序、进程

或许您会这样想,Linux 命令的句型确实不难,但是那么多命令,我怎么知道它们都是作什么的呢?而且不同的系统中,可以使用的命令似乎也不太一样,这真让人困惑……

其实 Linux 的命令,运行的是 Linux 系统中的程序。只要您已安装了程序,您就可以通过命令来运行它,并且可以使用选项来精细的调整它的运行状态。也可以通过点击启动图标来运行,不过启动图标不能够方便的调整选项,并不是很方便。

举一个例子:

mplayer -shuffle -loop 3 -playlist mymp3.list

可能您运行上面命令,系统会提示您 无法找到命令 ,那是因为您没有安装 mplayer 这个程序。mplayer 是我见过的支持格式最多的播放器,几乎任何已知格式的多媒体文件,都可以使用 mplayer 来播放。它包含一个图形界面的前端,您可以在菜单中找到它,鼠标点击运行;也可以通过执行命令来运行它的命令行版本。

如果您的系统中没有 mplayer 播放器,我们建议您安装一个。关于程序的安装,参阅第 16 章 软件管理

上面命令中, mplayer 调用了 mplayer 播放器程序。选项 -shuffle 表示随机播放, -loop 表示循环播放,后面的 3 为循环的次数,如果为 0 ,则一直播放。 -playlist 表示播放列表中的曲目。我们可以把 mp3 的路径放到 mymp3.list 文件中,让 mplayer 来播放它们。

进程. 为运行中的程序,是程序在内存中的镜像。

好了,现在您已经了解了 Shell 、 命令 、 程序 、 进程 的概念,您基本上也就了解了 Linux(Linux 系统真是非常简洁,而且容易理解)。

但只知道这些,您并不能顺畅使用。接下来的章节中,我们来进一步介绍它的细节。

路径

路径分为绝对路径和相对路径。

绝对路径的起始点为根目录 / ,例如 /usr/local/bin 就是绝对路径,它指向系统中一个绝对的位置,不受其它因素影响。

相对路径的起始点为当前目录,如果您现在位于 /usr 目录,那么相对路径 local/bin 所指示的位置为 /usr/local/bin

也就是说,相对路径所指示的位置,除了相对路径本身,还受到当前位置的影响。例如 Linux 系统中常见的目录 /bin 、 /usr/bin 、 /usr/local/bin ,如果只有一个相对路径 bin,那么它指示的位置可能上面三个目录中的任意一个,也可能是其它目录。

如果我告诉您到 bin 目录寻找一个文件,您可能搞不清楚是哪一个 bin 目录。只有当前位置确定,相对路径指示的位置才能够确定。

现在我说, /usr/local 目录下,它的相对路径 bin 中有某个文件,这样就比较明确了。

在相对路径中 . 表示当前目录, .. 表示当前目录的上一级目录。

假设您安装了一个程序,它的主程序没有被放置到上面三个 bin 目录中的任何一个,或者其它系统能够找到的地方,您就得告诉系统,它的可执行文件在哪里。

可以使用绝对路径,例如: /home/user/bin/可执行文件

或者定位到 /home/user/bin 目录,使用相对目录来定位它 ./可执行文件

路径相关命令

cd (change directory)        #更改目录。
pwd (print working directory)#显示当前路径。
ls (list)                    #显示当前目录中的文件列表。

请尝试以下操作:

cd /etc             #进入“/etc”目录,这里使用的是绝对路径
pwd                 #显示当前路径,这个命令返回结果“/etc”
cd init.d           #进入“/etc”目录的子目录“init.d”,这里使用的是相对路径
cd ..               #进入上一级目录“/etc”
cd ../home          #“/etc”目录的上一级目录为“/”,它的子目录“home”为“/home”
cd -                #回到上一次的目录,我们在“/etc”目录跳转到“/home”目录,所以这次是回到“/etc”目录
cd ~                #“~”代表当前用户的“$HOME”目录,也就是“/home/{用户名}”目录。
ls                  #在任何时候,您都可以使用“ls”命令,来了解当前目录下都有哪些文件。

远程路径:

远程路径的表示方法为 协议://用户名:密码@位置/路径:端口

大多数的远程路径可以使用默认端口匿名访问,由此用户名、密码、端口通常不需要填写。例如:

http://linuxtoy.org

要求身份验证的远程路径,您可以使用下面的方式访问:

ftp://user:passwd@ftp.linuxtoy.org:21

软件

Linux 中没有 注册表 这个概念。安装软件,理论上讲,只要拷贝所有相关文件,并运行它的主程序就可以了。

按照传统,一个软件通常分别拷贝到同级目录下的 bin、etc、lib、share等文件夹。

bin

可执行文件,程序的可执行文件通常在这个目录下。在环境变量中设定搜索路径,就可以直接执行,而不需要定位其路径。

etc

配置文件,大部分系统程序的配置文件保存于 /etc 目录,便于集中修改。

lib

库文件,集中在一起,方便共享给不同程序。相较不同的软件单独保存库文件,能够节约一些磁盘空间。

share

程序运行所需要的其它资源,例如图标、文本。这部分文件是专有的,不需要共享;而且目录结构相对复杂,混放在一起比较混乱,所以单独存放。

还有一些软件,占用一个单独的目录,所有的资源都在这个目录中。类似于 Windows 下的绿色软件,不推荐在 Linux 系统下这样作。

  • 执行时,系统找不到可执行文件(搜索所有路径,资源开销过大,是不现实的),需要定位其位置,像这样 /home/user/bin/可执行文件 ,不够方便。
  • 许多系统软件需要协作运行,配置文件分别保存,定位它们非常麻烦
  • 如果程序使用的库文件,像图形库文件,都单独存放,那么磁盘空间的浪费会非常严重。

有一些大型软件,或者您布署的重要应用,您可以将它们单独安装在一个文件夹下。(通常源码安装支持这种方式)

配置方式

Linux 下没有类似 注册表 的系统,系统和软件都可以通过纯文本的配置文件进行设置。

事实上,图形界面的配置工具,通常就是以图形界面的方式修改配置文件,适合设置一些比较简单的程序。如果软件有几千个可以配置的选项,全部作成菜单,想象一下……开始发抖吧……

图形界面的配置工具,可以看作特定配置文件专用编辑器。您一样可以使用通用文本编辑器来编辑配置文件,比如 Nano、Gedit、Knote、Vim 或者 Emacs 等等。不考虑阅读、修改配置文本占用的时间,直接修改配置文件甚至更迅速。[20]

如果只是要修改某一常用选项,而且时常修改,比如主机的 IP地址。使用文本编辑器,您要找到相应的配置文件,还要在配置文件中找到相应的选项,会浪费掉您的时间和耐性。

图形配置工具经常会受各种因素制约,比如网络服务器中不提供图形服务,图形界面不够稳定……这时,您可以使用命令行的配置工具来完成这些工作。

例如: 修改主机 IP地址,可以使用 ifconfig 这个程序,执行下面的命令:

ifconfig eth0 192.168.0.1

[20] 在以后的章节中,如果我们提示您修改某一文件,例如 /etc/fstab ,您可以使用任何顺手的文本编辑器打开它。

隐藏文件

Linux 下,名称中第一个字符为 . 的文件或者文件夹,系统会将它们隐藏起来。传统上,这种文件大多是用户的配置文件。

您可以尝试以下操作:

cd ~     #进入您的用户目录
ls       #查看当前目录下的文件列表
ls -a    #查看所有文件的文件列表(包括隐藏文件)。
  • 如果您只想查看隐藏文件,而不包括这两个特殊目录,您可以使用 ls 命令的选项 -A (ls -A)
  • 每个目录下都包含两个特殊目录 ... 。您也许猜到了, . 代表当前目录, .. 代表上一级目录。

现在,您可以看到许多文件名以 . 起始的文件或者文件夹了吧?使用 ls 命令无法显示它们

文件类型

Linux 系统主要根据文件头信息来判断文件类型,扩展名并非决定因素。

现在使用 ls -l 命令,查看详细信息格式的文件列表,您将会看到如下内容:

total 5
drwxr-x---  4 user  group   4096 Mar 10 00:37 filename
drwxr-xr-x 21 user  group   4096 Mar 10 20:16 文件名
-rw-------  1 user  group    524 Mar 10 00:40 a
-rw-r--r--  1 user  group     24 Jun 11  2000 b
drwx------  2 user  group   4096 Mar  9 11:06 c

共显示了七列信息,从左至右依次为:权限、文件数、归属用户、归属群组、文件大小、创建日期、文件名称

drwxr-xr-x

1 其中要特别留意的是第一列:

- 普通文件
d 文件夹
l 符号链接
b 块设备文件
c 字符设备文件
s 套接文件
p 管道文件

2 剩下的9个字符分为3组:分别是归属用户、归属群组、其它用户对于该文件的权限。我们看它的格式

r 可读
w 可写
x 可执行
  • 它们的顺序不能颠倒,某一位置为空(-),则表示不具有相应的权限。
  • Linux 下的可执行文件并不是由扩展名(例如 .exe )决定的,而是由其可执行权限位决定。
  • 目录是一种特殊类型的文件。拥有目录的执行权限才可以进入这个目录!

权限

我们已经知道了,文件的权限分为 r (可读)、 w (可写)、 x (可执行)三种类型,而一个文件可以针对归属用户,归属群组,其它用户或群组分别设定权限。

这种权限管理的方式灵活、简单、严密、明晰。尽管如此,在最初的阶段,可能会有一点小小的不适。因为它无所不在,而您习惯了的 Windows 的权限管理却不是这样(非常混乱,大多数时间形同虚设,偶尔用到却让人伤透脑筋)。

使用 chmod 命令更改文件的权限,使用 chown 来更改文件的归属。例如:

chmod 755 xxx
chmod a+x xxx
chown user:group xxx  #用来更改文件的归属用户,也可以同时更改其归属群组
chgrp   group  xxx    #用来更改文件的归属群组

上面命令中的 755 和 a+x 是两种类型的表达式

我们将在“权限管理”一节中详细介绍

执行命令的权限

有一些命令,普通用户也可以执行,但是只有 root用户 才能执行成功,这是为什么呢?

例如在系统中增加一个新用户 useradd,我们看看这个命令的程序文件

ls -l /usr/sbin/useradd     

-rwxr-xr-x 1 root root 56156 2006-04-03 21:37 /usr/sbin/useradd

所有的用户都可以执行?

这是因为, useradd 命令是修改 /etc/passwd 文件的一个工具,来看看这个文件:

ls -l /etc/passwd

-rw-r--r-- 1 root root 1835 2006-06-24 17:58 /etc/passwd

原来只有 root用户 才能写入修改结果,非 root用户 执行 useradd 命令当然不会有结果。

用户

在 Linux 系统中,有两种用户:普通用户、root用户

root用户拥有对系统的完全控制权。实际上这没有看上去那样的美妙,你必须对自己的行为负全部的责任。Linux 继承了 Unix 的设计哲学:系统毫无保留的执行你下达的命令,哪怕这个命令是“向我开炮!”

普通用户只可以作系统允许的事情。尽管可以执行大多数命令,但是 root 专有的命令却不能成功的执行,因为这些命令往往关联着只有 root 才可以处理的文件。也就是说,普通用户通常只可以处理自己 $HOME 目录下的文件。详见 “执行命令的权限”一节

而作为 root用户,可能会因为误操作给系统带来破坏;作为普通用户,可以作的事情又太少了点。

执行命令的身份

默认情况下,您的命令提示符末位为 $ ,这表示您将以普通用户的身份执行命令。

您可以使用 su (switch user)这个命令来切换其它用户。

例如 su root ,切换到 root用户(如果 su 命令后面没有参数,那么这个命令默认切换到 root用户)。

当您执行 su 这个命令,系统会提示您输入密码,请输入管理员的密码。这个时候,您会发现命令提示符末位变成了 # ,您将以 root用户 的身份执行命令。

许多 Linux 系统默认会随机设定系统的 root密码,这样更安全一些,这个时候您可以执行 sudo 命令,输入当前用户密码后,暂时以 root用户 的身份执行命令。(前提是 sudoer 列表中要包含您的 ID)

提示:使用 visudo (需要 root权限)可以将普通用户加入到 sudoer 列表中。

但即便是用 sudo 来执行,也不能保证系统不会在您的误操作下一命呜乎,更安全的办法是直接赋与用户某种操作的权限。

gpasswd -a user audio

这个命令将 user 加入到 audio 群组,您拥有了使用音频设备的权限。

事实上,Linux 中一切皆文件,包括设备文件。

ls -l /dev/sound       

crw-rw---- 1 root audio 14,  4 10-04 09:41 audio
crw-rw---- 1 root audio 14,  3 10-04 09:41 dsp
crw-rw---- 1 root audio 14,  2 10-04 09:41 midi
crw-rw---- 1 root audio 14,  0 10-04 09:41 mixer
…………

可以看到,和音频有关的设备文件,除了 root用户 可以使用,audio群组 中的用户也可以使用。

群组

群组分为两种,主组和辅组。在 /etc/passwd 文件中,与用户相关联的是主组,每个用户只可以加入一个主组;/etc/group 文件中则记录了每一个辅组所包含的用户,同一个用户可以被多个辅组所包含。

这样看起来有点乱,但却可以提供更大的灵活性。例如:

crw-rw---- 1 root audio    /dev/sound/audio
brw-rw---- 1 root optical  /dev/cdrom

先假设一名用户只可以属于一个群组:你是系统管理员,你管理的用户要求听点音乐,你把他加入了 audio组;于是该用户把 CD 放进了光驱,结果一点反映也没有,于是为了让他使用 cdrom,不得不让他拥有 root权限,你将不能防范他可能作出的破坏。

而一名用户可以属于多个群组,能够很好的解决这个问题:你可以让可以用户既属于 audio群组,又属于 optical群组,这样他就可以用 cdrom 来听音乐,却没有 root权限。