## 第 13 章 基础知识
**目录**
[](ch13.html#id3059398)
[Shell](ch13s02.html)
[命令](ch13s03.html)
[Linux 程序、进程](ch13s04.html)
[路径](ch13s05.html)
[软件](ch13s06.html)
[配置方式](ch13s07.html)
[隐藏文件](ch13s08.html)
[文件类型](ch13s09.html)
[权限](ch13s10.html)
[执行命令的权限](ch13s10.html#rightofcom)
[用户](ch13s11.html)
[执行命令的身份](ch13s11.html#id3060851)
[群组](ch13s11.html#id3060979)
## Shell
可能您早已能够熟练的使用 GUI(图形用户界面),例如您可以使用鼠标双击一个图标,来打开或者执行它。
我们来看这个过程: 您使用鼠标定位桌面上的一个程序图标,按下左键两次。系统读取鼠标指针的位置,并且判断该位置下图标的涵义,根据预设的双击动作,运行程序或者打开文件。
这一套 GUI 系统,便是一种 Shell,它的作用是实现人机交互。如果我们不能够控制电脑,那么电脑还不如电视机好玩,不是么?电视机也可以选择频道(电视机的遥控器,也是一种人机交互的界面,不过相对于电脑,确实是相当简单了)
易于上手、界面直观是 GUI 的优点,但是 GUI 并不意味着简单!或许您有类似经历: 桌面上有几十个程序的启动图标,也知道它们的名字,但是翻出一个来,并不是一件轻松的事情。
我的 Windows 系统中,桌面上摆满了各种图标,每当启动一个程序的时候,我都很是困扰。后来尝试了 音速启动 这类程序启动管理器,效果却不遂人意。[[18](ch13s02.html#ftn.id3059423)]
在 Linux 下,所有的程序都可以通过命令运行。虽然 Linux 也有 GUI,但是它并不比 Windows 的 GUI 更优秀!上面只是简单的介绍了 CLI(命令行界面)相对 GUI 的优越之处,使用 CLI 还有更多的好处,您会慢慢体会到的。
当然了,在您的印象中,CLI 一定非常的不友善,缺少亲和力,冷漠而拒人于千里之外……您和 CLI 之间甚至有代沟的存在
* * *
> [[18](ch13s02.html#id3059423)] 在我的不懈努力下,这个难道最终得到了解决: 将快捷方式名称简化,放到特定目录下,使用 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](https://box.kancloud.cn/2015-10-12_561bcb76795ae.png)](ch13s03.html#base11) 主语,Linux 命令的执行者当然是用户,所以主语一概省略。
> [![3](https://box.kancloud.cn/2015-10-12_561bcb94ee26f.png)](ch13s03.html#base13) 一个动词,作为谓语而存在。Linux 命令中,这一部分是必须的。这一部分也是不同命令之间最根本的区别方式,所以它通常作为命令名,写在最前面。键入 date 命令,您可以查看当前的时间日期。
> [![2](https://box.kancloud.cn/2015-10-12_561bcb768596e.png)](ch13s03.html#base12) 状语,用来修饰谓语。与之相对应,Linux 命令可以使用选项来精细调节程序的行为。为了与命令的操作对象相区别,选项前通常要加 - 或者 -- 符号。原则上,在命令名之后,选项的位置可以随意,但是为了养成一个良好的习惯,我们建议您在命令名后直接跟选项。
> [![4](https://box.kancloud.cn/2015-10-12_561bcb9508b82.png)](ch13s03.html#base14) 这两个部分都是宾语,它们是命令的操作对象。大部分的命令只有一个操作对象,也有一些命令是双宾语结构的,具有一个直接宾语和一个间接宾语。比如 拷贝 这个命令 cp (copy)[[19](ch13s03.html#ftn.id3059634)]
**分隔符. ** 我们的汉语是象形文字,没有分隔符。但是所有的拼音文字中都用空格作为分隔符,来分隔单词。Linux 命令中同样使用空格作分隔符。
上面的那句话,翻译成 Linux 的命令,应该是这个样子的:
```
推荐 --郑重的 您 Linux
```
> [![1](https://box.kancloud.cn/2015-10-12_561bcb76795ae.png)](ch13s03.html#base15) (按照传统,“-”后跟选项缩写,“--”后跟选项全称。不过也有例外)
哈,Linux 的命令也蛮简单吧?
* * *
> [[19](ch13s03.html#id3059634)] **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 章 _软件管理_](ch16.html "第 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](ch13s07.html#ftn.id3060298)]
如果只是要修改某一常用选项,而且时常修改,比如主机的 IP地址。使用文本编辑器,您要找到相应的配置文件,还要在配置文件中找到相应的选项,会浪费掉您的时间和耐性。
图形配置工具经常会受各种因素制约,比如网络服务器中不提供图形服务,图形界面不够稳定……这时,您可以使用命令行的配置工具来完成这些工作。
例如: 修改主机 IP地址,可以使用 ifconfig 这个程序,执行下面的命令:
```
ifconfig eth0 192.168.0.1
```
* * *
> [[20](ch13s07.html#id3060298)] 在以后的章节中,如果我们提示您修改某一文件,例如 `/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](https://box.kancloud.cn/2015-10-12_561bcb76795ae.png)](ch13s09.html#base21) 其中要特别留意的是第一列:
| | |
| --- | --- |
| - | 普通文件 |
| d | 文件夹 |
| l | 符号链接 |
| b | 块设备文件 |
| c | 字符设备文件 |
| s | 套接文件 |
| p | 管道文件 |
> [![2](https://box.kancloud.cn/2015-10-12_561bcb768596e.png)](ch13s09.html#base22) 剩下的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 是两种类型的表达式
我们将在[“权限管理”一节](ch17s08.html "权限管理")中详细介绍
### 执行命令的权限
有一些命令,普通用户也可以执行,但是只有 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` 目录下的文件。详见 [“执行命令的权限”一节](ch13s10.html#rightofcom "执行命令的权限")
而作为 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权限。
- 开源世界旅行手册
- 授权
- 致谢
- 序言
- 更新纪录
- 导读
- 如何写作科技文档
- 部分 I. 气候
- 第 1 章 GUI? CLI?
- 第 2 章 UNIX 缩写风格
- 第 3 章 版本号的迷雾
- 第 4 章 Vim 还是 Emacs
- 第 5 章 DocBook 还是 TeX
- 第 6 章 完全用 Gnu/Linux 工作
- 第 7 章 病毒
- 第 8 章 磁盘 分区
- 第 9 章 文件系统
- 第 10 章 发行版介绍
- 第 11 章 编程语言
- 第 12 章 无根的根:无名师的 Unix 心传
- 部分 II. 地理
- 第 13 章 基础知识
- 第 14 章 命令系统
- 第 15 章 基本系统
- 第 16 章 软件管理
- 第 17 章 核心工具集
- 第 18 章 编译工具链
- 第 19 章 图形界面
- 第 20 章 国际化
- 第 21 章 内核
- 第 22 章 Grub
- 第 23 章 服务器
- 第 24 章 Vim 编辑器
- 第 25 章 Emacs 入门
- 第 26 章 正则表达式
- 第 27 章 docbook 指南
- 第 28 章 Git 版本控制系统
- 第 29 章 ConTeXt 入门指南
- 部分 III. 景观
- 第 30 章 终极 Shell -- ZSH
- 第 31 章 完美工作站 Archlinux
- 第 32 章 组织你的意念:Emacs org mode
- 第 33 章 Zsh+screen
- 第 34 章 gentoo stage3
- 第 35 章 硬件问题
- 第 36 章 网络设置
- 第 37 章 自制 LiveCD
- 第 38 章 awesome
- 第 39 章 openbox 工作环境
- 第 40 章 Emacs muse
- 第 41 章 写作工具链
- 第 42 章 使用 lftp
- 第 43 章 Firefox 使用技巧
- 第 44 章 FVWM
- 部分 IV. 地质
- 第 45 章 Unix
- 第 46 章 Gnu
- 第 47 章 软件业自由之神——Richard Stallman
- 第 48 章 Linux
- 第 49 章 GNOME与KDE的战争
- 第 50 章 Vim Emacs
- 第 51 章 年代纪
- 第 52 章 我的选择
- 第 53 章 补遗