开源世界旅行手册:基础知识

Posted by Viletyy on 2019-12-28 10:28

基础知识

Shell

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

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

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

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

我的 Windows 系统中,桌面上摆满了各种图标,每当启动一个程序的时候,我都很是困扰。后来尝试了 音速启动 这类程序启动管理器,效果却不遂人意。(在我的不懈努力下,这个难道最终得到了解决: 将快捷方式名称简化,放到特定目录下,使用 Win+R 组合键呼出 运行 对话框,键入快捷方式的名称来运行该程序。比如 反恐精英 的快捷方式为 cs ,我把它放在 Windows 目录下; 运行 cs 命令,就可以去维护世界和平了。 这么多快捷方式,统统放到 Windows 目录下,非常混乱。因此,我在 D盘 建立了一个名为 path 的目录,并把它的路径加入到环境变量的 path 项中,快捷方式放在 D:\path 目录中。即便重装系统,只要在环境变量中重新加入此路径,原来的程序大多可以直接以命令来运行……我的许多朋友强烈要求我帮他们设定这种启动方式,因为这确实很方便:))

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

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

命令

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

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

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

1
command path/file

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

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

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

1
我们①郑重地②推荐③您Linux④!

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

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

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

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

④ 这两个部分都是宾语,它们是命令的操作对象。大部分的命令只有一个操作对象,也有一些命令是双宾语结构的,具有一个直接宾语和间接宾语。比如拷贝这个命令cp(copy)(cp a b 表示把文件a拷贝为文件b)(cp a /home 表示把当前目录下的a文件,拷贝到/home目录下。)(命令的不同部分使用空格分隔,连续的空格视为一个空格)

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

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

1
推荐 --①郑重地 您 Linux

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

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

Linux程序、进程

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

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

举一个例子:

1
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目录,使用相对目录来定位它 ./可执行文件

路径相关命令:

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

请尝试一下操作:

1
2
3
4
5
6
7
8
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”命令,来了解当前目录下都有哪些文件。

远程路径:

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

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

1
http://linuxtoy.org

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

1
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等等。不考虑阅读、修改配置文本所占用的时间,直接修改配置文件甚至更迅速(在以后的章节中,如果我们提示您修改某一文件,例如/etc/fstab。您可以使用任何顺手的文本编辑器打开它。)

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

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

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

1
ifconfig eth0 192.168.0.1

隐藏文件

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

您可以尝试以下操作:

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

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

文件类型

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

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

1
2
3
4
5
6
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

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

1
d①rwxr-xr-x②

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

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

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

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

权限

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

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

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

1
2
3
4
chmod 755 xxx
chmod a+x xxx
chown user:group xxx #用来更改文件的归属用户。也可以同时更改其归属群组
chqrp group xxx # 用来更改文件的归属群组

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

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

执行命令的权限

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

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

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

所有的用户都可以执行?

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

1
2
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来执行,也不能保证系统不会在您的误操作下一命呜呼,更安全的办法是直接赋予用户某种操作的权限。

1
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文件中则记录了每一个辅组所包含的用户,同一个用户可以被多个辅组所包含。

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

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

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

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


参考资料: