第 3 章 使用 Shell

目录

3.1. Bash shell 入门
3.2. 用户和访问权限
3.3. 重要的 Linux 命令
3.4. vi 编辑器

摘要

引导 Linux 系统时,您通常会被定向到一个图形用户界面,此界面将引导您完成登录过程以及与系统的后续交互操作。图形用户界面已变得越来越重要且对用户友好,但这并不是与系统通信的唯一方式。您也可以使用面向文本的通信方式,如通常称为 shell 的命令行解释器,在 shell 中可以输入命令。Linux 提供通过图形用户界面启动 shell 窗口的选项,因此您可以方便地使用两种方式。

在管理中,基于 shell 的应用程序对于通过慢速网络链接控制计算机或在您希望作为 root 在命令行上执行任务时非常重要。对于 Linux“菜鸟”,在 shell 中输入命令可能不太习惯,但不久后您就会意识到 shell 不仅仅是为管理员而准备的,其实 shell 通常是执行日常任务的最快捷、最方便的方式。

UNIX 或 Linux 有多个 shell。SUSE Linux 中的默认 shell 是 Bash (GNU Bourne-Again Shell)。

本章介绍使用 shell 时必须了解的一些基础知识。其中包括以下主题:如何输入命令、Linux 的目录结构、如何使用文件和目录以及如何使用一些基本功能、Linux 的用户和权限概念、重要 shell 命令的概要以及 vi 编辑器(Unix 和 Linux 系统中始终可用的默认编辑器)的简短描述。


3.1. Bash shell 入门

在 Linux 中,您可以使用与图形用户界面对应的命令行,并轻松地在两者之前切换。要通过 KDE 中的图形用户界面启动终端窗口,请单击面板中的 Konsole 图标。在 GNOME 中,单击面板中的 GNOME 终端图标。

此时出现 Konsole 或 GNOME 终端窗口,窗口的第一行显示类似于图 3.1 “Bash 终端窗口示例”所示的提示符。此提示符通常显示您的登录名(在本例中为 tux)、计算机的主机名(此处为 knox)以及当前路径(本例中为您的主目录,用波浪符 ~ 表示)。当您登录到远程计算机时,您始终可以通过此信息了解到您当前在哪个系统上工作。当光标移到该提示后面时,您可以直接向所在计算机系统发送命令。

图 3.1. Bash 终端窗口示例

Bash 终端窗口示例

3.1.1. 输入命令

一条命令包含若干元素。第一个元素总是真正的命令,随后是参数或选项。通过使用 <—DelSpace,您可以输入和编辑命令。您还可以添加选项或更正输入错误。按 Enter 时将执行命令。

[Important]没有消息就是好消息

shell 并不不冗长:与某些图形用户界面不同,它在执行命令后通常不提供确认讯息。只有在出现问题或错误的情况下才会显示讯息。

使用命令来删除对象时也要牢记这点。输入 rm 之类的命令来删除文件之前,您应该知道是否确实要去除此对象:删除时系统不会询问,文件在删除后不能恢复。

3.1.1.1. 使用不带选项的命令

下面使用一个简单的示例来说明命令的结构:ls 命令,用于列出目录的内容。此命令可带选项也可不带选项。只输入 ls 命令将显示当前目录的内容:

图 3.2. ls 命令

ls 命令

与 MS Windows 不同,Linux 中的文件可带有 .txt 等文件扩展名,但扩展名不是必需的。这会导致难以区分 ls 输出中的文件和文件夹。默认情况下,您可以通过颜色来辨别:目录一般显示为蓝色,文件一般显示为黑色。

3.1.1.2. 使用带选项的命令

要获得有关目录内容的更多细节,最好使用带选项字符串的 ls 命令。选项可修改命令的工作方式,使您能够通过命令来执行特定任务。选项以连字符为前缀,通过空格与命令分隔。命令 ls -l 将显示同一目录中内容的详细信息(长列表格式):

图 3.3. ls -l 命令

ls -l 命令

每个对象名称的左侧都会显示几列有关此对象的信息。最重要的信息为:第一列显示对象的文件类型(在本例中,d 代表目录,- 代表普通文件)。接下来的 9 列显示对象的用户权限。第 11 和 12 列显示文件拥有者或组的名称(本例中为 tuxusers)。有关用户权限和 Linux 的用户概念的详细信息,请参见第 3.2 节 “用户和访问权限”。下一列显示文件大小,单位为字节。然后显示上次更改的日期和时间。最后一列显示对象名称。

如果您想要了解更多信息,您可以组合 ls 命令的两个选项并输入 ls -la。shell 此时还会显示目录中的隐藏文件,通过在前面加一个圆点来表示(例如 .hiddenfile)。

3.1.1.3. 获取帮助

任何用户都没有必要记忆所有命令的所有选项。如果您记住了命令名称但对选项不太确定,您可以先输入命令,紧接着输入一个空格和 --help。许多命令都具有此 --help 选项。输入 ls --help 可以显示 ls 命令的所有选项。

3.1.2. Linux 目录结构

shell 不提供与文件管理器中的树视图类似的目录和文件图形化概览,因此有关 Linux 系统中的默认目录结构的基础知识非常有用。您可以将目录视为存储文件、程序和子目录的电子文件夹。层次中的顶级目录是根目录,用 / 表示。从此目录可以访问其它所有目录。

图 3.4 “标准目录树节选” 显示了 Linux 中的标准目录树,其中的主目录包含示例用户 xyzlinuxtux/home 目录包含用于存储个人用户私人文件的目录。

[Note]网络环境中的主目录

如果您在网络环境中工作,您的主目录名称可能不是 /home。可将它映射到文件系统中的任何目录。

以下列表简要说明了 Linux 中的标准目录。

图 3.4. 标准目录树节选

标准目录树节选
/

根目录,目录树的起点

/home

用户的个人目录

/dev

代表硬件组件的设备文件

/etc

重要的系统配置文件

/etc/init.d

引导脚本

/usr/bin

通常可访问的程序

/bin

在引导过程初期需要的程序

/usr/sbin

为系统管理员保留的程序

/sbin

为系统管理员保留的用于引导的程序

/usr/include

C 编译器的头文件

/usr/include/g++

C++ 编译器的头文件

/usr/share/doc

各种文档文件

/usr/share/man

系统手册页

/usr/src

系统软件的源代码

/usr/src/linux

内核源代码

/tmp/var/tmp

临时文件

/usr

所有应用程序

/var

配置文件(例如从 /usr 链接的文件)

/var/log

系统日志文件

/var/adm

系统管理数据

/lib

共享库(供动态链接程序使用)

/proc

处理文件系统

/sys

system 文件系统,在其中收集内核的所有设备信息

/usr/local

本地的、与发布版无关的扩展

/opt

选件,大型附加程序包(如 KDE、GNOME 和 Netscape)

3.1.3. 使用目录和文件

要寻址某一特定文件或目录,您必须指定通向该目录或文件的路径。指定路径的方法有两种:

  • 从根目录到相应文件的完整(绝对)路径

  • 从当前目录开始的路径(相对路径)

绝对路径始终以斜线开头。相对路径的开头没有斜线。

[Note]Linux 区分大小写

Linux 在文件系统中区分大小写。例如,在 Linux 中,输入 test.txt 与输入 Test.txt 是不同的。 输入文件名或路径时请牢记这点。

要更改目录,请使用 cd 命令。将要进入的目录作为命令的选项输入。用一个圆点(.)表示当前目录。树的上一级用两个点(..)来表示。要切换到当前目录的父目录,请输入 cd ..。不要忘记在 cd 命令后面输入一个空格,以将命令和选项隔开。此时提示符显示您运行命令时所在目录的父目录的路径。要切换到比当前目录高两个级别的目录,请输入 cd ../..ls -l ../.. 列出比当前目录高两个级别的目录的内容

3.1.3.1. 文件寻址示例

第 3.1.3 节 “使用目录和文件”中的 cd 命令使用相对路径。您也可以使用绝对路径。例如,假设您要将文件从主目录复制到 /tmp 的一个子目录:

  1. 首先,通过主目录在 /tmp 中创建一个子目录:

    1. 如果当前目录不是主目录,请输入 cd ~ 切换到主目录。在文件系统中的任何位置,您都可以输入 cd ~ 进入主目录。

    2. 在主目录中输入 mkdir /tmp/testmkdir 代表 “make directory”,即创建目录。此命令会在 /tmp 目录下创建一个名为 test 的新目录。此时,使用绝对路径来创建目录。

    3. 此时要检查目录中的变化,请输入 ls -l /tmp/tmp 目录的内容列表中应出现新目录 test

  2. 接下来,在主目录中创建一个新文件并将使用相对路径它复制到 /tmp/test 目录。

    1. 输入 touch myfile.txt。带有 myfile.txt 选项的 touch 命令会在当前目录下创建一个新的空文件,名为 myfile.txt

    2. 输入 ls -l 进行检查。内容的列表中应出现新文件。

    3. 输入 cp myfile.txt ../tmp/test。这会将 myfile.txt 复制到 /tmp/test 目录,文件名不会改变。

    4. 输入 ls -l /tmp/test 进行检查。/tmp/test 目录的内容列表中应出现文件 myfile.txt

要列出其他用户主目录的内容,请输入 ls ~username。在图 3.4 “标准目录树节选”的示例目录树中,其中一个示例用户是 tux。这样,使用 ls ~tux 就会列出 tux 主目录的内容。

[Note]处理文件名或目录名中的空格

如果文件名包含空格,可在空格前面使用反斜杠(\)将空格转义或将文件名包含在单引号或双引号中。否则 Bash 会将例如 My Documents 的文件名解释为两个文件或目录的名称。单引号和双引号之间的区别在于双引号中可发生变量扩展。而单引号确保 shell 按字面查看括起来的字符串。

3.1.4. shell 的实用功能

在 Bash 中输入命令可能包含大量键入操作。以下介绍 Bash 的一些功能,这些功能可大大简化您的工作,省去大量键入操作。

3.1.4.1. 历史记录和完成

默认情况下,Bash 会“记忆”您输入的命令。此功能称为历史记录。要重复以前输入的命令,请按 键,直到先前命令在提示符处出现。您也可以按 键在先前输入的命令列表中前移。在按 Enter 键执行命令之前,您始终有机会编辑此命令,如更改文件名。要编辑命令行,只需使用箭头键将光标移至所需位置并开始键入。使用 Ctrl-R 可在历史记录中搜索。

键入文件名或目录名的前几个字母后会补全完整的名称,这是 Bash 的另一个实用功能。只需在键入前几个字母后按 →| 键即可实现此功能。一旦系统可唯一确定文件名或路径后就会立即补全该文件名或路径,并且光标移动到文件名的末端。然后您可以输入命令的下一选项(如有必要)。如果不能唯一确定文件名或路径(因为有多个文件名以这些字母开头),则只会将它们补全到之后会有多种可能的那个字母。此时再按一次 →| 键可获取可能的名称列表。然后您可以输入文件或路径的下一字母,并按 →| 键再次尝试补全。借助 →| 补全文件名和路径的同时,您可以检查您要输入的文件或路径是否确实存在(而且您可以保证拼写无误)。

3.1.4.2. 通配符

shell 的便捷之处还体现在支持路径名扩展使用通配符。通配符是可代表其它字符的字符。Bash 提供三种不同的通配符:

?

完全匹配任一字符。

*

匹配任意数目的字符。

[set]

匹配在方括号中指定的字符组中的任一字符,这里用字符串 set 表示字符组。作为 set 的一部分,您也可以使用语法 [:class:] 指定字符类别,其中类别可以是 alnumalphaascii 等。

在组的开始处使用 !^[!set])会匹配除 set 确定的那些字符以外的某个字符。

假定 test 目录包含文件 TestfileTestfile1Testfile2datafile,使用命令 ls Testfile? 则可以列出文件 Testfile1Testfile2。使用 ls Test*,列表还将包括 Testfilels *fil* 会显示所有示例文件。最后,您可以使用 set 通配符表示所有末尾字符为数字的示例文件:ls Testfile[1-9] 或使用类别 ls Testfile[[:digit:]]

四个通配符中匹配范围最广的是星号。使用它可以将某个目录内的所有文件复制到另一个目录,或通过一个命令删除所有文件。例如,使用命令 rm *fil* 可以删除当前目录中文件名包含字符串 fil 的所有文件。

3.1.4.3. 使用 Less 和 More 查看文件

Linux 包含直接在 shell 中查看文本文件的两个小程序:lessmore。不必启动编辑器来阅读 Readme.txt 之类的文件,只需输入 less Readme.txt 即可在控制台窗口中显示其中的文本。使用 Space 可以向下滚动一页。使用 Page UpPage Down 可以在文本中前后移动。要退出 less,请按 Q

除使用 less 之外,您还可以使用 more 这种较早的程序。不过,该程序使用起来不太方便,因为它不允许向后滚动。

less 程序得名于 less is more(少即是多)原则,并且还可用来方便地查看命令输出。要了解该程序的这种功能,请参见第 3.1.4.4 节 “重定向和管道”

3.1.4.4. 重定向和管道

通常,shell 的标准输出界面是您的屏幕或控制台窗口,而标准输入设备是键盘。但是,您可用 shell 的功能将输入或输出重定向到另一对象,如文件或另一命令。例如,借助 >< 符号,您可以将命令的输出转发到一个文件(输出重定向),或者将某文件用作命令的输入(输入重定向)。举例来说,若要将 ls 等命令的输出写入文件,请输入 ls -l > file.txt。这会创建一个名为 file.txt 的文件,此文件包含 ls 命令所生成的当前目录的内容列表。但是,如果已存在名为 file.txt 的文件,则此命令会覆盖现有文件。要防止这种情况,请使用 >>。输入 ls -l >> file.txt 只会将 ls 命令的输出追加到名为 file.txt 的现有文件。如果不存在此文件,则会创建它。

有时将文件用作命令的输入也很实用。例如,通过 tr 命令,您可以替换重定向自文件的字符,并将结果写入标准输出,即屏幕。假设要将上例中 file.txt 的所有字符 t 替换为 x 并将结果输出到屏幕上。输入 tr t x < file.txt 即可完成此操作。

标准错误输出和标准输出一样,都发送至控制台。要将标准错误输出重定向到名为 errors 的文件,则需要在相应命令中追加 2> errors。如果追加的是 >& alloutput,标准输出和标准错误都将保存到名为 alloutput 的文件中。

使用管线管道也是一种重定向,虽然管道的使用并不局限于文件。通过管道 (|),您可以组合多个命令,将命令的输出用作下一命令的输入。例如,要在 less 中查看内容或当前目录,请输入 ls | less。这只是在 ls 命令正常输出过长时才有意义。例如,当您使用 ls /dev 命令查看 dev 目录的内容时,您只能在窗口中看到一小部分。而使用 ls /dev | less 命令则能够查看整个列表。

3.1.5. 存档和数据压缩

您已经创建了一些文件和目录,现在该考虑一下存档和数据压缩的问题了。假定您想将整个 test 目录打包在一个文件中,以便备份到 USB 存储器或通过电子邮件发送。要执行该操作,请使用命令 tar(代表 tape archiver,即磁带存档程序)。使用 tar --help 可查看 tar 命令的所有选项。下面对最重要的一些选项进行了说明:

-c

(代表 create)创建新档案。

-t

(代表 table)显示档案中的内容。

-x

(代表 extract)对档案解包。

-v

(代表 verbose)创建档案时在屏幕上显示所有文件。

-f

(代表 file)为档案文件选择一个文件名。创建档案时,此选项总应放在最后。

要将 test 目录下的所有文件和子目录打包到名为 testarchive.tar 的档案中,请使用选项 -c-f。尽管不是必需的,但出于测试的目的,请同时添加 -v 选项,以便跟踪存档过程。在使用 cd 命令转至 test 目录所在的主目录后,输入 tar -cvf testarchive.tar test。之后,可使用 tar -tf testarchive.tar 查看档案文件的内容。test 目录及其所有文件和目录都在您的硬盘上保持不变。要对档案解包,请输入 tar -xvf testarchive.tar,但目前不要尝试。

对于文件压缩,典型的选择是 gzip 或(为了得到更好的压缩率)bzip2 只需输入 gzip testarchive.tar(或 bzip2 testarchive.tar,但本示例中使用的是 gzip)即可。通过 ls,您可以看到文件 testarchive.tar 已不复存在,取而代之的是文件 testarchive.tar.gz。这个文件要小得多,因此也更适于通过电子邮件传送或存储到 USB 存储器上。

现在,将该文件解包到先前创建的 test2 目录中。这需要输入 cp testarchive.tar.gz test2 将文件复制到该目录中。使用 cd test2 转至该目录。扩展名为 .tar.gz 的压缩档案可用 gunzip 命令解压缩。输入 gunzip testarchive.tar.gz 将生成文件 testarchive.tar,然后还需使用 tar -xvf testarchive.tar 命令抽取或执行 untar 操作。您也可以用以下命令一次完成解压缩并抽取压缩存档:tar -xvf testarchive.tar.gz(不再需要添加 -z 选项)。通过 ls,您会看到新建的 test 目录,其内容与主目录中的 test 目录的内容完全相同。

3.1.6. 清理

经过上面的速成培训,您应该对 Linux shell 或命令行的基础知识有了一定的了解。最后,您最好使用 rmrmdir 命令删除各种测试文件和文件夹,清理您的主目录。在 第 3.3 节 “重要的 Linux 命令” 中,查找最重要命令的列表及其功能的简要描述。