第 2 章 Linux基础

目前,所有分布式系统都部署在Linux系统中,对分布式系统进行的任何操作都需要使用Linux,因此 需要对Linux系统进行学习,掌握Linux的使用技能。

2.1 Linux历史

Linux是一个内核,而不是操作系统,基于Linux内核开发的Ubuntu、Fedora等才是操作系统。Linux是 由当时身为学生的Linus Torvalds于1991年开发的。二十世纪七十年代,KenThompson、 Dennis Ritchie等人在AT&T的贝尔实验室开发出Unix操作系统,Unix操作系统,是一个强大的多用户、 多任务操作系统,其支持多种处理器架构,属于分时操作系统。1984年,由于AT&T政策的改变, 在Version 7 Unix推出之后不再对学生提供源代码,为了教学的需要,Andrew S. Tanenbaum教授 开发了一个不包含任何AT&T源代码的类Unix操作系统,命名为Minix。几乎与此同时, Richard Stallman发起以创建一套完全自由的操作系统为目标的GUN项目,并创建GNU通用公共许可证 GPL(General Public License)。1991年,芬兰赫尔辛基大学的学生Linus Torvalds受到 Minix操作系统的启发基于GUN项目的gcc、bash开发了针对386机器的Lniux内核,并将其发布于网络。 此内核代码一经发出便受到大量关注,此后大量程序员参与了Linux内核代码的编写修改工作, 1994年3月,Linux1.0按照完全自由免费的协议发布,随后正式采用GPL协议。作为类Unix系统,Linux 具有与Unix系统类似的程式界面与操作方式,也继承了Unix稳定高效率的特点。但与Unix相比,Linux 支持多种硬件平台,且完全免费,用户可以免费获得和修改源代码,因此Linux逐渐取代Unix成为非常 受人欢迎的作业系统。

2.2 为什么使用Linux

Linux是一个免费的开源操作系统,用户可以免费获得源代码并按照自己的要求进行修改,且除了部分商用 版本外,大部分Linux发行版本几乎都是免费提供的。此外,Linux适用于多种硬件平台,还是一种嵌入式 操作系统。Linux支持多用户,用户对自己的文件有特殊的权利,保证各个用户之间互不影响。Linux发行 版提供了大多数的分布式软件,很多的分布式系统都是基于Linux开发的。

2.3 Linux基础操作

学习Linux前要了解进入Linux的方法,对于Windows用户,需要使用SSH客户端(如PUTTY或Xshell)登录到 Linux;对于Mac或Linux用户,可使用系统终端登录服务器ssh 登录到Linux。

登录到Linux服务器后,可以进行一系列基础操作。 想要查看当前用户可使用命令

   whoami

想要查看目前所在位置可使用命令

   pwd

查看当前目录下文件列表可使用命令

   ls

ls命令默认输出当前目录下内容,不会递归输出,默认不输出以’.’开头的隐藏文件,且默认仅输出文件名, 文件以字母顺序排序。 查看当前目录下所有按修改时间排列的文件列表具体信息可使用命令

   ls -htla 

其中,-h指以人类可读的方式显示文件的大小,如使用’M’兆字节表示大小;-t指按修改时间排序, 默认时间最新的优先排列;-l指打印除了每个文件的名称之外的其他具体信息,如文件类型、时间戳、 文件大小、所有者名称、组名、硬链接数以及文件读写权限,通常文件大小以字节计数形式输出;-a指 输出所有文件信息,包括以’.’开头的隐藏文件。

想要移动至其他目录可使用命令cd,如移动至example目录下

   cd example

想要查看帮助,如查看ls命令帮助,可使用命令

   man ls

该命令显示了Linux中ls命令的标准解释,若想获知该命令的简短帮助,可使用命令

   ls --help

除以上基本操作外,可以对Linux内的文件进行一系列操作。 创建文件夹可使用命令mkdir,如创建exmaple文件夹

   mkdir example

创建新文件可使用命令touch,如创建markword文件README

   touch README.md

重命名文件可使用命令mv,如将README.md文件重命名为README.txt文件

   mv README.md README.txt

复制文件可使用命令cp,如使用README.md文件复制一份README.txt文件

   cp README.md README.txt

删除文件可使用命令rm,如删除README.md文件

   rm README.md

删除文件夹也可使用命令rm,如删除example文件夹

   rm -rf example

其中,-r指递归删除列出的目录及其内容;-f指忽略不存在的文件和缺少的操作数,并且永远不要提示用户

Linux内对文件进行编辑需要借助文本编辑器,Linux支持的文本编辑器都是从Unix继承下来的,在使用时需要 记住常见文本编辑器命令。Linux内常用的文本编辑器主要有nanovimemacs

nano是最简单方便的文本编辑器,需要对文件README.md进行编辑使用命令

   nano README.md

使用’Ctrl+O’对文件进行保存,使用’Ctrl+X’可退出文件编辑。

Vim是一个高度可配置的文本编辑器,旨在实现高效的文本编辑。它是大多数UNIX系统上原始的vi编辑器的改 进版本。Vim通常被称为“程序员的编辑器”,对编程非常有用,但是,除用作编程外,Vim也非常适合进行各种 文本编辑, 可以进行撰写电子邮件和编辑配置文件等工作,是Linux标配的文件编辑器。 需要对文件README.md进行编辑使用命令

   vim README.md

使用vim进行文件编辑时,未编写行会显示’~‘符号,输入时左下角显示’INSERT’。保存时按Esc键进入命令 模式,输入英文冒号后输入’wq!’即可保存并退出编译。

Emacs是著名的集成开发环境和文本编辑器,被公认为是最受专业程序员喜爱的代码编辑器之一。 Emacs是Editor MACroS(编辑器宏)的缩写,它的核心是Emacs Lisp,Emacs Lisp是Lisp编程语言的一种, 具有支持文本编辑的扩展功能。Emacs的出现早于Linux,最初于1976年在MIT AI Lab的不兼容分时系统(ITS) 上作为TECO宏的集合而实现。自诞生以来,Emacs演化出了众多分支,其中使用最广泛的两种是:1984年由 Richard Stallman发起并维护至今的GNU Emacs,以及1991年发起的XEmacs。XEmacs是GNU Emacs的分支, 至今仍保持着相当的兼容性。 Emacs不仅仅是一个编辑器,也是一个集成开发环境,用户可以使用Emacs进行收发邮件,调试程序,玩游戏, 进入讨论组,浏览网站等行为,在基于编辑器的功能基础上,Emacs自行开发了一个“bourne-shell-like”的 Eshell。 需要对文件README.md进行编辑使用命令

   emacs README.md

使用’emacs’编译的文件在没有保存时左下角出现两个星号,保存时使用’Ctrl+X’调出可执行快捷键,再使 用’Ctrl+S’快捷键进行保存。退出’emacs’编译界面使用’Ctrl+X’,’Ctrl+C’快捷键进行操作。 ’emacs’提供菜单栏,可以使用’F10’进行调用。用户可使用菜单栏Help内的帮助文件Emacs Tutorial了解 Emacs的使用方式和快捷键。

2.4 Linux管道

Linux管道涉及到一些命令,以下部分的命令将来可与hadoop结合使用 cat指将每个文件(‘-’表示标准输入)或标准输入复制到标准输出,即将文件内容打印到屏幕上,类似于C语言和Python内的print函数 sort排序,合并或比较给定文件或标准输入中的所有行。 默认情况下,sort将结果写入标准输出。 uniq在给定输入中或标准输入(如果未给出任何内容)或输入名称为’-‘的情况下,写出唯一行。 grep正则表达式,在给定输入中或标准输入(如果未给出任何内容)或输入名称为’-‘的情况下找到符合某一个条件的内容。 wc计算每个给定文件中的行数,字节数,字符数目,如果没有给出文件或输入名称为’-‘,则计算标准输入中相应数目。 head打印每个文件的第一部分(默认为10行);如果没有给出文件或输入名称为’-‘,它将从标准输入中读取。 tail打印每个文件的最后一部分(默认为10行);如果没有提供文件或输入名称为’-’,它将从标准输入中读取。 tee将标准输入复制到标准输出,也可以复制到作为参数给出的任何文件。 less -f每次读一小部分数据到内存里,能使我们使用极少的系统内存浏览数据。

2.5 标准输入、输出、错误

Linux的基本逻辑为所有的东西都是文件(everthing is a file),也就是说所有的内容都可以被视为文件并都可以用cat命令打印到屏幕上。 当执行shell命令时,会默认打开3个文件,即标准输入文件、标准输出文件和错误输出文件,每个文件有对应的文件描述符来方便我们使用,以上三个文件的文件描述符分别是0,1,2,标准输入的默认情况为从键盘获得输入,标准输出的默认情况为输出到屏幕,错误输出默认情况输出到屏幕。

2.5.1 结果输出

Shell程序的输出通常包含标准输出和错误输出两种类型,标准输出是程序运行的结果,即程序设计要产生的数据;错误输出为程序运行的状态和错误消息,告诉我们程序的运行情况。 像-ls这样的命令实际上会将其运行结果发送到一个称为标准输出的特殊文件,运行的状态消息发送到另一个称为标准错误的文件中。默认情况下,标准输出和标准错误都链接到屏幕,而不保存到磁盘文件中。

2.5.2 重定向

对文件进行重定向可以改变文件的输入来源和输出地点。

对输出结果可以进行重定向,进行重定向以后的输出结果不会显示在屏幕上,而被保存在定向的文件中,这样有利于保存程序运行结果加以使用。 将标准输出重定向到新文件中,如将-ls命令标准输出重定向到output.out文件可使用命令

     ls -htla /user/bin > output.out

也可使用命令

     ls -htla /user/bin 1> output.out

使用>重定向时会判断右边的文件存不存在,如果存在的话就先删除,然后创建一个新的文件,不存在的话则直接创建,因此若将两次程序运行结果重定向至一个文件,则第一次重定向结果会被第二次结果覆盖,若想将标准输出追加到文件中,可使用命令

     ls -htla /user/bin >> output.out

将标准错误重定向至文件中,如将-ls命令标准错误重定向到ls-error.out文件可使用命令

     ls -htla /user/bin 2> ls-error.out

把标准错误追加到文件中可使用命令

     ls -htla /user/bin 2>> ls-error.out

有些时候输出的内容没有意义,不想把输出内容显示在屏幕上可以将其重定向到空设备,空设备相当于一个空树洞,向这个文件里面写入的所有内容都会丢失,输出至空设备的命令如下

     ls -htla /user/bin > /dev/null

对标准输入可进行重定向,若想使用cat命令将input.txt文件内容作为标准输入并将标准输出定向至output.out文件可使用命令

     cat > output.out < input.txt

也可使用下面命令进行相同操作

     cat > output.out 0< input.txt

若想使用cat命令从标准输入中读入内容并将标准输出定向至output.out文件可使用命令

     cat > output.out 

上述命令需要使用’Ctrl+C’结束输入。也可使用命令

     cat > output.out << end

当输入’end’时结束输入。

2.5.3 管道

从标准输入读取数据并发送到标准输出的外壳功能称为管道,如果想把上一个命令的输出结果作为下一个命令的输入可以使用管道进行操作,管道用|表示 用管道把应该显示在屏幕上的内容直接传送到wc命令的输入中的命令如下

     ls -htla /user/bin | wc