Linux命令行大全

978-7-115-30745-3
作者: 【美】William E. Shotts.Jr
译者: 郭光伟郝记生
编辑: 傅道坤

图书目录:

详情

本书对Linux命令进行了详细介绍,其中包括如何创建/删除文件、目录、维护符号连接的工具程序(symlinks),以及如何使用命令对系统进行管理,如何使用标准输入/输出、重定向以及管道,如何使用Vi编辑文件,以及如何编写shell脚本等知识。

图书摘要

版权信息

书名:Linux命令行大全

ISBN:978-7-115-30745-3

本书由人民邮电出版社发行数字版。版权所有,侵权必究。

您购买的人民邮电出版社电子书仅供您个人使用,未经授权,不得以任何方式复制和传播本书内容。

我们愿意相信读者具有这样的良知和觉悟,与我们共同保护知识产权。

如果购买者有侵权行为,我们可能对该用户实施包括但不限于关闭该帐号等维权措施,并可能追究法律责任。



William E. Shotts, Jr.,作为一名软件开发人员和狂热的Linux用户已经有15年之久。他在软件开发领域有广泛的背景,先后涉及过技术支持、质量保证和文档编写等工作。他还是LinuxCommand.org网站的创始人,该网站是一个Linux教育和宣传网站,以新闻、评论和为人们使用Linux命令行提供广泛支持而见长。

本书卖点

专业书评

诚实地讲,这是我发现的最佳Linux入门指南,没有之一。

——Linux Journal

当读者认真学习完本书之日,也即成为UNIX命令行大师之时。

——ITworld

最平易近人、易于阅读的Linux命令行大全。

——Linux Magazine

如果你是一名打算掌握命令行操作的新手,本书无疑是最佳的读物。

——Ubuntu Musings

本书是最适合Linux新手快速入门以及迅速提升的读物,它并非呆板地讲解这些命令行工具,而是会深入分析命令行的理论基础以及工作机制。对于想“知其然,知其所以然”的读者来说,本书是你的不二之选。

——Nicholas C. Zakas, Web开发工程师,《Maintainable JavaScript》等畅销书作者


Copyright © 2012 by William E. Shotts, Jr. Title of English-language original: The Linux Command Line: A Complete Introduction, ISBN 978-1-59327-389-7, published by No Starch Press. Simplified Chinese-language edition copyright © 2012 by Posts and Telecom Press. All rights reserved.

本书中文简体字版由美国No Starch出版社授权人民邮电出版社出版。未经出版者书面许可,对本书任何部分不得以任何方式复制或抄袭。

版权所有,侵权必究。


本书主要介绍Linux命令行的使用,循序渐进,深入浅出,引导读者全面掌握命令行的使用方法。

本书分为四部分。第一部分开始了对命令行基本语言的学习之旅,包括命令结构、文件系统的导引、命令行的编辑以及关于命令的帮助系统和使用手册。第二部分主要讲述配置文件的编辑,用于计算机操作的命令行控制。第三部分讲述了从命令行开始执行的常规任务。类UNIX操作系统,比如Linux,包含了很多“经典的”命令行程序,这些程序可以高效地对数据进行操作。第四部分介绍了shell编程,这是一个公认的初级技术,并且容易学习,它可以使很多常见的系统任务自动运行。通过学习shell编程,读者也可以熟悉其他编程语言的使用。

本书适合从其他平台过渡到Linux的新用户和初级Linux服务器管理员阅读。没有任何Linux基础和Linux编程经验的读者,也可以通过本书掌握Linux命令行的使用方法。


我要感谢以下朋友帮助促成此书。

首先要感谢的是启发我的人:Wiley出版社的组稿编辑Jenney Watson,是她最初建议我写一本与shell脚本相关的书。尽管Wiley出版社最终没有接受我的书稿,但它成为本书的基础。John C. Dvorak,一位著名的专栏作家和权威人士,给了我重要的建议。在他的视频播客“Cranky Geeks”的一个片段中,他描述了这样一个写作过程:“哇喔!每天写200字,一年之后,你将拥有一部小说”。这个建议促使我每天写一页,直到完成本书。Dmitri Popov在Free Software Magazine写了一篇名为Creating a book template with Writer的文章,它启发我使用OpenOffice.org Writer来排版文字,事实证明,结果还不错。

其次感谢那些帮助我制作本书最初的、可自由分发的电子版本(可在LinuxCommand. org找到)的志愿者:Mark Polesky非常出色地审阅和检验了本书的文字;Jesse Becker、Tomasz Chrzczonowicz、Michael Levin和Spence Miner也审阅和复审了部分文字;Karen M. Shotts花了很多时间编辑我的书稿。

还要感谢在No Starch出版社长时间辛苦工作,保证本书出版、正常发售的朋友,他们是产品经理Serena Yang、编辑Keith Fancher和No Starch出版社的其他员工。

最后要感谢LinuxCommand.org的读者,他们给我发了很多有价值的邮件。是他们的鼓舞让我感觉到,我真的是在做一件非比寻常的事情。


我想给大家讲一个故事。故事内容不是Linus Torvalds在1991年怎样编写了Linux内核的第一个版本,因为这些内容你可以在很多Linux图书中找到。我也不想告诉你,更早之前,Richard Stallman是如何开始GNU项目,设计了一个免费的类UNIX操作系统。那也是一个很有意义的故事,但大多数Linux 图书也讲到了它。我想给大家讲一个如何才能夺回计算机控制权的故事。

在20世纪70年代后期,我刚开始和计算机打交道时,正在进行着一场革命,那时的我还是一名大学生。微处理器的发明使得你我这样的普通人真正拥有一台计算机成为可能。今天,人们难以想象,只有大公司和强大的政府机构才能够使用计算机的世界,是怎样的一个世界。让我说,你其实想象不出多少来。

如今,世界已经截然不同。计算机遍布各个领域,从小手表到大型数据中心,以及介于它们之间的每一样东西。除了随处可见的计算机之外,我们还有一个无处不在的连接所有计算机的网络。这开创了一个奇妙的个人授权和创作自由的新时代。但是在过去的二三十年里,一些事情在悄然发生。一个大公司不断地把它的控制权强加到世界绝大多数的计算机上,并且决定你对计算机的操作权力。幸运的是,世界各地的人们正在努力进行抗争。他们通过自己编写软件来争夺自己计算机的控制权。他们创造了Linux!

很多人提到Linux的时候都会讲到“自由”,但是并不是所有人都明白这种自由到底意味着什么。自由就是能够决定计算机可以做什么,而获得这种自由的唯一方法就是知道你的计算机正在做什么;自由就是计算机没有秘密可言,只要你仔细地寻找,就能了解其全部内容。

读者之前应该注意到,电影中的“超级黑客”,就是那些能够在30秒内入侵到超级安全的军方计算机里的家伙,都是坐在计算机旁,从来不碰鼠标的。这是因为电影制片人意识到,我们人类从本能上会明白,能够让计算机执行任何任务的唯一途径,是通过键盘输入命令来实现的。

现在,大多数计算机用户只熟悉图形用户界面(GUI),并且产品供应商和专家还在不停地灌输一种思想,那就是命令行界面(CLI)是一种很糟糕的东西,而且已经过时。这是很不幸的,因为一个好的命令行界面是一种很神奇的人机交互方式,就和我们采用书信进行交流一样。据说“图形用户界面能让简单的任务更简单,而命令行界面能够处理复杂的任务”,这句话在今天看来仍然是正确的。

由于Linux系统参照了UNIX系列操作系统,它分享了UNIX系统丰富的命令行工具。UNIX系统在20世纪80年代早期就占据了主流地位(尽管它只是在20世纪70年代才开发出来),结果,在普遍采用图形用户界面之前,开发了一种广泛使用的命令行界面。事实上,Linux开发者优先使用命令行界面(而不是其他系统,比如Windows NT)的一个原因就是因为其强大的命令行界面,使“完成复杂的任务成为可能”。

这是一本全面讲述如何使用Linux命令行的图书。与那些仅涉及一个程序(比如shell程序、bash)的图书不同,本书从更广泛的意义上向读者传授如何使用命令行,它是如何工作的,它有哪些功能,以及使用它的最佳方式是什么。

这不是一本关于Linux系统管理方面的图书。任何一个关于命令行的重要讨论,都一定会涉及系统管理方面的内容,但是本书只涉及很少的管理方面的问题。本书为读者准备了其他的学习内容,帮助你为使用命令行打下坚实的基础,这可是完成一个系统管理任务所必需的至关重要的工具。

本书以Linux为中心。其他许多图书为了扩大读者群体以及自身的影响力,会在书中包含其他平台,比如通用的UNIX和Mac OS X系统。而且为了达到这个目的,它们只能“淡化”书的内容,只讲解一些通用的主题。而本书只包括当前的Linux发行版本。尽管本书95%的内容对其他类UNIX系统用户也有帮助,但是本书主要还是面向现代的Linux命令行用户。

本书适合从其他平台转到Linux的新用户阅读。这些新用户很可能原来是Microsoft Windows版本的超级用户;也可能是老板已经要求负责管理一个Linux服务器的管理员;还有可能是厌烦了桌面系统的安全问题,想要体验一下Linux系统的用户。没关系,不管你属于哪类用户,都欢迎阅读本书。

不过一般来说,Linux的启蒙学习不存在任何捷径。命令行的学习具有挑战性而且颇费精力,这倒不是因为它太难,而是它涵盖的内容太多。一般的Linux系统有上千个程序可以通过命令行使用,这点毫不夸张。你需要提醒自己的是,命令行可不是随便就能学会的。

另一方面,学习Linux命令行也非常值得。如果你认为自己已经是一名“超级用户”了,那么请注意,你可能不知道什么才是真正的“超级用户”。不同于许多其他的计算机技术,命令行的知识是经久不衰的。今天学会的技能,在10年后仍然有用。换言之,命令行是能够历经时间考验的。

如果读者没有编程经验,也不用担心,你仍然可以从本书开始学习。

本书精心编排,内容有序,就像有一位老师坐在你身旁,耐心指导你。许多作者都采用系统化的方法来讲解本书中的内容。对作者来讲,这很合理,但是对初学者来讲,则可能摸不着头脑。

本书的另一个目的是使读者熟悉UNIX的思考方式,它与Windows的思考方式大不相同。在学习的过程中,本书还将帮助读者理解命令行的工作原理和方式。Linux不仅仅是一个软件,它还是庞大的UNIX文化中的一小部分,有着自己的语言和历史。同时,我也许会说一些过激的言语。

本书分为四部分,每一部分都讲解了不同方面的命令行知识。

建议读者从头到尾地阅读本书。本书并不是一本技术参考手册,实际上它更像一本故事书:有开头,有过程,有结尾。

为了使用本书,你需要安装Linux操作系统。你可以通过两种方式来完成安装。

注意:

无论采用何种方式来安装Linux,都将需要有临时的超级用户(也就是管理员)特权来执行本书中所讲的内容。*

在安装好Linux系统之后,就一边开始阅读本书,一边练习吧。本书大部分内容都可以自己动手练习,所以坐下来,开始敲入命令并体验吧。

本书为什么不称为“GNU/LINUX”

在某些领域,称Linux操作系统为“GNU/LINUX操作系统”在政治立场上是正确的。没有一个完全正确的方式能命名它,因为它是由许多分布在世界各地的贡献者们合作开发而成的。从技术层面来讲,Linux只是操作系统的内核名字,没有别的含义。当然,内核非常重要,因为有了它,操作系统才能运行起来,但是它不能构成一个完备的操作系统。

Richard Stallman是一位天才的哲学家、自由软件运动的创始人、自由基金会创办者,他创建了自由软件项目,编写了GNU C语言编译器(GCC)的第一个版本,并且创建了GNU公用许可证(GPL)等。他坚持将Linux称为“GNU/LINUX”,为的是准确地反映GNU项目对Linux操作系统所做出的贡献。尽管GNU项目先于Linux内核出现,并且这个项目所做出的贡献得到了极高的赞誉,但是将GNU加入Linux名字里面则对其他每一个为Linux的发展做出巨大贡献的人们来说,就不公平了。除此之外,由于计算机在运行的时候首先启动内核,其他的所有软件都在其之上运行,所以本书认为“Linux/GNU”这个名字在技术上来讲更精准一些。

在目前流行的用法中,“Linux”指的是内核以及在一个典型的Linux发行版本中所包含的所有免费和开源软件,也就是说,整个Linux体系并非仅有GNU项目软件。在操作系统业界,好像更钟情于单个词的名字,比如DOS、Windows、Solaris、Iris和AIX。所以本书选择使用流行的命名规则。然而,如果读者倾向于使用“GNU/LINUX”,那么在阅读本书时,可以搜索并替换“Linux”,我不会介意的。



当谈到命令行时,我们实际上指的是shell。shell是一个接收由键盘输入的命令,并将其传递给操作系统来执行的程序。几乎所有的Linux发行版都提供shell程序,该程序来自于称之为bash的GNU项目。bash是Bourne Again Shell的首字母缩写,Bourne Again Shell基于这样一个事实,即bash是sh的增强版本,而sh是最初的UNIX shell程序,由Steve Bourne编写。

当使用图形用户界面时,需要另一种叫做终端仿真器(terminal emulator)的程序与shell进行交互。如果我们仔细查看桌面菜单,那么很可能会找到一款终端仿真器。在 KDE 环境下使用的是 konsole,而在 GNOME 环境下使用的是gnome-terminal,但是在桌面菜单上很可能将它们简单地统称为终端。在 Linux系统中,还有许多其他的终端仿真器可以使用,但是它们基本上都做同样的事情:让用户访问 shell。因为不同的终端仿真器所具有的功能特性不尽相同,因此,你可以根据自己的喜好进行选择。

现在开始吧。启动终端仿真器!运行后的终端仿真器如下所示。

[me@linuxbox ~]$

这称为shell提示符,只要shell准备接受外部输入,它就会出现。在不同的发行版中,提示符的外观可能会有所差异,但是,它通常包括username@machinename,其后是当前工作目录(长度更长一些)和一个$符号。

如果shell提示符的最后一个字符是#,而不是一个$符号,那么终端会话将享有超级用户特权。这就意味着要么我们是以根用户身份登录,要么我们选择的终端仿真器可以提供超级用户(管理)特权。

假定一切工作都很顺利,接下来尝试输入一些内容。在提示符后输入一些乱码,如下所示。

[me@linuxbox ~]$ kaekfjaeifj

由于这些命令没有任何意义,shell会让我们重新输入。

bash: kaekfjaeifj: command not found
[me@linuxbox ~]$

如果按下向上方向指示键,将会看到先前的命令kaekfjaeifj再一次出现在提示符的后面,这称为命令历史记录。在默认情况下,大部分Linux发行版本能够存储最近输入的500个命令。按下向下方向指示键,则先前的命令消失。

再次按下向上方向指示键,重新调用先前的命令,然后分别按下向左和向右方向指示键,看看如何将光标定位到命令行的任意位置。这可以让我们很容易地编辑命令。

关于鼠标与焦点

尽管shell与用户的交互全部是通过键盘来完成的,但是在终端仿真器中,也可以使用鼠标。内置到X窗口系统(驱动GUI的底层引擎)中的一种机制可以支持快速的复制与粘贴技术。如果紧按鼠标左键选中一些文本并拖动鼠标(或双击选中一个词),该文本将复制到由X维护的一个缓冲区中。按下鼠标的中间按键可以将选中的文本粘贴到光标所在的位置。你可以试一下。

不要试图使用Ctrl-C和Ctrl-V在一个终端窗口内进行复制和粘贴操作,这不起作用。对于shell而言,这些组合键在很早之前就已经赋予了不同的含义,而那时微软的Windows操作系统还没有出现。

在操作上与Windows类似的图形桌面环境(很有可能是KDE或GNOME),很可能拥有自己的焦点策略(focus policy)集合,用以通过“点击来获得焦点”。这意味着,如果一个窗口需要获得焦点(成为当前窗口),只需要点击一下即可。而传统的X窗口的行为是“焦点跟随着鼠标”,也就是说,当鼠标经过窗口时,窗口就会获得焦点。因此两者是截然不同的。如果没有点击窗口,那么它不会出现在前端,但此时它可以接受输入。将焦点策略设置为“焦点跟随鼠标”的方式会使终端窗口使用起来更容易。试一试吧,试过之后,你一定会喜欢上这种方式。你可在窗口管理器的配置程序中找到该设置。

在学习了键盘输入之后,我们来尝试几个简单的命令。首先是date命令,该命令显示当前系统的时间和日期。

[me@linuxbox ~]$ date
Thu Oct 25 13:51:54 EDT 2012

与之相关的一个命令是cal,在默认情况下,cal显示当月的日历。

[me@linuxbox ~]$ cal
   October 2012
Su Mo Tu We Th Fr Sa
   1  2  3  4  5  6
7  8  9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31

如果想要查看磁盘驱动器当前的可用空间,可以使用df命令。

[me@linuxbox ~]$ df
Filesystem      1K-blocks    Used Available Use% Mounted on
/dev/sda2       15115452  5012392  9949716  34% /
/dev/sda5       59631908  26545424  30008432  47% /home
/dev/sda1        147764    17370   122765  13% /boot
tmpfs          256856      0   256856  0% /dev/shm

同样,要显示可用内存,可以使用free命令。

[me@linuxbox ~]$ free
      total     used   free   shared   buffers   cached
Mem:   513712   503976   9736       0     5312   122916
-/+ buffers/cache:  375748  137964
Swap:  1052248    104712  947536

直接关闭终端窗口或是在shell提示符下输入exit命令,即可结束终端会话。

[me@linuxbox ~]$ exit

幕后的控制台

即使没有运行终端仿真器,一些终端会话也会在图形桌面的后台运行。这叫做虚拟终端或是虚拟控制台。在绝大多数系统中,通过依次按下Ctrl-Alt-F1键到Ctrl-Alt-F6组合键,可以访问大部分Linux发行版中的终端会话。每当访问一次会话,就会出现登录提示符,我们可以在其中输入用户名和密码。按Alt和F1~F6键,可从一个虚拟控制台转换到另一个虚拟控制台。按Alt-F7键可返回图形桌面环境。


除了在命令行进行输入操作之外,我们首先需要学习的是如何在Linux系统中导航文件系统。本章将介绍下述命令。

与Windows相同,类UNIX操作系统(比如Linux)也是以称之为分层目录结构的方式来组织文件的。这意味着文件是在树形结构的目录(有时在其他系统中称为文件夹)中进行组织的,该树形结构目录可能包含文件和其他目录。文件系统的第一个目录叫做根目录,它包含了文件和子目录。子目录里包含了更多的文件和子目录,依此类推。

需要注意的是,在Windows系统中,每个存储设备都有一个独立的文件系统树。而在类UNIX系统中,如Linux,无论多少驱动器或存储设备与计算机相连,通常只有一个文件系统树。根据系统管理员的设置,存储设备将会连接(更准确的说是“挂载”)到文件系统树的不同位置。系统管理员要负责系统的维护。

可能大部分人都熟悉用于表示文件系统树的图形文件管理器,如图 2-1 所示。需要注意的是,树通常是倒立显示的。也就是说,顶部是根目录,依次向下排列的是子目录。

图2-1 在图形文件管理器中显示的文件系统树

然而,由于命令行没有图像,若是要浏览文件系统树,就必须使用其他方法。

假设文件系统是一个迷宫,形如一棵倒置的树,并且用户处在文件系统之中。任何时刻,我们处在单个目录中,能够看到该目录中包含的文件、去往上一级目录(称为父目录)的路径,以及下一级的各个子目录。用户所处的目录叫做当前工作目录。使用pwd(打印工作目录)命令可以显示当前工作目录。

[me@linuxbox ~]$ pwd
/home/me

第一次登录系统时(或是启动终端仿真器会话时),当前工作目录被设置成主目录。每个用户账号都有一个主目录,作为普通用户操作时,这是唯一一个允许用户写文件的地方。

使用ls命令可以列出当前工作目录的文件和目录。

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

实际上,可以使用ls命令列出任何目录的内容,而不仅仅是当前工作目录。同时,它还拥有一些其他有趣的功能。我们会在第3章详细讨论ls命令。

使用cd命令可以改变工作目录(即在文件系统树的位置);只需输入cd命令,然后再输入目标工作目录的路径名即可。路径名指的是沿着分枝到达目标目录的路由。路径名分为两种:绝对路径名和相对路径名。首先来谈谈绝对路径名。

绝对路径名从根目录开始,其后紧接着一个又一个文件树分支,直到到达目标目录或文件。例如,系统里有一个目录,大多数系统程序都安装到这个目录里,该目录的路径名是/usr/bin。这就意味着根目录(在路径名中用前导斜杠来表示)中有一个目录是usr,该目录包含一个bin目录。

[me@linuxbox ~]$ cd /usr/bin
[me@linuxbox bin]$ pwd
/usr/bin
[me@linuxbox bin]$ ls

...Listing of many, many files ...

可以看到,我们已经将当前工作目录改变成/usr/bin,bin目录中包含很多文件。请注意shell提示符是如何变化的。为方便起见,工作目录名通常被设置成自动显示。

绝对路径名是从根目录开始,通向目标目录,而相对路径名则是从工作目录开始的。为了实现这个目的,它通常使用一些特殊符号来表示文件系统树中的相对位置,这些特殊符号是“.”(点)和“..”(点点)。

符号“.”代表工作目录,符号“..”代表工作目录的父目录。下面演示它们是如何工作的。让我们再次将工作目录改变成/usr/bin。

[me@linuxbox ~]$ cd /usr/bin
[me@linuxbox bin]$ pwd
/usr/bin

好的,下面来说明一下,我们希望将工作目录改变成/usr/bin的父目录,即/usr。有两种方法可以实现,一种是使用绝对路径名。

[me@linuxbox bin]$ cd /usr
[me@linuxbox usr]$ pwd
/usr

另一种是使用相对路径名。

[me@linuxbox bin]$ cd ..
[me@linuxbox usr]$ pwd
/usr

由于两种不同的方法产生同样的结果。那么我们究竟应该用哪一种方法呢?那就选择输入字符最少的吧。

同样,可以用两种方法将工作目录从/usr变到/usr/bin。我们可以使用绝对路径名。

[me@linuxbox usr]$ cd /usr/bin
[me@linuxbox bin]$ pwd
/usr/bin

我们也可以使用相对路径名。

[me@linuxbox usr]$ cd ./bin
[me@linuxbox bin]$ pwd
/usr/bin

必须在这里指出来的是,几乎在所有的情况下都可以省略“./”,因为它是隐含的。输入以下代码。

[me@linuxbox usr]$ cd bin

该代码与使用相对路径名的代码具有相同效果。一般而言,如果没有指定路径名,则默认为工作目录。

表2-1列出了一些可以快速改变当前工作目录的方法。

表2-1 cd快捷方式

快捷方式

结果

cd

将工作目录改变成主目录

cd-

将工作目录改变成先前的工作目录

cd~username

将工作目录改变为username的主目录。例如,cd~bob将目录改变成用户bob的主目录


有关文件名的一些重要说明


相关图书

Linux常用命令自学手册
Linux常用命令自学手册
庖丁解牛Linux操作系统分析
庖丁解牛Linux操作系统分析
Linux后端开发工程实践
Linux后端开发工程实践
轻松学Linux:从Manjaro到Arch Linux
轻松学Linux:从Manjaro到Arch Linux
Linux高性能网络详解:从DPDK、RDMA到XDP
Linux高性能网络详解:从DPDK、RDMA到XDP
跟老韩学Linux架构(基础篇)
跟老韩学Linux架构(基础篇)

相关文章

相关课程